【发布时间】:2013-10-30 10:30:35
【问题描述】:
内核在第一次进入时加载本地用户态 Linux 应用程序后,x86-64 CPU 寄存器大多为零,除了具有通常含义的 RSP 和 RIP,寄存器 CS SS 和 R11 非零:
cs 0x33 51
ss 0x2b 43
r11 0x200 512
据我了解,CS 和 SS 寄存器在 x86-64 上未使用,因为在长模式下,我们有一个平坦的 64 位地址模型。
CS 和 SS 寄存器对内核有什么意义吗?用户空间是否应该让他们独自一人?
R11 中的初始 512 值也意味着什么?
【问题讨论】:
-
CS 仍用于特权级别和其他模式位。你确定你使用的是 64 位模式吗?
-
@Leeor:嗯,ELF 标头指定了 x86-64 架构,内核是 x86-64,mmap 以 64 位地址显示。我假设用户空间的初始状态是 64 位模式?
-
@Leeor:你能从 gdb 中确定应用程序处于什么模式吗?
-
info target会告诉您它是处于 32 位还是 64 位模式。此外,您将无法在 32 位模式下访问 64 位寄存器,因此如果您看到任何内容,则意味着您实际上处于 64 位模式。r11正在泄漏rflags。 -
如果真的在 64 位模式下,我希望 CS.L 位会被切换(正如 Martin 所说的那样),并且在低字节之上。但是,我不确定 GDB 是否会打扰正确打印这些位。无论如何,Jesters 的建议听起来最好。
标签: linux assembly linux-kernel x86 x86-64