【发布时间】:2018-06-22 08:17:57
【问题描述】:
据我所知,在包括 Windows 和 linux 在内的现代操作系统上,不使用 CS、DS 等段寄存器。我的问题是:
如果是这样,段选择器存储在哪里?
每个线程都有自己的段选择器吗?
【问题讨论】:
标签: x86 operating-system cpu memory-segmentation
据我所知,在包括 Windows 和 linux 在内的现代操作系统上,不使用 CS、DS 等段寄存器。我的问题是:
如果是这样,段选择器存储在哪里?
每个线程都有自己的段选择器吗?
【问题讨论】:
标签: x86 operating-system cpu memory-segmentation
您阅读的内容过于简单。
必须使用段寄存器来使 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。)
【讨论】: