首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调用GDT?

如何调用GDT?
EN

Stack Overflow用户
提问于 2020-01-28 15:53:34
回答 1查看 308关注 0票数 1

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

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

代码语言:javascript
复制
mov [eax],ebx 

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-28 17:40:17

TL;DR:全局描述符表(GDT)或本地描述符表(LDT)只有在段寄存器加载了新的选择器(无论是相同的值还是不同的值)时才会被访问,无论是在保护模式还是长模式下。正在加载的选择器值的位2确定GDT (位2是清楚的)还是LDT (位2被设置)来确定从哪里读取描述符。

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

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

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

段描述符Cache是CPU中的一个隐藏部分,用于加速内存访问,从而不必为访问内存的每条指令从内存中重新加载描述符信息。当你做这样的事情时:

代码语言:javascript
复制
mov [eax], ebx

CPU将把EBX中的32位值写入内存地址DS:[eax] (其中EAX包含要读取的偏移量)。除非重写,否则与每个内存访问关联的隐式段。带有内存地址的MOV指令的缺省值是DS (或如果内存地址使用EBP作为基,则为SS。)。由于段寄存器中所需的选择器信息被缓存在CPU中,所以当指令具有内存操作数时,GDT (或LDT)不会直接被查询。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59952499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档