【问题标题】:How are memory read, write, execute permissions enforced in the Linux kernel?Linux 内核中如何强制执行内存读取、写入、执行权限?
【发布时间】:2015-07-25 08:33:01
【问题描述】:

系统如何限制进程写入只读的内存区域?特别是,假设硬件能够为内核完成这项工作,Linux 内核如何能够强制执行这些权限?

我最初的猜测是这些内存区域没有映射到进程的地址空间,所以每当进程尝试访问这些内存区域时,就会产生一个页面错误,它允许内核控制检查一切是否正常为了。我意识到这可能会大大降低性能,所以我在这里寻求帮助,了解是否有更智能的方法来强制执行这些权限。

【问题讨论】:

  • SuperUser 可能更适合回答这个问题。
  • 我也会尝试在那里询问。非常感谢。
  • 什么样的MMU不支持页面上的“只读”权限,Linux甚至可以在上面运行?无论如何,您最初的猜测是正确的,是的,考虑到程序代码通常被映射为只读,这将非常慢。我认为这样的架构不会找到很多客户。

标签: memory-management linux-kernel


【解决方案1】:

强制执行内存保护的任务由 MMU 处理。我不知道任何具有 MMU 但没有硬件支持内存权限的架构。因此,我想我们在这里讨论的是无 MMU 系统。

长期以来,Linux 都需要 MMU 才能工作。如果您愿意,它仍然可以,但它是对 MMU-less 系统的一些支持。它来自前段时间在上游合并的 uClinux 项目。但是,使用NOMMU 编译的系统不像普通的 Linux 系统那样工作(很多应用程序无法在其上工作),并且没有内存保护是它的限制之一。

直接回答您的问题 - Linux 上的内存保护取决于对它的硬件支持。如果它不存在,内核将不会尝试模拟它。

现在您的想法似乎很好(如果不切实际),但为了做到这一点,您仍然需要虚拟内存支持,这需要某种 MMU。如前所述,我认为没有任何系统具有 MMU 但不支持内存保护。无论哪种方式,Linux 似乎都不支持这种情况。

【讨论】:

    【解决方案2】:

    有四种方法可以防止非分段系统中的内存访问以限制对页面的访问。

    1. 没有特定地址的页表条目(用嵌套页表很容易做到)。

    2. 该页面没有页面映射。

    3. 页表按模式限制访问。例如,不允许用户模式访问但允许内核模式。

    4. 页表按类型(写入、执行)限制访问。

    设置页表是在硬件中完成的。验证对表的访问是在硬件中完成的。

    【讨论】:

      猜你喜欢
      • 2016-11-26
      • 2019-02-07
      • 2011-08-09
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多