1. GDT and LDT

GDT(R)=Global Descriptor Table(Register)

LDT(R)=Local Descriptor Table(Register)

GDT和LDT是Intel x86为实现段保护机制采取的方法,而GDTR和LDTR就是存放了指向GDT和LDT的两个寄存器。众所周知,Intel x86架构提供了段和页两种保护机制,虽然linux逻辑上仅仅采用了它的页保护机制,但是MMU规定了只要OS采取了保护机制,就必须都要follow两种。

2. 段寄存器和段描述符

举个例子,CS/DS etc都是段寄存器。在i386以前,段寄存器存放的是基址;然而,在i386出现以后,它们存放的是段描述符在GDT或LDT的偏移,核心根据偏移取得段描述符;每个描述符由8个字节组成,是对该程序段的详细描述。

3. linux中的GDT和LDT使用

GDT的0和1是保留的;2和3是核心空间的代码段和数据段描述;4和5是用户空间的代码段和数据段描述。也就是说,所有的用户空间进程都共享4和5;每个用户空间进程虽然有自己的LDT表,但是一般而言,都不使用该表。唯一的例外是,当跑Wine和虚拟Dos程序时,LDT会被使用。

4. PD/PT/P

也叫页目录/页表/页。页目录/页表的表项也叫PDE/PTE。每个页目录的起始指针存放在CR3寄存器中;CR0中有一位用来控制页机制的打开/关闭;CR4中有一位用来控制PAE的打开/关闭。

PAE是Intel为了让i386支持更大的内存引入的机制。正常情况i386的地址总线和ALU的宽度是相等的,都为32位,所以正常可以寻址4G;为了扩充内存容量,Intel从petium pro后支持36位的地址总线(注意ALU仍然是32位),相应的MMU页式管理机制也会变化。

5. page结构

page结构用来描述系统中的物理页面,而mem_map是一个page结构数组,用来描述所有的物理内存,每个页面对应于mem_map的一个成员;它的size是静态定义好了的,正比于系统的物理内存size。

Advertisements