【问题标题】:What's a theoretical example of GDT usage?GDT 使用的理论例子是什么?
【发布时间】:2019-04-28 00:58:52
【问题描述】:

我正在关注walk through of the GDT。我可以了解数据结构的实现方式及其用途。

但是,我不明白 GDT 是如何使用的。 CPU需要加载段的场景是什么?GDT是如何做到的?如果 GDT 涉及键盘驱动的中断,那将是一个很好的解释示例。

【问题讨论】:

    标签: operating-system memory-segmentation gdt


    【解决方案1】:

    GDT 或全局描述符表包含有关内存段的信息。 GDT 的地址存储在称为 GDTR 的特殊寄存器之一中。每个段映射到一个内存区域。该段的目的是提供硬件内存保护。 CPU 并不真正加载整个段,因为段通常指的是内存区域。相反,当您使用具有偏移量的段寄存器(CS、DS、SS 等)之一来寻址内存区域时,CPU 将使用存储在 GDT 中的信息执行检查。例如,如果您已将其中一个段设置为只读,然后您尝试写入它,cpu 将阻止访问。对于系统确实使用段,每次有人访问内存时都会涉及 GDT。

    今天的操作系统很少使用段。他们中的大多数建立了“平面内存模型”,每个段跨越整个内存空间。分页和虚拟内存用于内存保护。段的存在主要是因为向后兼容。 您可以在osdev 上阅读有关 GDT 的更多信息

    【讨论】:

      【解决方案2】:

      对于不使用分段的现代操作系统(很多);您可能会发现 GDT 包含:

      • “CPL=0”和“CPL=3”代码的 2 或 3 个描述符(如果 64 位操作系统支持较旧的 32 位进程,则它可能具有“32 位 CPL=3 代码”和“64 -bit CPL=3 代码”,以及“64 位 CPL=0 代码”)
      • “CPL=0”堆栈的描述符
      • “CPL=3”堆栈和数据的描述符
      • 每个 CPU 的 CPU 的 TSS(任务状态段)描述符
      • 对于 32 位(而不是 64 位,您可以使用 swapgs)每个 CPU 有一个或两个描述符,用于查找“CPU 本地”数据和/或“线程本地”数据
      • (可选,不太可能);定义内核 API 调用门的描述符
      • (可选,用于特殊目的);一个或多个描述 LDT 的描述符(有时用于仿真)

      对于其他操作系统,GDT 可以包含任何内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-19
        相关资源
        最近更新 更多