Linux портировали на недокументированный чип ESP32-S31

Разработчик перенёс ядро Linux с поддержкой MMU на архитектуру чипа ESP32-S31 (RV32IMAFBCNSUX), проект опубликован на GitHub и попал в топ Hacker News (50 баллов, 18 комментариев). Порт протестирован на плате ESP32-S31-WROOM-3 E1H16R16V. Особенность в том, что официальное техническое руководство (TRM) на S31 на момент работы ещё не было доступно, поэтому поведение контроллера прерываний и регистров CSR (control and status registers) пришлось не документировать, а угадывать и вычислять пробами.
По наблюдениям автора, S31 использует контроллеры CLIC и CLINT так же, как чип P4, тогда как Linux по умолчанию ожидает контроллер PLIC, из-за этого понадобился отдельный драйвер CLIC, за основу которого взят патч разработчика disdi. Стандартные CSR для прерываний RISC-V оказались неприменимы: судя по всему, прерывания CLINT маршрутизируются через CLIC, а регистр mtvec.MODE жёстко зафиксирован в режиме CLIC, под это пришлось патчить OpenSBI. Режим supervisor у S31 нестандартный и нигде не используется в ESP-IDF, так что назначение части CSR (например, sclicbase) автор реконструировал по TRM чипа P4 и прямым пробам регистров. Ещё одна находка: по документации ESP-IDF регистр mcliccfg.NMBITS недоступен для записи, но на практике он пишется, установка значения 0b01 включает запись в поле clicintattr[i].MODE и тем самым доступ к прерываниям в режиме supervisor.
Чтобы сэкономить 16 МБ памяти PSRAM, автор модифицировал загрузчик OpenSBI для работы в режиме XIP (выполнение кода прямо из флеш-памяти) с использованием флеша и внутренней SRAM; из-за того что их адресные диапазоны не идут подряд, баннер OpenSBI при загрузке показывает нестандартный размер прошивки, 3 915 901 КБ. Поддержку XIP для RISC-V в основной ветке Linux уже убрали, поэтому вместо новых версий ядра используется Linux 6.12, где XIP ещё работает.
По состоянию на 21 июля 2026 года README проекта приводит вывод команд с работающей системы: тест CoreMark показал 1058,93 итерации в секунду (20 000 итераций за 18,887 секунды); cat /proc/cpuinfo показывает ISA rv32imafc_zicntr_zicsr_zifencei_zca_zcf_zbb и MMU sv32; uname -a, сборку ядра 6.12.0 от 2 июля 2026 года; free -h и /proc/meminfo, суммарно 15 004 КБ памяти, из них свободно 12 788 КБ.
Ключевые факты
- Автор перенёс Linux с поддержкой MMU на RISC-V-чип ESP32-S31 (RV32IMAFBCNSUX), проверено на плате ESP32-S31-WROOM-3 E1H16R16V
- Официального технического руководства на S31 ещё не было, поведение контроллера прерываний и CSR восстанавливали пробами и по документации родственного чипа P4
- S31 использует CLIC/CLINT вместо ожидаемого Linux'ом PLIC; понадобился отдельный драйвер CLIC и патчи OpenSBI под нестандартный режим прерываний
- Регистр mcliccfg.NMBITS, который по документации ESP-IDF недоступен для записи, на практике пишется и включает прерывания в режиме supervisor
- Для экономии 16 МБ PSRAM OpenSBI переведён в режим XIP; используется ядро Linux 6.12, так как в новых версиях поддержку XIP для RISC-V убрали; CoreMark на порту показал 1058,93 итерации в секунду
Почему это важно
Это пример того, как энтузиасты доводят Linux до работы на чипах, для которых ещё нет официальной документации: вместо технического руководства, обратная разработка через пробы регистров и аналогию с уже описанным чипом того же семейства (P4). Такие проекты обычно опережают официальную поддержку производителя и показывают границы того, что можно сделать с недокументированным железом.
Кому это важно
В первую очередь, разработчикам embedded-систем и энтузиастам RISC-V, которые работают с чипами Espressif и хотят запускать полноценный Linux (а не только ESP-IDF/FreeRTOS) на компактных микроконтроллерах с PSRAM. Также интересно тем, кто занимается портированием ядра на нестандартные реализации CLIC/CLINT.
Как это применить
Код и инструкции по сборке опубликованы в репозитории на GitHub, порт протестирован на плате ESP32-S31-WROOM-3 E1H16R16V. Использовать можно как отправную точку для собственных экспериментов с Linux на S31, с оговоркой, что часть функций отмечена автором как непроверенная или не полностью реализованная (статусы 🟡 и 🟠 в README проекта).
Можно ли доверять
Автор прямо описывает результат как основанный на догадках и пробах, а не на официальной документации, сам характер работы предполагает риск ошибок в деталях (например, точное назначение регистров CSR). При этом порт демонстрирует работающую систему: приведён живой вывод CoreMark, /proc/cpuinfo, uname и /proc/meminfo с запущенного устройства, что подтверждает реальность результата, а не только заявление.
Риски и подводные камни
Часть выводов о работе контроллера прерываний автор сам называет предположениями («presumably»), а не подтверждёнными фактами, это может привести к скрытым ошибкам при других конфигурациях железа. Проект зависит от недокументированного и нестандартного поведения регистров (например, записи в теоретически защищённое поле NMBITS), которое производитель может изменить или закрыть в будущих ревизиях чипа или прошивки ESP-IDF.
«По всем правилам ESP-IDF регистр mcliccfg.NMBITS недоступен для записи. А он ДОСТУПЕН!»
— автор проекта, README на GitHub