没有MMU的内存保护

6
我想了解在没有MMU支持的情况下如何保护内存。我已经尝试过谷歌搜索,但没有看到任何有价值的论文或研究结果。那些处理这个问题的只是针对错误(例如未初始化的指针),而不是由于软件故障引起的内存损坏,即由于硬件瞬变故障损坏写入内存位置的指令。
我想了解这个问题的原因是因为我正在使用一个专有的多核平台,没有任何内存保护。现在我的问题是,是否可以使用软件来保护内存,特别是针对由软件故障引起的野指针写入(而不是程序员的错误)。非常感谢您的帮助。

Valgrind 不是你所需要的吗? - David Heffernan
我不需要它来进行调试,而是为了避免在运行时发生野指针写入导致内存损坏。基本上,我想要一个安全可靠的系统。 - MetallicPriest
4个回答

5
如果您正在寻找运行时内存保护,则唯一的选择是硬件支持。 硬件是在糟糕的内存访问造成损害之前干预的唯一方式。 任何软件解决方案都会容易受到它试图防止的内存错误的影响。
使用软件可以实现验证/检测方案。 您可以定期检查当前运行程序不应该访问的内存部分,并查看它们是否已更改(可能是通过对这些区域进行 CRC)。 但是,如果流氓程序损坏了校验和所在的区域或检查程序代码所在的区域,则所有赌注都无效。
即使是这个软件检查解决方案也更像是调试实用工具而不是永久的运行时保护。 没有 MMU 的设备通常是小型嵌入式设备,它们没有多余的周期来不断检查设备的内存。
通常,没有 MMU 的设备被设计为运行单个程序,没有内核或其他任何东西需要保护。 如果您需要运行多个程序并且感觉需要保护,则可能需要更高级的硬件来支持您正在寻找的功能。

1
如果内存保护可以在硬件中实现,那么它可能也可以在软件中实现。 - David Heffernan
1
@David:当然,通过模拟硬件。这时它只是一个虚拟机。然后实际硬件的速度就会发挥作用。假设这个人不想实现自己的虚拟机,因为那样有点疯狂。 - SoapBox
1
我同意所有的观点。我只是对你说“硬件是唯一的方法”这句话有些异议。也许你可以说硬件是唯一现实和明智的方法。就这样! - David Heffernan

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

什么样的支持?我的意思是,机制会是什么? - MetallicPriest
3
编译器通常会在每次访问内存时写入简单的读取或写入指令。但你需要用一个库函数调用替换每个这样的指令,以执行你所寻找的运行时保护。 - David Heffernan
如果你要走到那个极端,不如将你的程序移植到 Python 或 Lua 等语言上,这样你会获得更好的性能和类似的稳定性。 - Jeremy Friesner

1

MMU less系统存在于几个嵌入式解决方案中。

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

现在,这种实现必须处理的情况是,应用程序请求了特定大小的堆块,而该大小的堆列表已满。在这种情况下,您可以从下一个堆列表的大小中拆分一个块,或者将较小的堆块组合在一起,添加到请求的堆列表中。

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


0

取决于将在哪个应用程序平台上运行。有称为类型安全语言(例如ATS)的技术,可以保护软件免受错误的影响。而且这些语言可能具有良好的性能(如ATS再次)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接