Syl*_*ent 1 windows assembly kernel x86-64 memory-segmentation
Afaik 他们从未使用过,现在 CS=DS=SS。但是,如果我要设置这些值,会发生任何变化还是处理器会忽略它们。我在这个问题上发现了非常矛盾的信息,我不明白如果它们被忽略为什么它们仍然存在。请帮助
是的,段寄存器仍然影响代码执行。
问题和一些评论似乎没有区分选择器值和基地址。为了清楚地理解您正在阅读的有关此主题的一些明显相互矛盾的信息,您需要确保您识别出正在讨论的是哪个信息。
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 错误。
| 归档时间: |
|
| 查看次数: |
689 次 |
| 最近记录: |