- 内存地址
logical address
地址的逻辑表示,为 段地址+段内偏移 的表达形式
linear address
从0开始的连续地址空间。线性地址空间可划分成多个逻辑段。
physical address
实际的物理内存地址。
-
分段
- Segment Descriptor
段地址是段描述符中的一项,完整的段描述符(Segment Descriptor)格式如下:
- Segment Descriptor Table
segement descriptor保存在segment descriptor table中,linux中存在两种sdt:
GDT,通常全局仅有一个(每个cpu一个)。address/size存在gdtr中
LDT,每个进程可以有一个,address/size存在ldtr中
一个LDT在GDT中有一个对应的项(Local Descriptor Table Descriptor)
- Segment Selector
段标识(segment selector)有16bit,如下:
处理器以下6个段寄存器保存segment selectors.
cs The code segment register, which points to a segment containing program
instructions
ss The stack segment register, which points to a segment containing the current
program stack
ds The data segment register, which points to a segment containing global and
static data
es general purpose
fs general purpose
gs general purpose
- 逻辑地址转化流程
取段寄存器之得到 segment selector,根据其中的ti,index从对应的descriptor table中,从gdtr/ldtr指向的table读取sement descriptor, 根据descriptor中的base获得段基准地址,加上段偏移获得线性地址。
为了加速地址转化,80X86处理器为每个段寄存器提供8字节的附加寄存器保存对应的segment descriptor。
- linux segmentation
Linux并不使用segment进行地址分段,linux中segment的基地址都是0。
Linux不同进程就可以共享相同的user code segment, user data segment, kernel code segment, kernel data segment。其descriptor保存在GDT中。
GDT默认存在一个LDT Descriptor,此LDT是所有进程共享的。进程可以请求创建新的LDT。
-
分页
- page/page frame
为了有效的实现线性地址到物理地址的映射,linux使用page/page frame。page是一块连续的线性地址空间,page frame是同样大小的连续物理地址空间。
Linux为每个进程维护一个page到page frame的映射表page table。为了减小page table的大小,优化为二级结构 page directory--> page table。
每个进程需要有一个page directory, page table仅在实际需要时创建。
- 线性地址到物理地址
cr3寄存器保存了进程Page Directory的物理地址。
- 物理内存分部
linux kernel is loaded to 0x00100000,(second megabyte)
- 进程页表
The linear address space of a process is divided into two parts(for 32bit processor)
• Linear addresses from 0x00000000 to 0xbfffffff can be addressed when the process runs in either User or Kernel Mode.
• Linear addresses from 0xc0000000 to 0xffffffff can be addressed only when the process runs in Kernel Mode.
每个进程的
0xc0000000以上页表内容相同
- page frame及内存管理
参见<understanding the linux kernel> - memory management
- Linux页面回收与反向映射机制