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

问题描述 投票:1回答:1

Afaik,它们从未使用过,如今CS = DS = SS。但是,如果我要设置这些值,则是否有任何更改或处理器会忽略它们。我已经发现有关该问题的信息确实矛盾,而且我不明白为什么如果忽略它们,它们仍会存在。帮助请

windows assembly kernel x86-64 memory-segmentation
1个回答
3
投票

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

问题和某些注释似乎无法区分选择器值和基地址。为了清楚地了解您正在阅读的有关此主题的一些明显矛盾的信息,您需要确保您知道正在讨论的信息。

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位中。据我所知,因为当前没有操作系统使用环1和2,所以这些位应该为0或3。

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

© www.soinside.com 2019 - 2024. All rights reserved.