【问题标题】:How is a GDT invoked?如何调用 GDT?
【发布时间】:2020-05-14 02:09:13
【问题描述】:

我知道如何实现 GDT(全局描述符表)以及如何使用段寄存器和段描述符。但是如何/何时访问 GDT 条目?

是否在基本的 mov 指令中访问,例如

mov [eax],ebx 

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

【问题讨论】:

  • 哦,对不起!我只是想说说 mov [eax],ebx

标签: assembly memory x86 osdev gdt


【解决方案1】:

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


当一个 segment 寄存器 (CS/DS/ES/SS/FS/GS) 被加载时(无论是否使用新的值或相同值)在 16/32 位保护模式或长模式下。可以将值加载到段寄存器中的指令是 POP、MOV、JMP(远)、CALL(远)、RET(远)。伊雷特。

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

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

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

mov [eax], ebx

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-22
    • 2018-06-22
    • 2013-01-17
    • 2015-08-11
    • 2011-10-16
    • 2012-07-17
    • 2012-04-27
    相关资源
    最近更新 更多