【问题标题】:Meaning of CS and SS registers on x86-64 Linux in userland?用户态 x86-64 Linux 上 CS 和 SS 寄存器的含义?
【发布时间】: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


【解决方案1】:

在 64 位模式下,段寄存器仍然指向 IDT 或 GDT 条目。但是 IDT/GDT 条目只包含有限的信息:

数据段选择器(对 DS、ES、SS、FS 和 GS 有效)仅包含一个位:“P”位表示该段存在。这仅对加载到 FS 和 GS 寄存器中的段有意义。

代码段选择器(对 CS 有效)包含访问权限信息和表示当 CS 指向此类段时 64 位模式处于活动状态的长模式位。

段基数和段长度不存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-24
    • 2012-01-28
    • 2018-01-21
    • 2011-12-12
    • 2012-06-25
    相关资源
    最近更新 更多