我正在浏览 GDT。我可以了解数据结构的实现方式及其用途。
但是,我不明白 GDT 是如何使用的。CPU需要加载段的场景是什么?GDT是如何做到的?如果 GDT 涉及键盘驱动的中断,那将是一个很好的解释示例。
我正在浏览 GDT。我可以了解数据结构的实现方式及其用途。
但是,我不明白 GDT 是如何使用的。CPU需要加载段的场景是什么?GDT是如何做到的?如果 GDT 涉及键盘驱动的中断,那将是一个很好的解释示例。
GDT 或全局描述符表包含有关内存段的信息。GDT 的地址存储在称为 GDTR 的特殊寄存器之一中。每个段映射到一个内存区域。该段的目的是提供硬件内存保护。CPU 并不真正加载整个段,因为段通常指的是内存区域。相反,当您使用具有偏移量的段寄存器(CS、DS、SS 等)之一来寻址内存区域时,CPU 将使用存储在 GDT 中的信息执行检查。例如,如果您将其中一个段设置为只读,然后您尝试写入它,cpu 将阻止访问。对于系统确实使用段,每次有人访问内存时都会涉及 GDT。
今天的操作系统很少使用段。他们中的大多数建立了“平面内存模型”,每个段跨越整个内存空间。分页和虚拟内存用于内存保护。段的存在主要是因为向后兼容。您可以在osdev上阅读有关 GDT 的更多信息
对于不使用分段(很多)的现代操作系统;您可能会发现 GDT 包含:
swapgs
)每个 CPU 有一个或两个描述符,用于查找“CPU 本地”数据和/或“线程本地”数据对于其他操作系统,GDT 可以包含任何内容。