当使用sysenter
进行系统调用(从环3到环0的交换机执行)时,这就是CS和SS的设置方式:
CS = IA32_SYSENTER_CS
SS = IA32_SYSENTER_CS + 8
无论我从各种来源读到什么,都没有提到设置数据段寄存器(DS)。使用sysenter
时为什么不更改DS?要访问任何数据,是否会使用DS的旧值?
(我对此非常陌生,所以请指出我在理解这一点时可能犯的任何错误)
答案 0 :(得分:1)
ds
和其他数据段寄存器不会自动更改,因为它们不需要。 sysenter
旨在尽可能简单,以便尽快执行。作为其中的一部分,许多事情都没有完成,包括更新大多数段寄存器和保存返回地址。如果操作系统需要完成这些操作,则必须手动进行任何更改。
段寄存器完全有可能不需要更改。如果操作系统在64位模式下运行,则大多数分段未使用,因此不需要更改ds
。对于任何模式,如果请求的操作很简单,则可能不需要涉及堆栈外部访问的任何内容,因此ds
将再次未使用。