段选择符
- 请求特级权RPL(Requestd Privilege Level)
- 提供段保护信息,在特级权之间的切换
- 指示标志TI(Table Index)
- 0:在GDT中查找;1:在LDT中查找
- 索引号
- 在描述符表中的偏移位置
控制寄存器CR0~CR3
- CR0中协处理器控制位
- 扩展类型位ET(Extension Type)。1:存在80387协处理器;0:存在80287协处理器(Linux-0.11);
- 任务切换位TS(Task Switched)。该标志用于推迟保存任务切换时的协处理器内容,直到新任务开始实际使用协处理器时。
- 仿真(EMulation)位。1:不存在内部或外部的协处理器;反之存在。
- 监控协处理器MP(Monitor Coprocessor或Math Present)标志,用于控制WAIT/FWAIT指令与TS标志的交互作用。0:TS标志不会影响WAIT执行。
- CR0中保护控制位
- 启用保护PE(Protection Enable)位。1:开启保护模式(同时开启分段模式,其实就是高级的分段,了解原理就明白了);0:进入实地址模式。
- 分页PG(paging)位。1:开启分页模式,此时PE必须为1;0:关闭分页模式。
- 写保护WP(Write Protect)位。1:处理器禁止超级用户程序向用户级只读页面执行写操作;0:可以写。
- 协处理器错误(Numeric Error)标志。1:启用X87错误协处理器错误内部报告机制;0:使用PC机形式的X87协处理错误报告机制。
- CR2和CR3
- CR3和CR2用于分页机制。CR3含有存放页目录表页面的物理地址,因此也被称为PDBR。因为页目录表页面是页对齐的,所以只有高20位有效。
- CR2用于出现页面异常时报告出错信息。在报告页面异常时,处理器会把引起异常的线性地址存放在CR2中。
页目录、页表项格式
- 存在(Present)标志。1:表示页面有效;0:表示无效;
- 读/写R/W标志。1:页面可以被读写执行;0:页面只读或执行。(只对级别3有效);
- 用户/超级用户U/S标志。1:运行在任何特权级的程序都可以访问该页面;0:只能被0、1或2特权级的程序访问。
段描述符
段限长字LIMIT(Segment limit field)
段限长Limit字段用于指定段的长度。处理器会把段描述符中两个段限长字段组合成一个20位的值。如果颗粒度标志G=0,则段长度Limit范围从1B到1MB,单位是BYTE;如果G=1,则段长度Limit范围从4KB到4GB,单位是4KB。
根据段扩展方向标志E,确定方向是向上(0x0~段限长)还是向下(段限长~0xFFFF或0xFFFFFFFF)。基地址字段BASE(Base address field)
处理器会把3个分立的基地址字段组合形成一个32位的值。段基地址应该与16BYTE边界对齐。
描述符类型标志S(Descriptor type flag)
S=0:代码段;S=1:数据段。
描述符特权级字段DPL(Descriptor privilege level)
值为0~3,特权级从高到低。
段存在标志P(Segment present)
段存在标志P指出一个段是在内存中(P=1)还是不在内存中(P=0)。
D/B(Default operation size/default stack pointer size and/or upper bound)
- 对于是可执行代码段。这个标志称为D标志,用于指出该段中的指令引用的有效地址和操作数默认长度。1:默认32为地址和32(8)位的操作数;0:默认值16位地址和16(8)位操作数。
- 对于是栈段。此时称为B标志,用于指明隐含堆栈操作时的指针大小。1:32位指针并存放在ESP中;0:16位指针并存放在SP中。
- 下扩数据段。此时称为B标志,用于指明堆栈段的上界限。1:上界限为0xFFFFFFFF(4GB);0:上界限为0xFFFF(64KB)。
颗粒度标志G(Granularity)
该字段用于确定段限长字段Limit值的单位。如果为0,段限长的单位是字节;1,段限长单位是4KB。若G=1,那么当使用段限长来检查偏移地址时,并不会去检查偏移地址的低12位。
可用和保留比特位(Available and revserved bits)
段描述符第二个双字的位20可供系统软件使用;位21是保留位并应该总是设置为0.
代码段和数据段描述符
lgdt和sgdt用于访问GDTR寄存器;lldt和sldt用于访问LDTR寄存器。
lgdt使用内存中的一个6字节操作数来访问GDTR寄存器:头两个字节代表描述符表的长度,后4个字节是描述符表的基地址。
lldt使用内存中的一个2字节操作数访问LDTR寄存器:这个操作数表示GDT中的一个描述符项选择符。该选择符对应的GDT表中的描述符应该对应一个局部描述符。
TSS段描述符
- TYPE中的B=1:任务处于忙状态(正在执行/被挂起);B=0,任务处于非活动。
TSS段格式
动态字段,当任务切换而被挂起时,处理器会自动更新动态字段内容。
- 通用寄存器字段。EAX、ECX、EDX、EBX、ESP、EBP、ESI和EDI;
- 段选择符字段。ES、CS、SS、DS、FS和GS;
- 指令指针EIP字段。
- 先前任务连接字段。
静态字段。这些内容是在任务被创建时设置的,不改变。
- LDT段选择符字段;
- CR3控制寄存器字段;
- 特权级0、1和2的堆栈指针字段;
- 调试陷阱T标志字段;
- I/O位图基地址字段