草庐IT

windows - 全局描述符表

coder 2023-11-10 原文

我一直在阅读有关虚拟内存(分段 + 分页)的英特尔手册。据我了解,有一个特殊的寄存器可以保存全局描述符表(GDT)。 GDT 包含 NULL Descriptor、Local Descriptor Table、TSS 和 Segment Descriptor。此外,几乎所有操作系统 (OS) 都有一个 GDT,它会在启动时加载并且无法更改(也许!!!)。我的问题是:

  1. 所有这些信息(NULL、LDT、TSS 和段描述符)存储在哪里?它们是在物理内存、RAM 还是本地硬盘中?
  2. 段描述符是否与代码段 (ASM: CS)、数据段 (ASM: DS) 等相同?如果是,其中有多少存储在 GDT 中(是否只有一个 CS,一个 DS,.. ..)?
  3. Protable Executable (PE) Loader 是否操纵这些信息?

最佳答案

Where all of those information stored (NULL, LDT, TSS, and Segment Descriptor)? Are they in Physical Memory, RAM or Local Hard Drive?

如果 CPU 不在内部缓存 GDT 的内容,则需要不时访问它,也许是一直访问它。 CPU 不能只是去从磁盘读取它,因为它对磁盘或磁盘上的文件系统一无所知,也不知道如何不干扰操作系统访问同一磁盘。 CPU 也不能依赖操作系统的帮助,因为操作系统在从磁盘获取内容的过程中也可以让 CPU 从 GDT 获取内容。第 22 条。

您真的不想将 GDT 换出到磁盘。如果不是出于上述原因,则是因为性能影响。因此 GDT 总是在内存中,物理内存 (=RAM)。

Are Segment Descriptors the same as Code Segment (ASM: CS), Data Segment (ASM: DS), ... and if so how many of those are stored in GDT (Is there only one CS, one DS, ...)?

段寄存器(CS、DS 等)包含段选择器,它们基本上是保护模式下 GDT(或 LDT)的索引,这些索引指向/选择描述符表中的段描述符。在实际和虚拟 8086 模式下,它是相同的,除了不使用表,因为段位置和大小(我们从保护模式下的表中获得)不是任意的,不需要查找,它们是立即计算的。

请注意,以下术语含义不同,请勿混淆或互换使用:

  • 段寄存器
  • 段选择器
  • 段描述符
  • 段描述符表
  • 分割

Does Protable Executable (PE) Loader manipulate any of these information?

不应该。至少不是直接的。大多数 Windows 程序在 CS、DS、ES、SS 中使用相同的段选择器值。这些选择器指向的 GDT 条目不会更改,它们是全局的并在所有程序之间共享。

程序和线程之间通常唯一不同的是用于访问线程本地存储 (TLS) 的段(可能还有它的选择器)。 FS 或 GS​​ 段寄存器保存指向该 TLS 段的选择器。所有对 TLS 的访问都是通过使用适当的段覆盖前缀(FS: 或 GS​​:)的指令完成的。 TLS 对于每个线程都是唯一的。

关于windows - 全局描述符表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12715941/

有关windows - 全局描述符表的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  3. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  4. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  5. ruby - 在 RSpec 中 stub /模拟全局常量 - 2

    我有一个gem,它有一个根据Rails.env的不同行为的方法:defself.envifdefined?(Rails)Rails.envelsif...现在我想编写一个规范来测试这个代码路径。目前我是这样做的:Kernel.const_set(:Rails,nil)Rails.should_receive(:env).and_return('production')...没关系,只是感觉很丑。另一种方法是在spec_helper中声明:moduleRails;end而且效果也很好。但也许有更好的方法?理想情况下,这应该有效:rails=double('Rails')rails.sho

  6. ruby - 将全局 $stdout 重新分配给控制台 - ruby - 2

    我正在尝试将$stdout设置为临时写入一个文件,然后返回到一个文件。test.rb:old_stdout=$stdout$stdout.reopen("mytestfile.out",'w+')puts"thisgoesinmytestfile"$stdout=old_stdoutputs"thisshouldbeontheconsole"$stdout.reopen("mytestfile1.out",'w+')puts"thisgoesinmytestfile1:"$stdout=old_stdoutputs"thisshouldbebackontheconsole"这是输出。r

  7. ruby - 在模块/类之间共享全局记录器 - 2

    在许多ruby​​类之间共享记录器实例的最佳(正确)方法是什么?现在我只是将记录器创建为全局$logger=Logger.new变量,但我觉得有更好的方法可以在不使用全局变量的情况下执行此操作。如果我有以下内容:moduleFooclassAclassBclassC...classZend在所有类之间共享记录器实例的最佳方式是什么?我是以某种方式在Foo模块中声明/创建记录器还是只是使用全局$logger没问题? 最佳答案 在模块中添加常量:moduleFooLogger=Logger.newclassAclassBclassC..

  8. ruby - 如何在 Ruby 中执行 Windows CLI 命令? - 2

    我在目录“C:\DocumentsandSettings\test.exe”中有一个文件,但是当我用单引号编写命令时`C:\DocumentsandSettings\test.exe(我无法在此框中显示),用于在Ruby中执行命令,我无法这样做,我收到的错误是找不到文件或目录。我尝试用“//”和“\”替换“\”,但似乎没有任何效果。我也使用过系统、IO.popen和exec命令,但所有的努力都是徒劳的。exec命令还使程序退出,这是我不想发生的。提前致谢。 最佳答案 反引号环境就像双引号,所以反斜杠用于转义。此外,Ruby会将空格解

  9. ruby - Sinatra 中的全局救援和日志记录异常 - 2

    如何在出现异常时指定全局救援,如果您将Sinatra用于API或应用程序,您将如何处理日志记录? 最佳答案 404可以在not_found方法的帮助下处理,例如:not_founddo'Sitedoesnotexist.'end500s可以通过调用带有block的错误方法来处理,例如:errordo"Applicationerror.Plstrylater."end错误的详细信息可以通过request.env中的sinatra.error访问,如下所示:errordo'Anerroroccured:'+request.env['si

  10. ruby - 为什么允许在 Ruby 类之外定义全局方法? - 2

    我读过这个:Let’sstartwithasimpleRubyprogram.We’llwriteamethodthatreturnsacheery,personalizedgreeting.defsay_goodnight(name)result="Goodnight,"+namereturnresultend我的理解是,方法是定义在类中的函数或子程序,可以关联到类(类方法)或对象(实例方法)。那么,如果它不是在类中定义的,怎么可能是方法呢? 最佳答案 当你在Ruby中以这种方式在全局范围内定义一个函数时,它在技术上变成了Obje

随机推荐