什么是描述符寄存器?

时间:2018-09-25 19:15:34

标签: assembly x86 intel cpu-registers osdev

我知道什么是段寄存器。它们保存段选择器(描述符表中的索引+特权级别+本地或全局表中的索引),以及显然是隐藏部分,也称为“描述符缓存”。我也了解什么是全局和局部描述符表,当然还有描述符本身。但是,intel 64 and IA-32 architectures software developers manual在第95页第3A页提到了描述符寄存器(第3.4.4章:IA-32e模式下的段加载指令),这是我第一次听说它们。

  

处理器检查所有线性地址引用都在   规范形式而不是执行极限检查。模式切换确实   不更改段寄存器或相关寄存器的内容   描述符注册。这些寄存器在执行期间也不会更改   除非执行显式段加载,否则执行64位模式。

任何人都可以解释什么是描述符寄存器吗? SS,ES,DS,CS,Es,FS和GS是段寄存器,全局和本地描述符表中的每个条目都称为描述符。那么什么是描述符寄存器?

我围绕Google进行了一些研究,但似乎没有任何答案。

2 个答案:

答案 0 :(得分:4)

描述符寄存器通常被称为描述符缓存。每次在内存操作数中使用段寄存器时,不是从全局或本地描述符表(GDT / LDT)中读取适当的描述符,而是仅在加载段寄存器时从GDT / LDT中读取描述符。 (请注意,所有内存操作数都使用段寄存器,无论是隐式还是显式的,因此,如果这种方式不起作用,CPU的运行速度将大大降低。)

这样做的副作用是,描述符高速缓存可能不与段寄存器中加载的当前选择器值同步。例如,如果使用LGDT指令更改GDT的地址,则描述符缓存不会更新,并且仍包含旧GDT中的描述符值。

当切换模式时,例如从实模式切换到保护模式,或从保护模式切换到长模式(Intel称为IA-32e模式),也会发生同样的事情。从实模式切换到保护模式后,描述符缓存仍然具有旧的实模式基础,限制和访问权限。这很重要,因为段寄存器还仍然包含它们的实模式值,这些实模式值在保护模式下不太可能有效。特别是,即使CS包含无效的选择器,它也允许提取CS:EIP的下一条指令。 CS描述符缓存仍包含指向与模式更改之前相同位置的有效值。

从保护模式到长模式的过渡方式相似,除了在长模式下忽略描述符高速缓存中的大多数值。取而代之的是,除FS和GS以外的所有段均使用固定的0底基,并且不执行限制检查。这意味着切换到长模式的代码应使用基数为0的代码段,以使有效CS基数不变。

答案 1 :(得分:2)

基数/限制和其他内容在下一个mov ds, whatever之前是永久的,允许使用虚幻模式https://wiki.osdev.org/Unreal_Mode之类的东西,您以限制> 64k切换回实模式,通常基数= 0。 (固定4G)。

Intel将段描述符缓存描述为寄存器。这只是一个术语问题。

实际上,注册是考虑它的一种更好的方法,因为“缓存”表示让它与正在缓存的内容(GDT或LDT条目)不同步是很糟糕的。

通常的术语是“描述符缓存”,但它不是一致性缓存,仅用于在写入段寄存器而不是GDT中的内存时进行更改。 (并且未进行更新以反映对段寄存器解释的更改,例如实模式与受保护模式。)