在上一篇中,我简单描述了内存管理的分段和分页机制,在这一篇对相关的段选择符、段描述符、页表的数据结构进行描述。
一、段选择符
段选择符是段的一个16位标识符。如下图所示,指向段描述符表中定义的段描述符。段选择符包含三个字段:请求特权级RPL(requested privilege level)、表指示标志TI(Table Index)、索引值(Indec)
RPL:提供了段保护信息。
TI:指出包含指定短描述符是表GDT和LDT。索引字段给出段描述符在GDT/LDT的索引项号。
二、段描述符
段描述符是GDT和LDT中的一个数据结构项。段描述符的长度为8字节,含有三个主要字段:段基地址、段限长和段属性。
段限长字段Limit:用于指定段的长度,处理器会把两个段限长字段组合场一个20位的值,颗粒度G指=0时,段长度Limit范围可从1B~1MB,单位是1B;如果G=1,则段长度limit范围从4KB~4GB,单位是4KB。
基地址字段Base:定义了在4GB线性地址空间中的一个段字节0所处位置。处理器把三个分立的基地址字段组合成一个32位的值。段基地址最好对齐16字节的边界以求程序有最佳性能。
段类型字段TYPE:用来指定段或门的类型、说明段的访问种类和段的扩展方向。该字段的解释依赖于描述符类型标志S指明是一个应用描述符还是系统描述符。TYPE字段的编码对代码、数据和系统描述符都不同。
描述符类型标志S:指明段描述符是系统段描述符(S=0)还是代码或者数据段描述符(S=1)。
描述符特权级字段DPL:用于指明描述符的特权级。特权级从0到3一次减低,用于扩展对段的访问。
段存在标志P:用于指出一个段是在内存中存在(P=1)还是不存在(P=0)。当P=0时,操作可以将格式标志为可用available的字段位置来保存自己的数据(例如不存在段的实际位置)。把指向这个段描述符的选择符加载进段寄存器导致产生一个段不存在异常。可以使用这个标志来控制在某一给定时段把需要的段加载进内存。,这功能为虚拟存储提供了除分页机制以外的控制。
D/B(默认操作大小/默认栈指针大小和/或上界限)标志:根据段描述符描述的是一个可执行代码段、下扩数据段还是一个堆栈段,这个标识功能不同:
可执行代码段: 此时这个标志称为D标志并用于指出该段中指令引用有效地址和操作数的默认长度。D=1标识默认值是32位地址和32位或8位的操作数;D=0,默认值是16位地址和16位或8位的操作数;
栈段(由SS寄存器指向的数据段):此时该标志称为B标志,用于指明隐含堆栈操作(PUSH、POP、CALL)时的栈指针大小。B=1,则使用16位栈指针并存放在SP寄存器中。如果堆栈段被设置成一个下扩数据段,这个B标志也同时指定堆栈段的上界限。
下扩数据段:此时该标志称为B标志,用于指明堆栈段的上界限。B=1,堆栈段上界限是0XFFFFFFFF(4GB);B=0,堆栈段的上界限是0xFFFF(64KB)。
颗粒度标志G:该字段用于明确段限长字段Limit值得单位。如果颗粒度胺标志为0,则段限长度单位是字节,如果设置了颗粒度,则段限长度使用4KB为单位。
可用和保留位:段描述符的di2个双字位20可供操作系统软件使用,位21时保留位并应该总是0.
三、页表
页目录和页表的表项格式如下:其中31~12含有物理地址的高20位,用于定位物理地址空间的一个页面(页帧)的物理基地址。表项的低12位含有页属性信息。
P:位0时存在标志,用于指明表项对地址转换是否有效。P=1,有效;P=0无效,那么除了表示表项无效外,其余位可供程序自由使用。
R/W:位1时读/写标志。R/W=1表示页面可以被读、写或执行。R/W=0,表示页面只读或可执行。
当处理器运行在超级用户特权级的时候,R/W位不起作用。R/W位对其所映射的所有页面有效。
U/S:位2是超级用户标志。U/S=1,那么运行在任何特权级的程序都可以访问页面。U/S=0,那么页面只能被超级用户权限访问。U/S位对其所映射的所有页面有效。
A:位5是已访问标记。当处理器访问页面表项映射的页面时,页表表项的这个标志就会置1.
D:位6是页面已被修改标志。当处理器对一个页面执行写操作时,就会设置对应页表项的D标志。
AVL:保留段