在x86-64 Linux用户空间中,CS和SS寄存器的含义是什么?

4

当内核在第一次启动x86-64 CPU上的本地用户空间Linux应用程序时,除了RSP和RIP具有其通常含义外,大多数寄存器都为零,而CS SS和R11寄存器不为零:

cs             0x33 51
ss             0x2b 43
r11            0x200    512

我的理解是,在x86-64中,由于长模式下采用的是平坦的64位地址模型,CS和SS寄存器是未使用的。

内核与CS和SS寄存器有关吗?用户空间是否应该直接忽略它们?

此外,R11中的初始512值是否具有任何含义?


CS仍然用于特权级别和其他模式位。你确定你在64位模式下吗? - Leeor
@Leeor:ELF头指定了x86-64架构,内核也是x86-64的,mmaps显示为64位地址。我假设用户空间的初始状态将是64位模式? - Andrew Tomazos
@Leeor:你能从gdb中确定应用程序处于什么模式吗? - Andrew Tomazos
3
info target 命令可以告诉你当前处于32位还是64位模式。在32位模式下,无法访问64位寄存器,所以如果你看到了任何64位寄存器,那么你实际上就处于64位模式。r11 泄漏了 rflags 寄存器的信息。 - Jester
如果真的处于64位模式,我期望CS.L位被切换(正如Martin所说),并且它在低字节之上。但是我不确定GDB是否会正确打印这些位。无论如何,Jesters的建议听起来最好。 - Leeor
超集: https://dev59.com/9lzUa4cB1Zd3GeqP3HDu - Ciro Santilli OurBigBook.com
1个回答

8
在64位模式下,段寄存器仍指向IDT或GDT条目。然而,IDT / GDT条目仅包含有限的信息:
数据段选择器(对DS,ES,SS,FS和GS有效)只包含一个位:表示段存在的“P”位。这只对加载到FS和GS寄存器中的段有意义。
代码段选择器(对CS有效)包含访问权限信息和长模式位,指示当CS指向此类段时64位模式处于活动状态。
段基址和段长度不存在。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接