GDT 是如何被调用的?

How is a GDT invoked?

我知道GDT(全局描述符Table)是如何实现的,以及段寄存器和段描述符的使用。但是 how/when 是否访问了 GDT 条目?

是否在像

这样的基本mov指令中访问
mov [eax],ebx 

这是隐式调用 ds 段寄存器然后访问 GDT 段描述符还是有其他方式访问 GDT 条目?

TL;DR : 全局描述符 Table (GDT) 或局部描述符 Table (LDT) 仅在 segment 寄存器在保护模式或长模式下加载新的选择器(无论是相同的值还是不同的值)。正在加载的选择器值的第 2 位决定是否使用 GDT(第 2 位清零)或 LDT(第 2 位设置)来确定从何处读取描述符。


当一个寄存器(CS/DS/ES/SS/FS/GS)被加载(是否有一个新值)时,将查询GDT(或LDT)以获取描述符条目中的信息或相同的值)在 16/32 位保护模式或长模式时。可以将值加载到段寄存器的指令是 POP、MOV、JMP (far)、CALL (far)、RET (far)。烦躁。

在实模式下,当段寄存器加载新值时,GDT/LDT 不会直接查询。

使用选择器加载段寄存器将导致适当的特权级别和访问权限检查,以确定它在正在使用的上下文中是否有效。描述符的基址、限制和访问权限将加载到与每个段寄存器关联的 Segment Descriptor Cache 中。

段描述符缓存是 CPU 的隐藏部分,它的存在是为了加快内存访问速度,这样就不必为访问内存的每条指令从内存中重新加载描述符信息。当您执行以下操作时:

mov [eax], ebx

CPU会将EBX中的32位值写入内存地址DS:[eax](其中EAX 包含要读取的偏移量)。除非被覆盖,否则每个内存访问都有一个隐式段。带有内存地址的 MOV 指令的默认值为 DS(或 )。因为段寄存器中选择器所需的信息缓存在 CPU 中,所以当指令有内存操作数时,不会直接查询 GDT(或 LDT)。