【问题标题】:where is segment selector stored for context switching. (x86)用于上下文切换的段选择器存储在哪里。 (x86)
【发布时间】:2018-06-22 08:17:57
【问题描述】:

据我所知,在包括 Windows 和 linux 在内的现代操作系统上,不使用 CS、DS 等段寄存器。我的问题是:

  1. 如果是这样,段选择器存储在哪里?

  2. 每个线程都有自己的段选择器吗?

【问题讨论】:

    标签: x86 operating-system cpu memory-segmentation


    【解决方案1】:

    您阅读的内容过于简单。

    必须使用段寄存器来使 CPU 在受保护/长模式下工作,它们只是不用于任何有趣的事情。 (FS or GS being used for thread-local storage 除外)。现代操作系统使用平面内存模型,其中所有段的 base=0 和 limit=4GiB(在 64 位模式下,硬件忽略 base 和 limit,FS/GS 除外)。

    CS 选择的代码段描述符决定了进程是在 64 位内核下运行在长模式还是兼容模式。 (描述符中的 L 位)。见http://wiki.osdev.org/GDT

    所有 32 位进程使用相同的 CS 值,而所有 64 位进程使用相同的 CS 值(但与 32 位进程不同)。现代操作系统并不总是保存/恢复所有段寄存器,例如在系统调用后返回用户模式时,一些 Linux 的返回路径使用常量__USER32_CS__USER_CS。还有一个__USER_DS 常量用于初始化 DS 和 ES,以便它们选择一个有效的描述符。 (请参阅this answer 中系统调用返回路径上的一些链接和 cmets。)

    【讨论】:

    • 现代操作系统使用平面内存模型。那么保护在用户模式和内核模式之间是如何工作的呢?你能详细说明一下吗?谢谢
    • @c.critter virtual memory,其中操作系统管理page tables。用户空间只能读/写操作系统映射到其虚拟地址空间的页面。
    猜你喜欢
    • 2018-05-29
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多