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

全局描述符表GTD的现代用法是什么?

如何解决全局描述符表GTD的现代用法是什么?

经过长时间的阅读,我真的很困惑。 根据我的读物:

  1. 现代操作系统根本不使用段。

  2. GDT用于定义内存中的一个段(包括约束)。

  3. 该页表中有一个主管位,用于指示当前位置是否用于内核。

  4. 维基百科说:“ GDT仍以64位模式存在;必须定义GDT,但通常从不更改或将其用于分段。”

为什么我们完全需要它?以及Linux如何使用它?

解决方法

  1. 现代操作系统根本不使用段。

现代OS(用于64位80x86)仍使用段寄存器;只是它们的使用对用户空间“几乎是隐藏的”(并且大多数用户空间代码可以忽略它们)。特别; CPU将从操作系统加载到CS的所有操作系统(从GDT或LDT)中确定代码是否是64位(或32位或16位),中断仍保存CS和{{ 1}}用于中断的代码(然后在SS上再次加载),iret和/或GS通常用于线程本地和/或CPU本地存储等。

  1. GDT用于在内存中定义一个段(包括约束)。

代码段和数据段只是GDT的用途之一。另一个主要用途是定义任务状态段的位置(用于查找IO端口权限映射,在中断引起的特权级别更改时加载到CS,SS和RSP的值等)。对于64位代码(以及在64位内核下运行的32位代码/进程),仍然可以使用GDT中定义的调用门,但是大多数操作系统不对64位代码使用该功能(他们改用FS

  1. 该页表中有一个主管位,用于指示当前位置是否用于内核。

是的。页表的超级用户位确定以CPL = 3运行的代码是否可以/不能访问该页面(或者代码是否必须为CPL = 2,CPL = 1或CPL = 0才能访问该页面)。

  1. 维基百科说:“ GDT仍以64位模式存在;必须定义GDT,但通常从不更改或将其用于分段。”

是-维基百科是正确的。通常,操作系统会在启动期间(针对TSS,CS,SS等)在启动初期设置GDT,然后在启动后无需任何理由对其进行修改。并且段寄存器不用于“分段存储器保护”(但用于其他用途-确定代码大小,是否中断处理程序应返回CPL = 0等等)。

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