Linux kernel 为什么可以';t内核直接访问用户进程地址

Linux kernel 为什么可以';t内核直接访问用户进程地址,linux-kernel,operating-system,Linux Kernel,Operating System,本文 表示如果内核想要访问物理页,它需要将其映射到内核空间中的线性地址(到高内存区域) 假设页面已经被一个用户进程映射,内核是否可以直接使用用户进程页面表访问该页面(因为它们共享同一个页面表)?为什么内核必须再次映射它 假设页面已经被一个用户进程映射,内核是否可以直接使用用户进程页面表访问该页面(因为它们共享同一个页面表) 是的,在您检查之后,您可以取消对它的引用。内核有copy_u(to | from)\u用户helpers来封装它 为什么内核必须再次映射它 通常,当您需要处理物理地址时,比如

本文

表示如果内核想要访问物理页,它需要将其映射到内核空间中的线性地址(到高内存区域)

假设页面已经被一个用户进程映射,内核是否可以直接使用用户进程页面表访问该页面(因为它们共享同一个页面表)?为什么内核必须再次映射它

假设页面已经被一个用户进程映射,内核是否可以直接使用用户进程页面表访问该页面(因为它们共享同一个页面表)

是的,在您检查之后,您可以取消对它的引用。内核有
copy_u(to | from)\u用户
helpers来封装它

为什么内核必须再次映射它

通常,当您需要处理物理地址时,比如与内存映射设备交互时,您将无法在用户空间中找到已映射的页面。如果它不在页面表所在的低内存区域内,则必须映射它们


请注意,对于64位系统,这不再是一个问题,因为您有足够的位使所有内容都具有较低的内存。

如果在用户空间中映射页面,则该页面可能缺少适当的权限(在页面表条目中设置的位),因此需要新的映射。您是指S/U位吗?如果CPU在管理器(环0)上,它不能读取/执行环3中的数据/指令吗?我相信当CPL=0时,所有页面都是可寻址的。当用户空间进程需要分配更多内存时,它(在内核空间映射页面)也会发生吗?在任何情况下,为什么内核不能直接修改页面表的用户进程部分,而不是将其映射到内核空间?我不确定我是否遵循了这一点。如果内核需要一个映射,它通常不会让用户空间访问它。如果用户空间请求映射(例如通过
mmap
),内核将允许用户空间访问该映射。