I've been thinking of writing a hobby operating system for some of the ARM processors. There are many popular single-board computers with ARM MPU, so I simply wanted to purchase one of those (choosing one with more open documentation). I was surprised when I found out, that even boards with really enough memory do not have MPUs with Memory Management Unit.
As I've always been working with i386+ processors and never anything else (except for some Microchip PICs), I'm now confused and not sure if one can write a working operating system whose functionality wouldn't be limited when comparing to OSes written for MPUs with MMU.
I could think of few solutions for "replacing" or "simulating" MMU and I've got few questions:
- On Intel processors in 16 and 32-bit modes there is a way of using segments and segment selectors to use different blocks of memory by different tasks. That means that I could change memory space by changing contents of segment registers when doing a task switch when on x86. Are there any general concepts for memory segmentation that could be used on ARM architecture?
- By loading a linked object file instead of executable I could use relocations (fix-ups) or position independent code to point tasks on pieces of memory in the same way as if I mapped the memory using paging structures. Would this be effective enough?
- I have also read something about Memory Protection Units on ARM processors. Could these be helpful?
Are there any "usual" ways of managing tasks on systems without MMU?