微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GDTR、LDTR、IDTR 和 TR 寄存器的大小是多少? IDTR 和 GDTR 似乎各为 10 个字节LDTR 包含一个段选择器和一个完整的描述符TR 看起来类似于 LDTR

如何解决GDTR、LDTR、IDTR 和 TR 寄存器的大小是多少? IDTR 和 GDTR 似乎各为 10 个字节LDTR 包含一个段选择器和一个完整的描述符TR 看起来类似于 LDTR

我在网上搜索了很多,每次都只能找到 GDT、LDT 和 IDT 的大小。

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

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

解决方法

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

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

你也可以看看wiki.osdev.org,它是一个关于操作系统开发的维基。其中包括 GDTIDTLDT 页面。

,

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 字节内存操作数的寻址模式,而不是基地址.

(如果无法在 GDTR 或 IDTR 中获取 non-canonical 地址,则 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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。