摘要:为了协助处理器完成初始化和控制系统操作,80x86提供了一个标志寄存器和几个系统寄存器。Eflags用于控制任务切换、中断处理、指令跟踪和权限访问。系统寄存器用于内存管理和控制处理器操作。
1.标志寄存器
32b,含有系统标志和通用标志,以及保留位等等,具体可以参考相关资料,下面简介系统标志位
1) TF:b8,跟踪标志
2)IOPL:b13-b12,IO特权级
3)NT:b14,嵌套任务标志(nested task)
4)RF:b16,恢复标志(resume flag)
5)VM:b17,虚拟8086模式
2.内存管理寄存器
GDTR、LDTR、IDTR、TR,用于制定内存分段管理所用的系统表的基地址,其中TR用于寻址一个特殊的任务状态段,TSS中包含中当前执行任务的重要信息。
图1 内存管理寄存器
GDTR:全局描述符表寄存器
IDTR:中断描述符表寄存器,使用LIDT&&SIDT存取
LDTR:存放32位线性地址、16位限长和描述符属性。指令LLDT和SLDT用于保存LDTR寄存器的段描述符部分。当使用LDTR指令把含有LDT标段的选择符加载进LDTR时,对应段基地址、限长、属性自动加载到LDTR中。
TR:任务寄存器,通用LDR和STR存取,存取操作类似LDTR。
3.控制寄存器
用于控制和确定处理器的操作模式和当前执行任务的特性。
cr0:控制处理器操作模式和状态
cr1:保留
cr2:含有导致页错误的线性地址
cr3:页目录表物理内存基地址
3.1 cr0中的保护控制位
从某种程度长说,cr0是分段机制和分页机制中最重要的寄存器:
对于分段机制:cr0中最重要的是PE(b0)改变的时候需要特别小心。修改了PE之后,必须立即使用一条跳转指令,以刷新处理器执行管道中已经获得的不同模式下的任何指令。在设置PE位之前,程序必须初始化基本系统段和控制寄存器。
对于分段机制PG(b31)位,只有当执行程序至少有部分代码和数据在线性地址空间和物理地址空间中有相同地址的时候,才能改变PG。所以,这一部分代码在分页和没有分页的世界之间起到了桥梁作用。开启分页之前,必须先栓新TLB。
开启的时候,必须先开启分段,然后开启分页。
关闭的时候,要使用相反的顺序,不然,就会出现如下的提示信息:check_CR0(0xe0000010): attempt to set CR0.PG with CR0.PE cleared
3.2 cr2和cr3
cr2和cr3用于分页机制,cr3也被称为PDBR。因为页目录表页面是页对齐的,所以该寄存器只有高20b有效(4k占用12b),低12b保留给更高级处理器使用。往cr3加载一个值的时候,低12b必须是0.使用mov指令加载cr3,会让TLB失效。