Простейшая возможная архитектура, которая может быть виртуализирована и запускать ядро Linux
Я был вдохновлен воплощением x86 виртуальной машины в Javascript, и я хотел бы попробовать написать простейший возможная виртуальная машина, способная запускать ядро Linux. Это чисто воспитательная работа, без каких-либо целей, кроме понимания и обмена кодом, который делает это возможным.
Оглядываясь на спецификацию x86, я подозреваю, что я могу броситься в глубокий конец, пытаясь написать виртуальную машину, которая способен эмулировать полный набор команд x86. Вместо этого я ищу более простую архитектуру, которую я могу попытаться подражать.
Я прочитал этот вопрос, в котором спрашивается, как эмулировать архитектуру x86, и ответ предлагает начать с чего-то более простого, такого как архитектура ARM. Мой вопрос более конкретный: какая самая простая архитектура, которую я могу попытаться эмулировать, которая сможет запускать ядро Linux?
Мне интересно полностью эмулировать всю машину, а не просто передавать инструкции обратно на главный компьютер (что, например, было бы возможно, если бы я писал эмулятор x86). У меня есть достаточное количество 16-битных знаний сборки и некоторые теории теории операционных систем, поэтому это должно быть в пределах досягаемости с достаточной работой.
Ответы
Ответ 1
Простейшая возможная архитектура будет с точки зрения простоты реализации. Поскольку вы создаете эмулятор, который полностью эмулирует машину, в зависимости от того, какой из них будет иметь самый простой дизайн/дизайн. Архитектуры RISC, несомненно, лучше. Но выбор архитектуры, которая не широко используется, также не очень хороша, если вам нужна поддержка, некоторые из них смогут вам помочь. Написание симулятора - это не кусок пирога. Я бы сказал, что либо идет для ARM или MIPS, оба популярны:
Также вы должны знать, что виртуальная машина Javascript Fabrice Bellard использует 32-разрядный процессор, совместимый с x86, что поддерживается Linux изначально. Вам придется подключать ядро linux (использовать инструментальные цепочки) для ARM или MIPS самостоятельно. См. Ссылки на использование ядра linux
Для MIPS:
Для ARM:
Ответ 2
Список архитектур, поддерживаемых ядром Linux:
http://en.wikipedia.org/wiki/List_of_Linux_supported_architectures
"Простейший возможный" несколько субъективен, но вот что я считаю менее сложным из этого списка:
- MIPS
- H8 (μClinux)
- 68k/Coldfire (μClinux)
Ответ 3
Как я уже сказал в комментариях, я бы сбалансировал три аспекта:
- простой набор команд (несколько форматов команд, несколько кодов операций: что-то НЕ нравится x86)
- документация: широко доступна. Это означает, что вы можете отказаться от некоторых простых архитектур, чтобы сосредоточиться на широко поддерживаемых (например, x86 выигрывает здесь, но вы также найдете много материалов о RISC и особенно MIPS из академических кругов). Или идите для чего-то открытого, например OpenRisc
- простота использования в "режиме ядра". В привилегированном режиме ядра существует целый новый мир регистров, инструкций и внутренних компонентов. И не забывайте, что процессор поставляется с шиной, а простые процессоры могут иметь очень сложные шины! И вам тоже нужно будет подражать этому. ИЛИ, вы можете пойти User mode Linux, если вы довольны им.
В конце концов, я бы предложил что-то "старое": достаточно простое, особенно в привилегированном режиме, хорошо изученное и задокументированное. Например, оригинальный MIPS, семейство Motorola 68k или что-то близкое к оригинальному RISC (http://en.wikipedia.org/wiki/Berkeley_RISC), если есть вариант Linux для этого!
Ответ 4
Вы можете посмотреть на microBlaze, процессор, предназначенный для эффективной реализации на FPGA.
Он имеет только два формата команд и 32 основных значения кода операции.
Он определяется и поддерживается Xilinx для своей строки FPGA, эталонный документ находится по адресу:
http://www.xilinx.com/support/documentation/sw_manuals/mb_ref_guide.pdf