经过长时间的阅读,我真的很困惑。据我所知:
-
现代操作系统根本不使用分段。
-
GDT用于定义内存中的一个段(包括约束(。
-
页面表有一个supervisor位,指示当前位置是否用于内核。
-
维基百科说";GDT仍然以64位模式存在;必须定义GDT,但通常永远不会更改或用于分割">
我们为什么需要它?linux是如何使用它的?
- 现代操作系统根本不使用分段
现代操作系统(适用于64位80x86(仍然使用段寄存器;只是它们的用途是";大部分是隐藏的";来自用户空间(并且大多数用户空间代码可以忽略它们(。明确地CPU将从OS(从GDT或LDT(加载到CS
中的任何操作系统确定代码是否为64位(或32位或16位(,中断仍然为中断的代码保存CS
和SS
(并在iret
处再次加载它们(,GS
和/或FS
通常用于线程本地和/或CPU本地存储,等等
- GDT用于定义内存中的段(包括约束(
代码和数据段只是GDT的用途之一。另一个主要用途是定义任务状态段的位置(用于查找IO端口权限映射、在中断导致权限级别更改时加载到CS、SS和RSP的值等(。64位代码(以及在64位内核下运行的32位代码/进程(仍然可以使用GDT中定义的调用门,但大多数操作系统对64位代码不使用该功能(而是使用syscall
(。
- 页面表有一个supervisor位,指示当前位置是否用于内核
是。页面表的监督位确定以CPL=3运行的代码是否可以/不能访问页面(或者代码必须为CPL=2、CPL=1或CPL=0才能访问页面(。
维基百科说"GDT仍然以64位模式存在;必须定义GDT,但通常永远不会更改或用于分割">
是的-维基百科是对的。通常,操作系统会在引导过程中提前设置GDT(对于TSS、CS、SS等(,然后在引导后没有任何理由修改它;并且段寄存器不用于";分段存储器保护";(但用于其他事情——确定代码大小,中断处理程序是否应返回CPL=0,等等(。