内核模式 - 它可以访问用户模式吗?

时间:2013-03-06 15:36:07

标签: memory kernel usermode

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

1 个答案:

答案 0 :(得分:3)

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

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

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

在任何情况下,内核代码都必须明确地完成所有这些操作,没有任何关于它的“自动”。当然,你的系统调用可以通过抽象层来实现自动化,然后到达你的内核模块。

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