问题描述
经过长时间的阅读,我真的很困惑。 根据我的读物:
-
现代操作系统根本不使用段。
-
该页表中有一个主管位,用于指示当前位置是否用于内核。
-
维基百科说:“ GDT仍以64位模式存在;必须定义GDT,但通常从不更改或将其用于分段。”
为什么我们完全需要它?以及Linux如何使用它?
解决方法
- 现代操作系统根本不使用段。
现代OS(用于64位80x86)仍使用段寄存器;只是它们的使用对用户空间“几乎是隐藏的”(并且大多数用户空间代码可以忽略它们)。特别; CPU将从操作系统加载到CS
的所有操作系统(从GDT或LDT)中确定代码是否是64位(或32位或16位),中断仍保存CS
和{{ 1}}用于中断的代码(然后在SS
上再次加载),iret
和/或GS
通常用于线程本地和/或CPU本地存储等。
- GDT用于在内存中定义一个段(包括约束)。
代码段和数据段只是GDT的用途之一。另一个主要用途是定义任务状态段的位置(用于查找IO端口权限映射,在中断引起的特权级别更改时加载到CS,SS和RSP的值等)。对于64位代码(以及在64位内核下运行的32位代码/进程),仍然可以使用GDT中定义的调用门,但是大多数操作系统不对64位代码使用该功能(他们改用FS
。
- 该页表中有一个主管位,用于指示当前位置是否用于内核。
是的。页表的超级用户位确定以CPL = 3运行的代码是否可以/不能访问该页面(或者代码是否必须为CPL = 2,CPL = 1或CPL = 0才能访问该页面)。
- 维基百科说:“ GDT仍以64位模式存在;必须定义GDT,但通常从不更改或将其用于分段。”
是-维基百科是正确的。通常,操作系统会在启动期间(针对TSS,CS,SS等)在启动初期设置GDT,然后在启动后无需任何理由对其进行修改。并且段寄存器不用于“分段存储器保护”(但用于其他用途-确定代码大小,是否中断处理程序应返回CPL = 0等等)。