Windows 全球描述符表

Windows 全球描述符表,windows,operating-system,x86,intel,Windows,Operating System,X86,Intel,我一直在阅读有关虚拟内存(分段+分页)的英特尔手册。据我所知,有一个特殊的寄存器保存全局描述符表(GDT)。GDT包含空描述符、本地描述符表、TSS和段描述符。此外,几乎所有操作系统(OS)都有一个GDT,它在启动时加载,并且无法更改(可能!!!)。我的问题是: 所有这些信息存储在哪里(NULL、LDT、TSS和段描述符)?它们是在物理内存、RAM还是本地硬盘驱动器中 段描述符与代码段(ASM:CS)、数据段(ASM:DS)相同吗。。。如果是这样的话,GDT中存储了多少(是否只有一个CS、一个D

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

  • 所有这些信息存储在哪里(NULL、LDT、TSS和段描述符)?它们是在物理内存、RAM还是本地硬盘驱动器中
  • 段描述符与代码段(ASM:CS)、数据段(ASM:DS)相同吗。。。如果是这样的话,GDT中存储了多少(是否只有一个CS、一个DS等)
  • 可移植可执行文件(PE)加载器是否处理这些信息
  • org给出了GDT的一个例子,然而,详细描述它的实现是更有趣的方式。(你也可能对它的小而不那么有特权的表亲感兴趣)

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

  • 是的(请参阅),并且您可以存储任何您喜欢的段基,CS和DS是最小值(如果使用
    SYSENTER
    /
    SYSEXIT
    ,则需要用户+内核版本)

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

  • 所有这些信息存储在哪里(NULL、LDT、TSS和段描述符)?它们是在物理内存、RAM还是本地硬盘驱动器中

    如果CPU没有在内部缓存GDT的内容,那么它可能需要时不时地访问GDT,可能需要一直访问GDT。CPU不能直接从磁盘读取,因为它不知道磁盘或磁盘上的文件系统的任何信息,也不知道如何不干扰操作系统访问同一磁盘。CPU也不能依赖操作系统的帮助,因为操作系统在从磁盘获取数据的过程中也可以让CPU从GDT获取数据。第22条

    您真的不希望GDT被交换到磁盘上。如果不是因为上述原因,那么是因为性能影响。所以GDT总是在内存中,物理内存(=RAM)

    段描述符与代码段(ASM:CS)、数据段(ASM:DS)相同吗。。。如果是这样的话,GDT中存储了多少(是否只有一个CS、一个DS等)

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

    注意,以下术语的含义不同,不得混淆或互换使用:

    • 段寄存器
    • 段选择器
    • 段描述符
    • 段描述符表
    • 分段
    可移植可执行文件(PE)加载器是否处理这些信息

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


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

    我同意上面的答案,但对于问题2,更完整的答案是:
    段描述符指定段的大小、访问权限和 段的权限级别、段类型和段的第一个字节的位置
    在线性地址空间中(称为段的基址)。所以段描述符不仅仅是CS,DS,。。。注册。

    您能给我解释一下GDT中有多少段描述符吗?现在让我们假设,如果进程A被执行,它的段选择器指向GDT中的段描述符,现在进程B被执行,现在进程B的段选择器指向GTD中与进程A相同的条目(段描述符)?GDT/LDT条目的最大数量是8192 IIRC,请查看CPU手册。是的,这是一个非常有效的场景。记住,在片段下面是页面翻译。因此,尽管这两个进程看起来有相同的段,但它们访问的实际内存却不一样。谢谢您的回复。是否只有一个代码段描述符和一个数据项,或者可以是多个?OS在启动时加载GDT和段描述符表,它们在OS生命周期内保持不变,对吗?可以有多个代码和数据段描述符。操作系统可以更改它们或添加更多。这取决于windows下的OS programmer.FS/GS拥有TEB/TIB库,而TEB/TIB库又拥有TLS数据和其他许多东西。感谢您提供的链接和您的答案。投票结束太广泛:一个问题太多。