【问题标题】:What are the sizes of GDTR, LDTR, IDTR and TR registers?GDTR、LDTR、IDTR 和 TR 寄存器的大小是多少?
【发布时间】:2021-08-27 05:51:40
【问题描述】:

我在网上查了很多,每次只能找到GDT、LDT和IDT的尺寸。

这里我问的不是表格的大小,而是寄存器

的大小

我知道 GDTR 是一个 64 位寄存器,但对其他寄存器一无所知。

【问题讨论】:

    标签: x86 nasm cpu-architecture cpu-registers gdt


    【解决方案1】:

    您可以随时查看 CPU 制造商的说明: 英特尔® 64 和 IA-32 架构软件开发人员手册第 3 卷第 2.4 章

    排序: GDT 和 IDT:32 位或 64 位(分别在保护模式和长模式下)基地址 + 16 位限制 = 48 位 LDT 和 TR:16 位,与其他每个段寄存器一样。

    你也可以看看wiki.osdev.org,它是一个关于操作系统开发的wiki。除其他外,它还有 GDTIDTLDT 的页面。

    【讨论】:

      【解决方案2】:

      IDTR 和 GDTR 似乎各有 10 个字节。

      IDTR 也可以指向虚拟地址空间中的任何位置,因此显然它的基址也必须是 64 位的。 lidtlgdt 采用相同的限制/基本结构格式,the pseudocode 表明它们在 64 位模式下这样做:

                          GDTR(Limit) ← SRC[0:15];
                          GDTR(Base) ← SRC[16:79];
      

      限制(最大字节偏移)应被视为 GDTR / IDTR 的一部分。 documentation for sidt 也表示“存储 IDTR”,它存储的是相同的 2 + 8 字节结构,具有限制 + 基数。 (GDTR 在内部使用限制来检查段选择器,然后在 GDT 中查找它们,因此如果超过限制,您使用 lgdt 的地址的 64k 内的内存可以用于其他用途。)

      似乎lidt / lgdt 不检查 GDT/IDT 基址是否为规范地址。文档说他们#GP(0) 如果内存地址采用非规范形式。 但我认为这是在谈论到达 10 字节内存操作数的寻址模式,而不是基地址。

      (如果无法将non-canonical 地址放入GDTR 或IDTR,CPU 可以在内部仅存储重要的48 bits(或PML5 的57),从而将大小降低到6 + 2 = 8 个字节。并将符号扩展回 64 位作为sidt / sgdt 的一部分。但可能可以通过 GDTR 往返任意 64 位值,只需确保 CPU 在输入有效地址之前不需要将 GDT 用于任何事情!)


      LDTR 包含一个段选择器和一个完整的描述符

      lldt 的文档表明如果没有错误:

          LDTR(SegmentSelector) ← SRC;
          LDTR(SegmentDescriptor) ← GDTSegmentDescriptor;
      

      这表示内部 LDTR 保留 16 位段选择器(ldtr 的实际操作数,例如 ldtr ax),以及加载选定的 GDT 条目并保留它。 GDT 条目是 8 个字节,但它可以将该条目解码为某种内部格式。 (可能不包括 type 字段,已经检查过了,需要是 type == LDT)

      这意味着与 DS 或 SS 等段寄存器一样,如果您在运行 lldt 后更改 GDT 内容,则在您运行 lldt 时所选条目的基数/限制将继续适用。

      TR 看起来类似于 LDTR

      再次,文档显示:

      TaskRegister(SegmentSelector) ← SRC;
      TaskRegister(SegmentDescriptor) ← TSSSegmentDescriptor;
      

      与 LDTR 一样,您只能检索段选择器,而不是它存储的实际描述符。 str r/m16sldt r/m16 只写一个 16 位目标操作数。

      但实际的内部寄存器需要保存整个段描述符,而不是使用选择器重新索引当前 GDT。

      【讨论】:

      • 完全理解 TR 和 LDTR,关于 GDTR 和 IDTR 的最后一个问题。如果每个字节有 10 个字节(80 位),那么在编程时是否可以访问所有 10 个字节?据我了解,我可能完全错了,我们只能访问你提到的 gdtr 的 8 个字节。那么剩下的 2 个字节是用来做什么的呢?它们是浪费了还是不可见?
      • @MarcAl:正如我的回答所说,您可以使用sidtsgtd 再次获得基础和限制。这总共是 2 + 8 = 10 个字节。所以是的,从这个意义上说,所有 10 个字节都可以访问。但是,只有基地址的低 6 个字节才能真正用作实际地址。 (或者 PML5 的低 57 位用于 57 位虚拟地址。)所以是的,基地址的高位实际上是无用的。不过,限制不是。
      猜你喜欢
      • 2015-05-29
      • 2021-08-07
      • 2012-04-26
      • 2013-01-11
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 2013-09-21
      • 2016-06-07
      相关资源
      最近更新 更多