全局描述表

时间:2012-10-03 20:00:50

标签: windows operating-system x86 intel

我一直在阅读有关虚拟内存(分段+分页)的英特尔手册。据我所知,有一个特殊的寄存器,其中包含全局描述符表(GDT)。 GDT包含NULL描述符,本地描述符表,TSS和段描述符。此外,几乎所有操作系统(OS)都有一个GDT,并且在启动时加载并且无法更改(可能!!!)。我的问题是:

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

3 个答案:

答案 0 :(得分:11)

  

存储所有这些信息(NULL,LDT,TSS和Segment Descriptor)?它们是物理内存,RAM还是本地硬盘?

如果CPU没有在内部缓存GDT的内容,则需要时不时地访问它,也许一直都是这样。 CPU不能只是从磁盘上读取它,因为它不知道磁盘或其上的文件系统,也不知道如何不干扰访问同一磁盘的操作系统。 CPU也不能依赖操作系统的帮助,因为操作系统在从磁盘获取内容的过程中也可以使CPU从GDT中获取内容。赶上22。

你真的不希望将GDT换成磁盘。如果不是出于上述原因,那么由于性能影响。因此GDT始终在内存中,物理内存(= RAM)。

  

段描述符是否与代码段(ASM:CS),数据段(ASM:DS)相同,......如果是,那么有多少存储在GDT中(只有一个CS,一个DS ,. ..)?

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

请注意,以下术语表示不同的内容,不得混淆或互换使用:

  • 段寄存器
  • 段选择器
  • 段描述符
  • 段描述符表
  • 片段
  

Protable Executable(PE)Loader是否可以处理这些信息?

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

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

答案 1 :(得分:5)

OSDev.org提供了nice run down的GDT,但是,the tutorial详细说明了其实施方式。 (你可能也对它较小的,特权较低的堂兄LDT)感兴趣

  1. GDT驻留在主存储器中,并使用线性地址(通过LGDT)加载,因此它可能位于分页存储器中。

  2. 是(请参阅glossary),您可以存储您喜欢的任何细分基础,generally,CS和DS是最低要求(如果使用,则需要用户+内核版本) SYSENTER / SYSEXIT)。

  3. 不,它宁愿改变LDT(因为x86提供了交换它们的设施,但不是GDT,它需要设置实模式指令,并且在实际和保护模式之间跳转是不可行的)。

答案 2 :(得分:1)

我同意上述答案,但问题2的更完整答案是:
段描述符指定段的大小,访问权限和 段的权限级别,段类型以及段的第一个字节的位置 在线性地址空间(称为段的基址)。因此,段描述符不仅仅是CS,DS,...寄存器。