21

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

4

2 回答 2

33

这些函数做了一些事情:

  • 他们检查提供的用户空间块是否完全在地址空间的用户部分(access_ok()) - 这可以防止用户空间应用程序要求内核读/写内核地址;
  • EFAULT如果任何地址不可访问,它们会返回错误,允许将错误返回到用户空间(在用户内存访问功能之一中);
  • 它们允许特定于体系结构的魔法,例如确保具有虚拟标记缓存的体系结构的一致性、禁用 SMAP 等保护或在具有单独用户/内核地址空间(如 S/390)的体系结构上切换地址空间。
于 2012-10-01T01:27:45.700 回答
13

这些函数检查内存是否可访问。如果内核试图直接访问一个不可访问的地址,它就会panic。但此外,内核和用户地址空间可能不同......用户地址空间中的有效地址可能无法在内核中访问,如果是,它可能指向内核内容而不是用户内容。

有关更多详细信息,请参阅 https://developer.ibm.com/articles/l-kernel-memory-access

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

于 2012-10-01T01:13:54.730 回答