为什么必须使用copy_to_user()/ copy_from_user()从内核访问用户空间?

the*_*ine 19 linux-kernel

我很好奇,因为我在尝试直接访问内存后遇到内核恐慌(然后我发现了这些功能).

caf*_*caf 28

这些函数做了一些事情:

  • 它们检查提供的用户空间块是否完全在地址空间的用户部分内(access_ok()) - 这可以防止用户空间应用程序要求内核读/写内核地址;
  • 如果任何地址不可访问,它们会返回错误,允许将错误返回给用户空间(EFAULT)而不是崩溃内核(这是通过与页面错误处理程序的特殊协作实现的,特别是可以检测何时发生错误在其中一个用户存储器访问功能中);
  • 它们允许特定于体系结构的魔术,例如确保具有虚拟标记高速缓存的体系结构的一致性,禁用SMAP等保护或使用单独的用户/内核地址空间(如S/390)在体系结构上切换地址空间.


Jim*_*ter 12

这些函数检查内存是否可访问.如果内核试图直接访问不可访问的地址,它将会出现恐慌.但另外,内核和用户地址空间可能不同......用户地址空间中的有效地址可能无法在内核中访问,如果是,则可能指向内核而不是用户内容.

有关更多详细信息,请访问http://www.ibm.com/developerworks/linux/library/l-kernel-memory-access/index.html

从历史的角度来看:曾经有一些操作系统将内核设计为用户地址空间的一部分,在这些系统中,内核总是可以直接访问用户空间.可能仍然有这样的系统,但现代的Linux不是一个.当然,用户进程的内存作为内核地址空间的一部分始终是实现的选项,这可以使copy_to_user和copy_from_user更快.

  • 实际上,在大多数体系结构中,现代Linux*确实*使用统一的用户/内核地址空间 - 例如x86-64.有一些例外,例如x86架构的4G/4G配置选项,但是存在很大的开销. (10认同)