Linux kernel CPL字段何时以及如何更改?

Linux kernel CPL字段何时以及如何更改?,linux-kernel,x86,cpu,Linux Kernel,X86,Cpu,处理器在CPL字段中保持当前权限级别。我想知道CPL字段从3变为0或从3变为0时所有可能的情况。例如,当用户进程调用系统调用时,CPL字段可能从3更改为0 此外,在CPL字段更改之前,请尝试详细说明内核/CPU内部发生了什么 注意:我读过一些文章,解释CPU如何使用CPL、RPL和DPL来实施保护。我无法理解CPL何时以及如何变化。这是一个非常深入的问题。答案取决于您正在查看的内核。通常,CPL只会在上下文切换(可能是从内核到用户空间的初始切换)和系统调用期间更改 内核需要在全局描述符表中设置u

处理器在CPL字段中保持当前权限级别。我想知道CPL字段从3变为0或从3变为0时所有可能的情况。例如,当用户进程调用系统调用时,CPL字段可能从3更改为0

此外,在CPL字段更改之前,请尝试详细说明内核/CPU内部发生了什么


注意:我读过一些文章,解释CPU如何使用CPL、RPL和DPL来实施保护。我无法理解CPL何时以及如何变化。

这是一个非常深入的问题。答案取决于您正在查看的内核。通常,CPL只会在上下文切换(可能是从内核到用户空间的初始切换)和系统调用期间更改

内核需要在全局描述符表中设置usermode(CPL 3)段。然后将段选择器(CS、DS、ES、FS、GS)设置为CPL=3段值

这里有一个很好的参考:


还可以看看英特尔手册。(特别是第3A卷,第5-7页是您需要的)

您想让我们只引用有关CPL领域的参考手册吗?或者什么?这是标记的linux内核。你是说不同的Linux内核版本还是自定义补丁?还是说像amd64和i386内核?(32位内核支持vm86模式…)啊,没有注意到linux内核标签。我是从x86标签来到这里的(今天刚刚加入,请原谅)。我想在linux中,唯一的区别是64位和32位。我不确定CPL的更改会受到多大影响,因为我相信x86_64中仍然使用段描述符表,但我必须回去查看英特尔手册。至于其他内核,微内核与单片内核在CPL发生变化时会产生一些影响,这取决于用户空间与内核空间中的系统进程。是的,x86_64仍然需要GDT。32位用户空间和64位用户空间有不同的条目,因为长模式和兼容模式以及地址大小等由CS索引的段描述符决定。欢迎来到SO,顺便说一句:)