全局描述表

Ori*_*ion 8 windows x86 operating-system intel

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

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

Ale*_*nze 11

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

如果CPU没有在内部缓存GDT的内容,则需要时不时地访问它,也许一直都是这样.CPU不能只从磁盘上读取它,因为它不知道磁盘或文件系统的任何信息,也不知道如何不干扰访问同一磁盘的操作系统.CPU也不能依赖操作系统的帮助,因为操作系统在从磁盘获取内容的过程中也可以使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对每个线程都是唯一的.


Nec*_*lis 5

OSDev.org给出了很好的GDT,但是,详细介绍其实现的教程更有意义.(你可能也对它较小的,特权较低的堂兄,LDT感兴趣)

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

  2. 是(请参阅词汇表),您可以存储您喜欢的任何分段基础,通常,CS和DS是最低限度(如果使用SYSENTER/ 则需要用户+内核版本SYSEXIT).

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