根据我的阅读,在现代操作系统(包括Windows和Linux)上,不使用CS,DS等段寄存器。我的问题是:
如果是这种情况,那么段存储器存储在哪里?
每个帖子都有自己的段选择器吗?
答案 0 :(得分:1)
你读到的内容过于简化了。
必须使用段寄存器使CPU在受保护/长模式下工作,它们不能用于任何有趣的。 (FS or GS being used for thread-local storage除外)。现代操作系统使用平坦的内存模型,其中所有段都具有base = 0和limit = 4GiB(在64位模式下,HW忽略基数和限制,FS / GS除外)。
CS选择的代码段描述符确定进程是在64位内核下以长模式还是在compat模式下运行。 (描述符中的L位)。请参阅http://wiki.osdev.org/GDT。
所有32位进程使用相同的CS值,而所有64位进程使用相同的CS值(但与32位进程不同)。现代操作系统并不总是保存/恢复所有段寄存器,例如在系统调用后返回用户模式时,某些Linux的返回路径使用常量__USER32_CS
或__USER_CS
。还有__USER_DS
常量用于初始化DS和ES,因此他们选择了有效的描述符。 (请参阅this answer中有关系统调用返回路径的一些链接和注释。)