所有这些信息(NULL、LDT、TSS 和段描述符)存储在哪里?它们在物理内存、RAM 还是本地硬盘中?
如果 CPU 没有在内部缓存 GDT 的内容,那么它可能需要时不时地访问它,也许一直都需要。CPU 不能直接从磁盘读取它,因为它不知道磁盘或上面的文件系统的任何信息,也不知道如何不干扰访问同一磁盘的操作系统。CPU 也不能依赖 OS 的帮助,因为 OS 在从磁盘获取某些东西的过程中,也可以让 CPU 从 GDT 获取一些东西。捕获 22。
您真的不希望将 GDT 换出到磁盘。如果不是因为上述原因,那么是因为性能影响。所以 GDT 总是在内存中,物理内存(=RAM)。
段描述符与代码段 (ASM: CS)、数据段 (ASM: DS) 是否相同,如果是,则其中有多少存储在 GDT 中(是否只有一个 CS,一个 DS,...) ?
段寄存器(CS、DS 等)包含段选择器,它们基本上是保护模式下 GDT(或 LDT)的索引,这些索引指向/选择描述符表中的段描述符。在真实和虚拟 8086 模式中它是相同的,除了不使用表,因为段位置和大小(我们从保护模式下的表中获得)不是任意的并且不需要查找,它们是立即计算的。
请注意,以下术语的含义不同,请勿混淆或互换使用:
Protable Executable (PE) Loader 是否操纵这些信息?
它不应该。至少不是直接的。大多数 Windows 程序在 CS、DS、ES、SS 中使用相同的段选择器值。这些选择器指向的 GDT 条目不会改变,它们是全局的并且在所有程序之间共享。
程序和线程之间通常唯一不同的是用于访问线程本地存储(TLS)的段(可能还有它的选择器)。FS 或 GS 段寄存器保存指向该 TLS 段的选择器。并且所有对 TLS 的访问都是通过使用适当的段覆盖前缀(FS: 或 GS:)的指令完成的。TLS 对于每个线程都是唯一的。