Поддържащият Linux RISC-V емулатор на Charles Lohr всъщност е много малък в един 400-редов C заглавен файл

Електроинженерът Чарлз Лор изгради 32-битов RISC-V емулатор с разлика: той съществува като единичен C заглавен файл с около 400 реда код – но може да работи с Linux, въпреки че му липсва модул за управление на паметта (MMU).

„Работих много усилено през последните няколко седмици върху този малък малък RISC-V емулатор. Наистина малката част е, че той няма MMU, което е нещо, което имат почти всички съвременни настолни процесори“, обяснява Лор. Причината, поради която исках да направя това, беше, защото исках да видя дали мога да стартирам Linux на него. Нещо близко до него, но не толкова просто като ESP32-C3. И отговорът беше. Да. Всъщност успях да напиша RISC-V емулатор Наистина малък. Действителната част на емулатора е цялата в тази една функция в този заглавен файл и беше само около 350, 400 реда код. Той може да работи с Linux и мога да получа изпълними файлове и каквото и да било.”

Този малък RISC-V емулатор може да работи с Linux, въпреки че е написан на няколкостотин реда на C. (📹: Charles Lohr)

Емулаторът, mini-rv32ima, реализира RV32IMA 32-битов вариант на RISC-V архитектурата, както и разширенията Zifencei и Zicsr. Това, което не се внедрява, е единица за управление на паметта (MMU), нещо, което Linux ядрото очаква да види – което означава, че целта за стартиране на Linux на емулатор ще бъде по-трудна, отколкото би могла да бъде.

„Едва знаех за RISC-V и нямах представа кои от по-усъвършенстваните функции има, или дали изобщо е възможно да се създаде RV32-NOMMU Linux изображение“, обяснява Лор. И така, първото нещо, което направих, беше Google и попаднах на него Този туит от август. Затова се свързах с RegyMM и споменах, че ми помагат.“

„След като имах нещо, което предимно работеше, система, която работеше, успях да отида и да конвертирам кода“, продължава Loehr. „Успях да започна да променям нещата и да изчистя нещата до по-модерен код, който имам тук. И поради тестово ориентираното развитие, имах наистина добри тестове и можех да стартирам ядра на Linux и да стартирам приложения в Linux. Ядрото и аз може да направи много малки промени като тези там и да знам дали ядрото все още работи и успях да премахна голяма част от размера и сложността на емулатора с течение на времето, просто като успях да го настроя и да отида тествайте емулатора и ще можете да видите, че все още работи, защото го използвах с Linux.”

Полученият емулатор наистина е доста малък: съдържа около 400 реда код и се съдържа в един C заглавен файл без нито една външна зависимост – „дори не libc“, отбелязва Лор. Часовникът работи с половината от скоростта на значително по-големия QEMU емулатор и може лесно да се интегрира в други приложения – и след като бъде включен в комплект с неговата демонстрационна обвивка, която добавя допълнителни 250 реда код за поддръжка на интерфейс на командния ред, интерфейс за управление на системата , серийна шина UART, дърво на устройствата и ядрото за зареждане на изображения, той идва само като един изпълним файл, който е 18 KB или по-малко, когато е компресиран.

„Сега е напълно функционален, когато мога да стартирам Linux, приложения и т.н., компилирам плоски двоични файлове и ги пускам в изображение“, пише Лор. “[But it] „непълен“, защото не е приложил голяма част от спецификацията, която Linux не прави (нито вие трябва)“.

Изходният код на проекта Публикувано в GitHub Съгласно лицензите на MIT, трите лиценза BSD и Creative Commons Zero.