概述
系统中的各种寄存器
- 标志寄存器EFALGS:控制I/O、可屏蔽中断、调试、任务切换以及保护模式和多任务环境下虚拟8086程序的执行等。全部标志都是保存在标志寄存器中;
- 内存管理寄存器,用于分段内存管理
- GDTR:全局描述符表寄存器,指向段描述符表GDT
- LDTR:局部描述符表寄存器,指向段描述符表LDT
- IDTR:中断描述符表寄存器,指向中断处理向量(句柄)表IDT的入口点,所有中断处理过程的入口地址信息均存放在IDT中
- TR:任务寄存器,指向处理器定义当前任务(进程)所需的信息,也即任务数据结构
- 控制寄存器,共有4个
- CR0含有系统整体的控制标志,如保护模式开启位、协处理器存在标志、任务切换等
- CR2,CPU将引起错误的线性地址保存在该寄存器中;
- CR3为CPU指定当前运行的任务所使用的页表目录
- CR1保留
内存管理
内存管理主要涉及处理器的内存寻址机制,分段形式逻辑地址转换为实际物理内存地址需经两步:
- 段变换,将一个由段选择符和段内偏移构成的逻辑地址转换为一个线性地址;
- 页变换,将线性地址转换为对应的物理地址
段变换
32位的逻辑地址变换成线性地址的过程:
- 首先,根据逻辑地址的0-15位(也称为选择符),到描述符表中定位到对应的段描述符(也就是描述符表中的一项)
- 将段描述符作为基址(32位),与原来的32位逻辑地址(这时候看成是偏移值)相加,从而得到线性地址
段描述符
- 向CPU提供了将逻辑地址映射为线性地址所必要的信息,一般有两种形式(用于程序代码段和数据段的描述符和用于特殊系统段的描述符),但是具体相差不是很大。各个字段的含义如下(一个段描述符为8字节):
- 基地址:定义段在4GB线性空间中的位置,共32位(由三个部分组成)
- 段限长:定义了段的最大长度
- 颗粒度
- 类型:用于区分各种不同类型的描述符
- 描述符特权级:用于保护机制,共有4级:0-3,0是最高特权
- 段存在位:表示该段描述符是否有效
- 访问位
描述符表
- 描述符表由段描述符构成,分为GDT和LDT两类
- CPU通过GDTR和LDTR寄存器来定位GDT表和当前的LDT表,保存了描述符表的基地址(32位)和表的长度
- 指令lgdt和sgdt用于访问GDTR寄存器;指令lldt和sldt用于访问 LDTR寄存器
选择符
- 逻辑地址的15-0位(共16位)即是选择符部分,用于在描述符表中指定描述符。各字段含义如下 :
- 索引值(第15-3位):用于选择指定描述符表中8192(213)个描述符中的一个描述符,步骤为:先乘上8(描述符的字节长度)可看作偏移地址,再加上描述符表的基地址就得到了段描述符的实际物理地址
- 表指示器(第2位), 0表示GDT表,1表示IDT表
- 请求者的特权级(第1-0位):用于保护机制
段寄存器
- CPU将描述符中的信息保存在段寄存器中(避免在每次访问内存时查询描述符表),其中每个段寄存器都有一个可见部分(16位)和一个不可见部分(8字节)
- 普通的程序指令,即直接加载指令(如MOV,POP,LDS,LSS,LGS,LFS,显式调用段寄存器)和隐式加载指令(如CALL和JMP),使用的都是可见部分
- 程序将16位的选择符加载到段寄存器的可见部分,CPU自动将对应的描述符的信息保存到不可见部分
- 段寄存器包括:CS代码段,SS堆栈段,DS数据段,ES附加段,FS,GS