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



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

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

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

  3. 页面表有一个supervisor位,指示当前位置是否用于内核。

  4. 维基百科说";GDT仍然以64位模式存在;必须定义GDT,但通常永远不会更改或用于分割">

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

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

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

  1. GDT用于定义内存中的段(包括约束(

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

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

是。页面表的监督位确定以CPL=3运行的代码是否可以/不能访问页面(或者代码必须为CPL=2、CPL=1或CPL=0才能访问页面(。

  • 维基百科说"GDT仍然以64位模式存在;必须定义GDT,但通常永远不会更改或用于分割">
  • 是的-维基百科是对的。通常,操作系统会在引导过程中提前设置GDT(对于TSS、CS、SS等(,然后在引导后没有任何理由修改它;并且段寄存器不用于";分段存储器保护";(但用于其他事情——确定代码大小,中断处理程序是否应返回CPL=0,等等(。

    相关内容

    • 没有找到相关文章

    最新更新