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

时间:2012-10-01 01:09:47

标签: linux-kernel

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

2 个答案:

答案 0 :(得分:24)

这些功能做了一些事情:

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

答案 1 :(得分:11)

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

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

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