|
在切换到实模式之前,把一个指向似乎没有用的数据段的描述符Normal的选择子装载到DS和ES。这是为什么呢?
实模 式下 段描 述符 高速 缓冲 寄存 器的 内容 | 段寄存器 | 段基地址 | 段界限(固定) | 段属性(固定) | | 存在性 | 特权级 | 已存取 | 粒度 | 扩展方向 | 可读性 | 可写性 | 可执行 | 堆栈大小 | 一致特权 | | CS | 当前CS*16 | 0000FFFFH | Y | 0 | Y | B | U | Y | Y | Y | - | N | | SS | 当前SS*16 | 0000FFFFH | Y | 0 | Y | B | U | Y | Y | N | W | - | | DS | 当前DS*16 | 0000FFFFH | Y | 0 | Y | B | U | Y | Y | N | - | - | | ES | 当前ES*16 | 0000FFFFH | Y | 0 | Y | B | U | Y | Y | N | - | - | | FS | 当前FS*16 | 0000FFFFH | Y | 0 | Y | B | U | Y | Y | N | - | - | | GS | 当前GS*16 | 0000FFFFH | Y | 0 | Y | B | U | Y | Y | N | - | - | 在分段管理机制一文中已介绍过,每个段寄存器都配有段描述符高速缓冲寄存器,这些高速缓冲寄存器在实方式下仍发挥作用,只是内容上与保护模式下有所不同。如上表所示,其中“Y”表示“是”; “N”表示“否”;“B”表示字节;“U”表示向上扩展,“W”表示以字方式操作堆栈。段基地址仍是 32位,其值是相应段寄存器值(段值)乘以16,在把段值装载到段寄存器时刷新。由于其值是16位段值乘上16,所以在实模式下基地址实际上有效位只有20位。每个段的32位段界限都固定为0FFFFH,段属性的许多位也是固定的。所谓固定是指在实方式下不可设置这些属性值,只能继续沿用保护方式下所设置的值。因此,在准备结束保护模式回到实模式之前,要通过加载一个合适的描述符选择子到有关段寄存器,以使得对应段描述符高速缓冲寄存器中含有合适的段界限和属性。本实例GDT中的描述符Normal就是这样一个描述符,在返回实模式之前把对应选择子Normal_Sel加载到DS和ES就是此目的。
|
一共有 0 条评论