Написание многозадачной операционной системы для процессора без MMU

9

Я думал о написании хобби операционной системы для некоторых процессоров ARM. Есть много популярных одноплатных компьютеров с ARM MPU, поэтому я просто хотел купить один из них (выбирая один с более открытой документацией). Я был удивлен, когда узнал, что даже платы с действительно достаточным объемом памяти не имеют MPU с модулем управления памятью.

Поскольку я всегда работал с процессорами i386 + и никогда с чем-либо еще (за исключением некоторых микрочип-PIC), я теперь растерялся и не уверен, что можно написать работающую операционную систему, функциональность которой не будет ограничена по сравнению с написанными операционными системами. для MPU с MMU.

Я мог бы придумать несколько решений для «замены» или «симуляции» MMU, и у меня есть несколько вопросов:

  • На процессорах Intel в 16- и 32-разрядных режимах существует способ использования сегментов и селекторов сегментов для использования разных блоков памяти для разных задач. Это означает, что я мог бы изменить пространство памяти, изменив содержимое регистров сегмента при переключении задач в x86. Существуют ли общие концепции сегментации памяти, которые можно использовать в архитектуре ARM?
  • Загружая связанный объектный файл вместо исполняемого, я мог бы использовать перемещения (исправления) или позиционировать независимый код, чтобы указывать задачи на куски памяти таким же образом, как если бы я отображал память с использованием структур подкачки. Будет ли это достаточно эффективным?
  • Я также читал кое-что о модулях защиты памяти на процессорах ARM. Могут ли они быть полезными?

Существуют ли «обычные» способы управления задачами в системах без MMU?

user35443
источник

Ответы:

16

На самом деле не так сложно разработать операционную систему, которая не требует MMU. Есть несколько удобств, без которых вам придется обойтись, но ничего непреодолимого.

  • Поскольку разные задачи должны быть загружены по разным адресам, весь ваш код (за исключением ядра, стандартной библиотеки и любого другого кода, являющегося частью вашей базовой среды выполнения) должен быть скомпилирован как независимый от позиции. Это означает относительные переходы и базовый адрес для доступа к куче, хранящийся в регистре. Расход одного регистра в качестве базового адреса может показаться дорогостоящим, если вы привыкли к четырем общим регистрам x86-32, но в большинстве современных архитектур их больше, и даже в 8088 именно для этого есть регистры сегментов.
  • Unix-подобная архитектура должна быть пересмотрена, потому что вы не можете реализовать fork. Это нормально, большинство операционных систем не имеют fork. (Вы можете иметь vfork.)
  • Вы не можете предварительно выделить большие порции пространства, не выделяя при этом соответствующую память. Это означает, что не нужно увеличивать стек или кучу на лету, выделяя по одной странице за раз.

Если у вас есть MPU, то ваши задачи по-прежнему могут быть отделены друг от друга, как обычно в многозадачных операционных системах. Без MPU разделение памяти может быть кооперативным, только если вы разрешаете задачам выполнять произвольный код. Один из способов добиться разделения памяти без MPU - ограничить задачи использованием только проверенного кода на виртуальной машине и реализовать защиту памяти в программном обеспечении как часть механизма VM.

uClinux - это проект, основанный на ядре Linux, который работает на процессорах (включая ARM Cortex-M) без MMU. Его ограничения на многозадачность - это то, что я изложил выше.

Жиль "ТАК - перестань быть злым"
источник