Ori*_*ion 8 windows x86 operating-system intel
我一直在阅读有关虚拟内存(分段+分页)的英特尔手册.据我所知,有一个特殊的寄存器,其中包含全局描述符表(GDT).GDT包含NULL描述符,本地描述符表,TSS和段描述符.此外,几乎所有操作系统(OS)都有一个GDT,并且在启动时加载并且无法更改(可能!!!).我的问题是:
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对每个线程都是唯一的.
归档时间: |
|
查看次数: |
3371 次 |
最近记录: |