了解Linux内核(https://www.amazon.in/Understanding-Linux-Kernel-Process-Management-ebook/dp/B0043D2E54)提到以下内容:
如前所述,CPU的当前特权级别指示处理器是处于用户模式还是内核模式,并由存储在cs寄存器中的段选择器的RPL字段指定。每当更改CPL时,必须相应地更新一些分段寄存器。
例如,当CPL等于3(用户模式)时,ds寄存器必须包含用户数据段的段选择器,但当CPL等于0时,ds寄存器必须包含内核数据段的段选择器。
ss寄存器也出现类似的情况。当CPL为3时,它必须引用用户数据段内的用户模式堆栈,当CPL为0时,它必须引用内核数据段内的内核模式堆栈。当从用户模式切换到内核模式时,Linux始终确保ss寄存器包含内核数据段的段选择器。
基于以上所述,我几乎没有问题:
1)用于存储在其他分段寄存器中的段选择器中的RPL是什么?
2)当系统调用代表用户进程执行时,cs中的RPL将设置为3(Difference between DPL and RPL in x86)。在这种情况下,数据段(ds)是否包含__USER_DS而不是__KERNEL_DS,如果是这样,系统调用的实现如何才能访问内核数据结构等?