【问题标题】:Address of gdtr in LinuxLinux中gdtr的地址
【发布时间】:2015-05-16 23:15:43
【问题描述】:

gdtr的地址我不清楚。

来自“理解 Linux 内核”一书。 2.2.2 段描述符(第38页)


"GDT 在主存中的地址包含在 gdtr 处理器寄存器中,当前使用的 LDT 的地址包含在 ldtr 处理器寄存器中。"


我的问题: gdtr中的地址是逻辑地址/线性地址还是物理地址?

我认为应该是物理地址,因为在那之前没有实现分页。 需要有人帮助确认并提供更好的解释

关于段落的另一个问题: 《理解 Linux 内核》一书。 2.2.4 段 Linux(第 43 页)。


因此,对于每个进程,GDT 包含两个不同的段描述符:一个用于 TSS 段,一个用于 LDT 段。 GDT 中允许的最大条目数是 12+2xNR_TASKS,其中,NR_TASKS 表示最大进程数。其中,NR_TASKS 表示最大进程数。在前面的列表中,我们描述了 Linux 使用的六个主要段描述符。四个额外的段描述符涵盖高级电源管理 (APM) 功能,并且 GDT 的四个条目未使用,总共 14 个。


12+2xNR 任务,12 是从哪里来的? 我认为应该是 14 “在之前的列表中,我们描述了 Linux 使用的六个主要段描述符。另外四个段描述符涵盖了高级电源管理 (APM) 功能,而 GDT 的四个条目未使用,总共 14 个。”

我可能会误解一些东西,请帮我说清楚。

谢谢, $XSM

【问题讨论】:

    标签: linux kernel segment


    【解决方案1】:

    Intel手册(64-ia-32-architectures-software-developer-vol-3a-part-1-manual)说GDT的线性地址存放在GDTR寄存器中,LDT的线性地址是存放在LDTR寄存器中。

    【讨论】:

      【解决方案2】:

      我相信这个地址是一个线性地址。在段寄存器(ds、es、fs、gs)设置为已知值(i386 为 0x18)之后,在 startup_32() 中打开分页。页面目录位于 0x00101000(也称为 swapper_pg_dir)。 GDT 和 IDT 的初始化是在设置分页之后进行的。

      更多信息可以关注source listing here

      【讨论】:

        【解决方案3】:

        我想说为什么GDTR必须是线性地址。因为有一条指令lgdt,这意味着程序员可以设置GDTR。但是由于物理地址对程序员来说是不可见的,所以 GDTR 必须是线性地址。

        【讨论】:

          猜你喜欢
          • 2012-08-19
          • 2016-02-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-01
          相关资源
          最近更新 更多