操作系统重要数据结构

段选择符


这里写图片描述

  • 请求特级权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位图基地址字段
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章