2

据我所知,内核模式代码可以访问任何可用的地址(高权限),但是如果我将用户模式指针传递给内核模式函数,它会在使用之前被更改吗?我的意思是:它会像在用户模式下那样通过分页/分段系统(或仅针对长模式分页)来解决吗?

4

1 回答 1

4

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

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

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

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

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

于 2013-03-06T15:46:21.703 回答