Process 页表中SUP位的含义

Process 页表中SUP位的含义,process,kernel,x86-64,paging,page-tables,Process,Kernel,X86 64,Paging,Page Tables,页表条目属性之一是SUP位。 我在几份文件中读到: “如果设置了SUP,则只有处于内核模式的进程才能访问该页面。如果未设置SUP,则处于用户模式的进程可以访问该页面。” 我发现这句话令人困惑,因为内核模式下的进程可以是运行用户程序的进程,也可以是内核程序(用户进程vs系统进程)。那么,这句话指的是什么?或者,只要进程当前在内核模式下执行,这两者都可以吗 如果该语句还涉及运行用户程序的进程(用户进程),那么我们已经知道只有当进程切换到内核模式时才能进行内存访问,那么就不需要SUP位 我的猜测是SU

页表条目属性之一是SUP位。 我在几份文件中读到:

“如果设置了SUP,则只有处于内核模式的进程才能访问该页面。如果未设置SUP,则处于用户模式的进程可以访问该页面。”

我发现这句话令人困惑,因为内核模式下的进程可以是运行用户程序的进程,也可以是内核程序(用户进程vs系统进程)。那么,这句话指的是什么?或者,只要进程当前在内核模式下执行,这两者都可以吗

如果该语句还涉及运行用户程序的进程(用户进程),那么我们已经知道只有当进程切换到内核模式时才能进行内存访问,那么就不需要SUP位


我的猜测是SUP位意味着这个页面只能由系统进程访问(不包括在内核模式下运行的用户进程),但我不确定,因为我不知道内核代码是如何存储在内存中的,是否分页以及如何分页。

这只是检查CPU是否处于ring0状态。CPU并不真正了解进程:如何进入环0并不重要,只是CPU当前正在执行内核代码。(即可以运行特权指令)

有关详细信息,请参见玛格丽特更详细的回答


是的,所有对内存的访问,甚至在内核内部,都是通过将内存映射到一个虚拟地址来实现的。内核不会临时禁用分页以访问特定的物理地址。请注意,Linux(和许多其他内核)将内核页锁定在内存中,不将它们交换到磁盘,但它们仍然被分页。

如果您对英特尔CPU的工作有任何疑问,请咨询,而不是任何随机的internet页1

第4.6节描述了分页访问权限


CPU区分地址和访问(地址)的权限,每个权限都是用户模式或主管模式(其中主管模式的权限更高)

访问模式

对线性地址的每次访问都是主管模式访问用户模式访问。通俗易懂 获取和大多数数据访问,此区别由当前权限级别(CPL)决定:进行的访问 CPL<3时为管理模式访问,CPL=3时为用户模式访问。
一些操作使用线性地址隐式访问系统数据结构;由此产生的对这些数据的访问 无论CPL如何,数据结构都是管理模式访问
[…]
所有这些访问都称为隐式监控模式 访问与CPL无关。当CPL<3时进行的其他访问称为显式监控模式访问

因此,当程序访问内存位置时,其CPL决定访问模式,用户程序以CPL=3运行,因此它们只执行用户模式访问。
内核在CPL=0时执行管理器模式访问

地址模式

访问权限也由分页结构项指定的线性地址模式控制 控制线性地址的转换如果U/S标志(位2)在至少一个分页结构中为0 输入时,地址为主管模式地址。否则,该地址为用户模式地址

SUP位,正式称为U/S,然后确定地址的模式。
因为它也存在于PDE中(不仅在PTE上),所以想法是采用更严格的设置,因此在任何级别的一个条目中设置U/S就足以使地址成为一个管理模式

访问权限

始终禁止用户模式访问主管模式地址,并在尝试时生成异常

通常允许访问相同的模式地址2和较低的模式地址3,但它们并不相等,而且有多种标志改变CPU5的行为

其思想是,主管模式访问可以做任何他们想做的事情,并且为了减少攻击者可用的表面攻击,有一些机制可以降低访问权限


1包括这个。
2用户模式访问用户模式地址,主管模式访问主管模式地址。
3管理员模式访问用户模式地址。
4个管理员访问可以写入只读页面。

5例如,CR0.WP标志禁用对只读页面的写入访问,以进行管理者访问,NXE位禁用从设置了XD的页面提取。

因此有两个不同的位。用于执行进程的CPL的CPU寄存器。和PTE中的S/U位。如果CPL=3,我们是否应该拒绝访问内存,而不管S/U的值位是多少?如果CPL=0,则检查S/U位值。所以1)如果CPL=0,S/U=0,这是一个内核进程(不确定如何确定),那么允许访问。2) 如果CPL=0且S/U=1,并且这是一个内核进程,则允许访问。3) 如果CPL=0,S/U=1,这是一个用户进程,那么访问是允许的。我想我的困惑在于案例2:用户模式访问用户模式地址。为什么允许在用户模式下运行的用户进程访问memeory。CPL=3中不允许所有内存访问吗?要做到这一点,用户进程需要在内核模式下运行?@ijuio程序需要访问自己的内存。请记住,流程之间的隔离是通过不完全映射其他流程页面来实现的。因此,允许用户程序访问用户模式地址是安全的,内核仍然通过选择要访问的内容来限制它