x86保护模式 控制寄存器和系统地址寄存器

控制寄存器和系统地址寄存器

 控制寄存器    crx
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这一特殊的系统段提供一个伪描述符     
 
段界限以字节为单位    由于段选择子中只有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
原文地址:https://www.cnblogs.com/dongguolei/p/7896479.html