内核模式 - 是否可以访问用户模式?

问题描述:

据我所知,内核模式代码可以访问任何可用的地址(高特权),但是如果我将用户模式指针传递给内核模式函数,在使用它之前它会被更改吗?我的意思是:它会像寻呼/分段系统一样解决(或只是寻找长模式),就像在用户模式下一样?内核模式 - 是否可以访问用户模式?

首先,你不“提供一个指向内核模式函数的指针”。内核调用不是简单的跳转,它们是特殊指令或软件中断。内核函数调用约定也与通常的函数调用不同。

无论如何,从内核上下文访问用户内存的工作方式取决于所讨论的操作系统。内核通常拥有自己的(虚拟)地址空间。这可以是与用户进程空间(例如32位OSX)完全独立的地址空间,也可以位于特殊区域(在许多操作系统中分割为高/低地址)。在高/低模式中,内核通常可以在指向该用户空间的指针取消引用的同时在该进程的上下文中执行该指针。在一般情况下,内核可以显式查找用户虚拟地址引用的底层物理内存,然后将其映射到其自己的虚拟地址空间中。

由于用户空间可能恶意提供坏指针,因此如果没有首先检查有效性,内核就不能使用它们。对于用户进程的内存映射,这个和后续的访问必须是原子的,否则进程可能会在内核的指针有效性检查和实际读取/写入内存之间的时间范围内。由于这个原因,大多数内核都有助手函数,在用户空间和内核空间之间本质上是安全的memcpy,在无效指针的情况下保证安全或返回错误。

在任何情况下,内核代码都必须明确地做到这一点,没有什么是“自动”的。当然,您的系统调用可能会通过抽象层,在到达内核模块之前自动执行此操作。

更新:现代硬件支持SMAP(管理员模式访问阻止),旨在防止从内核意外/恶意取消指向用户地址空间的指针。各种操作系统已经开始启用该功能,因此在这些情况下,您绝对必须通过访问用户内存的特殊内核功能。