我一直在阅读有关虚拟内存(分段+分页)的英特尔手册。据我所知,有一个特殊的寄存器,其中包含全局描述符表(GDT)。 GDT包含NULL描述符,本地描述符表,TSS和段描述符。此外,几乎所有操作系统(OS)都有一个GDT,并且在启动时加载并且无法更改(可能!!!)。我的问题是:
答案 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)感兴趣
答案 2 :(得分:1)
我同意上述答案,但问题2的更完整答案是:
段描述符指定段的大小,访问权限和
段的权限级别,段类型以及段的第一个字节的位置
在线性地址空间(称为段的基址)。因此,段描述符不仅仅是CS,DS,...寄存器。