当前位置: 首页 > 知识库问答 >
问题:

如何调用GDT?

卢元龙
2023-03-14

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

它是通过基本的mov指令访问的吗

mov [eax],ebx 

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

共有1个答案

孟韬
2023-03-14

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

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

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

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

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

mov [eax], ebx

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

 类似资料:
  • 问题内容: 我一直在努力使AJAX与Jquery一起使用。到目前为止,我最大的问题是我真的不知道如何弄清楚我在哪里犯错。我真的没有调试AJAX调用的好方法。 我正在尝试建立一个管理页面,其中我要执行的功能之一就是更改SQL数据库中设置的权限。我知道.click函数正在被触发,因此我将其范围缩小了,但是我不确定从AJAX调用到SQL查询的链在哪里出了问题。 我的.js代码: 我的.php处理程序:

  • 我有一个简单的servlet如下所示: 但是只有不接收参数的servlet在工作: 作品: 不起作用: http.springframework.http.converter.HttpMessageNotreadableException:缺少必需的请求正文:public java.lang.String 为什么注释不起作用?我是不是漏掉了一个重要的片段?

  • 本文向大家介绍如何使用JAVA调用SHELL,包括了如何使用JAVA调用SHELL的使用技巧和注意事项,需要的朋友参考一下 通过ProcessBuilder进行调度 这种方法比较直观,而且参数的设置也比较方便, 比如我在实践中的代码(我隐藏了部分业务代码): 这里有必要解释一下几个参数: RUNNING_SHELL_FILE:要运行的脚本 SHELL_FILE_DIR:要运行的脚本所在的目录; 当

  • 我知道这是一个基本的问题,但我就是无法解决它。 我下载了示例宁静项目(mvn原型宁静-junit-screenplay-原型)(https://www.youtube.com/watch?v=o-6CcDFn5Ug)在谷歌中搜索“BDD in Action”。 我使用Gradle进行编译: build.gradle 我更新了“SearchByKeywordStory”如下,以包括IEDriver和

  • 问题内容: 我有两个AsyncTasks在做网络操作。我想定期给他们打电话(例如一分钟后)。我怎么做?我不认为我可以在UI线程上做到这一点。我需要创建一个新线程吗?没有AlarmManager / Service,是否可以实现? 基本上,我想在一分钟后定期执行这两个语句。 谢谢 问题答案: 只需使用一个计时器。

  • 问题内容: 如何从Java调用GraphViz,以及如何使用Java调用GraphViz函数?为了访问用于构建点图的GraphViz库,必须包含哪些必需的jar文件?是否有用于生成点图的示例程序 问题答案: 检查此 API,它很简单,并且具有几种输出格式(即pdf gif ..etc)。 编辑2016年5月: 许多人评论说该API不再可用;这里是其源代码: 首先,您需要创建并复制以下文件,然后粘贴