【问题标题】:Memory Protection without MMU没有 MMU 的内存保护
【发布时间】:2011-08-28 11:33:21
【问题描述】:

我想知道在没有 MMU 支持的情况下如何保护内存。我试图用谷歌搜索它,但没有看到任何有价值的论文或研究。而那些处理它的只处理错误,例如未初始化的指针,而不是由于软错误导致的内存损坏,即由于硬件瞬态错误破坏了写入内存位置的指令。

我想知道这一点的原因是因为我正在开发一个没有任何内存保护的专有多核平台。现在我的问题是,是否可以使用软件来保护内存,特别是对于由于软错误(而不是程序员的错误)导致的疯狂写入。对此的任何帮助将不胜感激。

【问题讨论】:

  • 不会 valgrind 做你需要的吗?
  • 我不需要它来调试,但要避免在运行时疯狂写入损坏内存。基本上我想要一个安全可靠的系统。

标签: c memory memory-management


【解决方案1】:

如果您正在寻找运行时内存保护,唯一明智的选择是硬件支持。硬件是在坏内存访问造成损坏之前干预它的唯一方法。任何软件解决方案都容易受到它试图防止的内存错误的影响。

借助软件,您可以实施验证/检测方案。您可以定期检查当前正在运行的程序不应访问的内存部分,并查看它们是否已更改(可能通过对这些区域进行 CRC 校验)。但是当然,如​​果流氓程序损坏了保存校验和的区域,或者保存检查程序代码的区域,那么所有的赌注都没有了。

即使是这种软件检查解决方案,它也更像是一种调试实用程序,而不是永久的运行时保护。没有 MMU 的设备很可能是小型嵌入式设备,它没有空闲周期来不断检查设备的内存。

通常没有 MMU 的设备被设计为运行没有内核或其他任何东西的单个程序,因此没有什么需要保护的。如果您需要运行多个程序并觉得需要保护,您可能需要更先进的硬件来支持您正在寻找的功能。

【讨论】:

  • 如果内存保护可以在硬件中实现,那么它大概可以在软件中实现。
  • @David:当然,通过模拟硬件。那时它只是一个虚拟机。然后实际硬件的速度开始发挥作用。大概这家伙对实现他自己的虚拟机不感兴趣,因为那太疯狂了。
  • 我同意所有这些。我只是不同意你说硬件是唯一的方法。也许你可以说硬件是唯一现实或理智的方式。就是这样!
【解决方案2】:

如果您希望软件实现内存保护,那么您将需要编译器及其相关库的支持。我希望这个平台上只有一个编译器,所以你应该联系供应商。我不会对积极的回应抱太大希望。即使他们有这样的工具,我预计软件内存保护的性能也无法接受。

【讨论】:

  • 什么样的支持。我的意思是,机制是什么?
  • 编译器通常会在每次访问内存时编写一个简单的读或写指令。但是您需要将每条此类指令都替换为对执行您正在寻找的运行时保护的库函数的调用。
  • ... 如果您要走极端,您不妨将程序移植到例如Python 或 Lua 并完成它。您将获得更好的性能和可能类似的稳定性。
【解决方案3】:

MMUless 系统出现在多个嵌入式解决方案中。

内存由内核代码管理。整个内存(堆)被划分为各种大小的堆列表(堆列表的大小可以是 4 字节、8 字节、16 字节......最多 1024 字节),并且每个堆块都有一个标头,用于说明是否特定的堆块是否被占用。因此,当您需要分配新的堆块时,您可以浏览堆列表并查看哪些堆块是空闲的,并将它们分配给请求的应用程序。当您释放特定大小的堆块时,情况也是如此,该块的标头会更新以反映它已被释放。

现在,当应用程序请求特定大小的堆块并且堆列表的大小已满时,此实现必须处理这种情况。在这种情况下,您从下一个大小的堆列表中分解一个块或将较小大小的堆块连接在一起并添加到请求大小的堆列表中。

实现比看起来要简单得多。

【讨论】:

    【解决方案4】:

    取决于将运行的应用程序平台。有一种称为类型安全语言(例如 ATS)的技术可以防止软件错误。并且此类语言可能具有良好的性能(例如 ATS)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 2013-06-05
      • 2013-03-24
      • 1970-01-01
      • 2017-12-09
      相关资源
      最近更新 更多