为没有MMU的处理器编写多任务操作系统


9

我一直在考虑为某些ARM处理器编写一个业余操作系统。有很多流行的带有ARM MPU的单板计算机,所以我只想购买其中一台(选择一本带有更开放的文档)。当我发现即使内存确实足够的板卡也没有带有内存管理单元的MPU时,我感到很惊讶。

由于我一直在使用i386 +处理器,除其他一些Microchip PIC之外,什么都没有,所以我现在很困惑,不确定是否可以编写一个工作正常的操作系统,与编写的OS相比,其功能不会受到限制。用于带有MMU的MPU。

我可以想到一些“替换”或“模拟” MMU的解决方案,但我有几个问题:

  • 在16位和32位模式的Intel处理器上,存在一种使用段和段选择器通过不同任务使用不同内存块的方法。这意味着在x86上执行任务切换时,可以通过更改段寄存器的内容来更改内存空间。是否有可用于ARM体系结构的内存分段的一般概念?
  • 通过加载链接的目标文件而不是可执行文件,我可以使用重定位(修复程序)或与位置无关的代码来将任务指向存储器中的任务,就像使用分页结构映射存储器一样。这足够有效吗?
  • 我还阅读了有关ARM处理器上的内存保护单元的内容。这些对您有帮助吗?

在没有MMU的系统上是否有任何“常规”方式来管理任务?

Answers:


16

设计不需要MMU的操作系统实际上并不难。没有这些,您将有一些便利,但是没有什么不可克服的。

  • 由于必须将不同的任务加载到不同的地址,因此所有代码(内核,标准库和基本运行时环境中的任何其他代码除外)都必须编译为与位置无关的代码。这意味着相对跳转和用于堆访问的基地址存储在寄存器中。如果您习惯使用x86-32的四个通用寄存器,则将一个寄存器用作基址可能会花费很多,但是大多数现代体系结构都有更多,甚至8088也有专门用于此的段寄存器。
  • 必须修改类似于Unix的体系结构,因为您不能实现fork。没关系,大多数操作系统都没有fork。(您可以拥有vfork。)
  • 您不能在不分配相应内存的情况下预分配大量的空间。这意味着一次不分配更多页面就不会使堆栈或堆快速增长。

如果您有MPU,则仍然可以像在多任务操作系统中一样将任务相互分离。如果没有MPU,则只有在允许任务执行任意代码的情况下,内存分离才能协同工作。在没有MPU的情况下实现内存分离的一种方法是将任务限制为仅在虚拟机上使用经过验证的代码,并在作为VM引擎一部分的软件中实现内存保护。

uClinux是一个基于Linux内核的项目,该项目在没有MMU的处理器(包括ARM Cortex-M)上运行。它在多任务的限制基本上就是我上面列出。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.