控制寄存器和系统地址寄存器
![](https://images2017.cnblogs.com/blog/1282980/201712/1282980-20171210153207177-1003630140.png)
cr0 指示cpu工作方式的控制位 包含启用和禁止分页管理机制的控制位 包含控制浮点协处理器操作的控制位 注意必须为0的位
cr2和cr3 分页管理机制使用
1.保护控制位
cr0中位0 pe表示 为0实模式 为1 保护模式
位31 pg表示 为0 禁用分页 为1启用分页管理机制
注意1.不存在 pe为0 且pg为1的情况 即 实模式下开启分页机制
2.改变pg位 只有当所执行的程序的代码和至少有一部分数据在线性地址空间和物理地址空间具有相同的地址的情况下 才能改变pg位的值
2.协处理器控制位 cr0中的位1-位4分别标记mp em ts et 具体略
3.cr2和cr3
控制寄存器由分页管理机制使用
cr2用于发生页异常时报告出错信息 当发生页异常时 cpu把引起异常的线性地址保存到cr2中
cr3用于保存页目录表的物理地址 目录为页对其齐 所以仅仅高20位是有效的 低12位保留不用
mov重置cr3的值 会导致分页机制高速缓冲区的内容无效 用此方法 可以在启用分页机制之前 就把pg位置为之前 预先杀心分页机制的告诉缓存
实模式下可以设置cr3 即初始化分页机制
任务切换 cr3要被改变 如果新任务中cr3的值与原任务中cr3的值相同(两个任务共享页表) 那么cpu不刷新分页高速缓存 以便当任务共享页表时有比较快的执行速度
二 系统地址寄存器
GDTR LDTR IDTR TR
全局描述符表gdt ldt 和idt 等都是保护方式下非常重要的特殊段 包含有位段机制所用的重要表格
cpu采用一些特殊的寄存器保存这些段的基地址和界限 称为系统地址寄存器
GDTR 48位长 其中32位为基地址 16位为界限
由于gdt本身不能由在gdt表中的描述符来描述 所以cpu需要采用GDTR位gdt这一特殊的系统段提供一个伪描述符
![](https://images2017.cnblogs.com/blog/1282980/201712/1282980-20171210153212927-1150571979.png)
段界限以字节为单位 由于段选择子中只有13位作为索引 每个描述符长度为8个字节 所有用16位的界限够了。
通常对于含有N个描述符的描述符表的段界限设为8*N-1
结构类型定义 伪描述符
PDESC STRUC LIMIT DW 0 ;段界限 16位
BASE DD 0 ;段基地址 GDT表的首地址 32位 PDESC ENDS
2.局部描述符表寄存器LDTR
此寄存器规定当前任务使用的局部描述符表ldt
a 16位段寄存器和不可见的高速缓冲寄存器组成
b 每个任务的ldt作为系统的一个特殊的段 其描述符位于gdt中
c 初始化和任务切换时 将对应任务的ldt的描述符的选择子装入LDTR中
d 装入ldtr的选择子必须确定一个位于gdt中的类型为LDT的系统段描述符 也即选择子中的TI 位必须是0 而且描述符中的类型字段位LDT
技巧 :空选择子装入LDTR,表示当前任务没有LDT ,装入到段寄存器的选择子都必须指示GDT中的描述符,也即当前任务涉及的段均有GDT中的描述符来描述。如果再把一个TI位为1的选择子(LDT)装入到段寄存器会引起异常。
3.中断描述符表寄存器IDTR
IDTR指向中断描述符表IDT IDTR长度为48位 其中32位的基地址规定IDT基地址,16位的界限规定IDT的段界限。由于386
仅仅支持256个中断或者异常 所以idt最大长度为2k 以字节为单位的界限为7ffh
4.任务状态段寄存器TR
此寄存器指示描述当前任务的任务状态段的描述符选择子 定义了状态段 同时也有高速缓冲寄存器 为程序员不可见
由硬件完成 选择子不能为空 必须索引位于GDT中的描述符 类型必须为tss