我正在跟踪一个walk through of the GDT。我可以掌握数据结构是如何实现的,以及它的用途。
然而,我不明白的是GDT是如何使用的。CPU需要加载段的场景是什么? GDT是如何做到这一点的?如果GDT涉及到键盘驱动的中断,这将是一个很好的例子来解释。
发布于 2019-05-08 08:42:44
GDT或全局描述符表包含有关内存段的信息。GDT的地址存储在一个称为GDTR的特殊寄存器中。每个段映射到一个内存区域。段的目的是提供硬件内存保护。CPU并不真正加载整个段,因为段通常指的是内存区域。相反,当您使用带偏移量的段寄存器(CS、DS、SS等)之一来寻址内存区域时,CPU将使用存储在GDT中的信息执行检查。例如,如果您将其中一个段设置为只读,然后尝试对其进行写入,则cpu将阻止访问。对于使用段的系统,每次有人访问内存时都会涉及到GDT。
今天的操作系统很少使用段。他们中的大多数人建立了“扁平记忆模型”,每个段跨越整个存储空间。分页和虚拟内存用于内存保护。Segment的存在主要是因为向后兼容。您可以在osdev上阅读更多关于GDT的内容。
发布于 2019-05-08 11:20:32
对于不太使用分段的现代操作系统,您可能会发现GDT包含:
用于"CPL=0“和" CPL=3”代码的
swapgs的64位没有那么多)用于查找"CPU本地“数据和/或”线程本地“数据的每个CPU的一个或两个描述符(不太可能);一个描述符,用于定义用于特殊目的的内核API(有时用于仿真
对于其他操作系统,GDT可以包含任何内容。
https://stackoverflow.com/questions/55886160
复制相似问题