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


9

Я думав написати операційну систему хобі для деяких процесорів ARM. Існує багато популярних однопланових комп'ютерів з ARM MPU, тому я просто хотів придбати один із них (вибравши один із більш відкритою документацією). Я був здивований, коли дізнався, що навіть у плати з дійсно достатньою пам’яттю немає MPU з блоком управління пам’яттю.

Оскільки я завжди працював з процесорами i386 + і ніколи більше (крім деяких мікросхем PIC), я зараз розгублений і не впевнений, чи можна написати операційну операційну систему, функціональність якої не буде обмежена при порівнянні з написаними ОС для МПУ з ММУ.

Я міг би придумати кілька рішень для "заміни" або "імітації" MMU, і у мене є кілька питань:

  • На процесорах Intel в 16 і 32-бітових режимах існує спосіб використання сегментів і селекторних селекторів для використання різних блоків пам'яті для різних завдань. Це означає, що я міг змінити простір пам’яті, змінивши вміст регістрів сегментів, коли робив перемикач завдань, коли на x86. Чи є якісь загальні концепції сегментації пам'яті, які можна було б використовувати в архітектурі ARM?
  • Завантажуючи пов'язаний об'єктний файл замість виконуваного файлу, я міг використовувати перемещення (виправлення) або незалежний від позиціонування код для наведення завдань на шматки пам'яті так само, як якщо б я відобразив пам'ять за допомогою структури підкачки. Це було б досить ефективно?
  • Я також прочитав щось про блоки захисту пам’яті на процесорах ARM. Чи можуть вони бути корисними?

Чи існують "звичайні" способи управління завданнями в системах без MMU?

Відповіді:


16

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

  • Оскільки різні завдання доведеться завантажувати за різними адресами, весь ваш код (за винятком ядра, стандартної бібліотеки та будь-якого іншого коду, який є частиною базового середовища виконання) повинен бути складений як незалежний від позиції. Це означає відносні стрибки та базову адресу доступу до купи, що зберігаються в регістрі. Витратити один регістр як базову адресу може здатися дорогим, якщо ви звикли до чотирьох загальних регістрів x86-32, але більшість сучасних архітектур мають більше, і навіть 8088 має сегменти реєстру саме для цього.
  • Універсальну архітектуру потрібно переглянути, тому що ви не можете її реалізувати fork. Це нормально, більшість операційних систем не мають fork. (Можна мати vfork.)
  • Ви не можете заздалегідь виділити великі простори, не виділивши відповідну пам'ять. Це означає, що не росте стек чи купа на льоту, виділяючи ще одну сторінку за один раз.

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

uClinux - це проект на базі ядра Linux, який працює на процесорах (включаючи ARM Cortex-M) без MMU. Його обмеження щодо багатозадачності по суті є тим, що я окреслив вище.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.