CS 和 DS 寄存器是否仍然影响 x64 intel 中的指令

Syl*_*ent 1 windows assembly kernel x86-64 memory-segmentation

Afaik 他们从未使用过,现在 CS=DS=SS。但是,如果我要设置这些值,会发生任何变化还是处理器会忽略它们。我在这个问题上发现了非常矛盾的信息,我不明白如果它们被忽略为什么它们仍然存在。请帮助

prl*_*prl 5

是的,段寄存器仍然影响代码执行。

问题和一些评论似乎没有区分选择器值和基地址。为了清楚地理解您正在阅读的有关此主题的一些明显相互矛盾的信息,您需要确保您识别出正在讨论的是哪个信息。

CS 选择器不能为 0。它必须引用 GDT 或 LDT 中的有效代码段描述符。代码段描述符的 L 位控制当前进程是 64 位模式还是 32 位兼容模式。

CS(选择器)不能等于 DS 和 SS。CS 必须指代一个代码段,而 DS 和 SS 必须指代数据段(可能是同一个)。DS 和 SS 选择器允许为 0(这将导致 32 位模式下的 GP 故障)。

的段寄存器中的主要方面是还有一个效果是基地址和段限制; CS、DS、ES、SS的基地址都被当作0处理,64位代码没有段限制检查。这就是你看到人们说他们被忽视的原因。

正如 Margaret 所提到的,当前特权级别 (CPL) 位于 CS 和 SS 选择器寄存器的低 2 位以及 GDT 中描述符的 DPL 位。这些位应该是 0 或 3,因为据我所知,当前没有操作系统使用环 1 和环 2。

另一个小问题是,如果使用 SS 段执行内存访问(因为在指令操作数中使用 RBP 或 RSP 作为基址寄存器),则由内存访问引起的某些错误会报告为堆栈错误而不是 GP 错误。

  • “[rbp]”寻址模式的非规范地址将被报告为“#SS”堆栈错误*即使您使用 DS 前缀*。即前缀确实被忽略了。在[为什么在64位模式下使用'DS:'段覆盖非法?](//stackoverflow.com/q/50400274)我引用了Intel手册第1卷3.3.7.1规范寻址对此:DS和据此,SS 段覆盖确实被忽略了。它是双向的;在确定发生哪种故障时,SS 和 DS 前缀都会被忽略。 (2认同)