assembly – 什么是描述符寄存器?

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

The processor checks that all linear-address references are in
canonical form instead of performing limit checks. Mode switching does
not change the contents of the segment registers or the associated
descriptor registers. These registers are also not changed during
64-bit mode execution, unless explicit segment loads are performed.

你们有没有解释描述符寄存器是什么?
SS,ES,DS,CS,Es,FS和GS是段寄存器,全局和局部描述符表中的每个条目都称为描述符.什么是描述符寄存器呢?

我做了一些关于谷歌的研究,但似乎没有什么能回答我的问题.

描述符寄存器通常称为描述符缓存.每次在存储器操作数中使用段寄存器时,不是从存储器中的全局或局部描述符表(GDT / LDT)中读取适当的描述符,而是仅在加载段寄存器时从GDT / LDT读取描述符. (请注意,所有内存操作数都使用段寄存器,无论是隐式还是显式,因此如果它不能以这种方式工作,那么CPU会慢得多.)

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

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

从保护模式到长模式的转换类似地工作,除了在长模式中忽略描述符高速缓存中的大多数值.相反,固定基数为0用于FS和GS以外的所有段,并且不执行限制检查.这意味着切换到长模式的代码应该使用基数为0的代码段,这样有效的CS基数不会改变.

相关文章
相关标签/搜索
刘伯温四肖精选资料