首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全局描述符表(GTD)的现代用法是什么?

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

Stack Overflow用户
提问于 2020-11-08 18:30:09
回答 1查看 653关注 0票数 2

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

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

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

  1. 页面表有一个监控程序位,指示当前位置是否用于内核.

维基百科(

  1. )说:“GDT仍然以64位模式存在;必须定义GDT,但通常不会更改或用于。

为什么我们需要它?linux是如何使用它的呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-08 23:18:22

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

现代操作系统(对于64位80x86)仍然使用段寄存器;只是它们的使用对用户空间“大部分是隐藏的”(而且大多数用户空间代码可以忽略它们)。具体来说,CPU将确定从操作系统负载(从GDT或LDT)到CS的代码是否为64位(或32位或16位),中断仍然为中断的代码保存CSSS (并再次加载到iret),GS和/或FS通常用于线程本地和/或CPU本地存储等。

GDT用于在内存中定义一个段(包括constraints). )

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

  1. 页面表有一个监控程序位,指示当前位置是否用于内核.

是。页表的监控程序位决定在CPL=3上运行的代码是否可以/不能访问页面(或者代码必须是CPL=2、CPL=1或CPL=0才能访问页面)。

维基百科(

  1. )说:“GDT仍然以64位模式存在;必须定义GDT,但通常不会更改或用于。

是的-维基百科是对的。通常,操作系统会在启动的早期(对于TSS、CS、SS等)设置GDT,然后在启动后没有任何理由修改它;并且段寄存器不是用于“分段内存保护”(而是用于其他事情-确定代码大小,如果中断处理程序应该返回到CPL=0,等等)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64741681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档