没有MMU的内存保护

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

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

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

使用软件,您可以实施validation/检测方案。 您可以定期检查当前正在运行的程序无法访问的内存部分,看看它们是否已更改(可能是通过CRC这些区域)。 但当然,如果流氓程序损坏了校验和所在的区域,或者核查程序的代码被保留,那么所有的赌注都将被取消。

即使这种软件检查解决方案也不仅仅是一个调试工具,而是一个永久运行时保护。 没有MMU的设备可能是一个小型嵌入式设备,它不会有备用周期来不断检查设备的内存。

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

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

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

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

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

实现比看起来简单得多。

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