← На главную

S31 получил MMU Linux: CoreMark 1058 итераций/с

28.07.2026 17:52 · hackernews

На архитектуру S31 (RV32IMAFBCNSUX) портировали MMU Linux. Тестировали на модуле ESP32-S31-WROOM-3 E1H16R16V (ESP32-S31 Core Board). Порт в раннем состоянии: многое не проверено, часть периферии в работе, кое-что не реализовано. Buildroot rootfs и Wireless (ESP-Hosted) не тестировались, reboot и poweroff тоже. Dual hart SMP не планируется — его использует FreeRTOS. Из периферии AXI GDMA, AHB GDMA, драйвер кэша, TRNG, eFuse, Watchdog, PWM, драйвер прерываний CLIC/CLINT, драйвер Flash MTD — статус untested. Таймеры, тактовое дерево и криптоускорители — WIP. LP subsystem & IPC и PMP/APM — не реализованы. Консоль UART0, UART1/2, GMAC Ethernet, SDMMC, GPIO, pinctrl/GPIO Matrix — untested. USB — WIP. I2C, I2S, SPI, RMT — не реализованы. USB Serial/JTAG — не планируется, его занимает FreeRTOS.

Порт делали до выхода TRM для S31, поэтому многое пришлось угадывать. S31 использует CLIC и CLINT, похожие на P4, а Linux ожидает PLIC. Пришлось написать кастомный CLIC-драйвер, опираясь на патч от disdi. Стандартные регистры CSR прерываний RISC-V не работают: судя по TRM от P4, прерывания CLINT уходят в CLIC, а mtvec.MODE захардкожен в 0x3 (CLIC mode). Поэтому OpenSBI пришлось патчить. Режим супервизора в S31 нестандартный и в ESP-IDF не используется, так что многие CSR подбирали эмпирически или по TRM от P4. Например, sclicbase и отсутствие sie. S31 реализует SCLIC (Supervisor CLIC?), хотя стандарта нет. По законам esp-idf, mclicfg.NMBITS не должен быть записываемым, но он записывается! Установка 0b01 разрешает запись в clicintattr[i].MODE и включает S-mode interrupts.

Чтобы сэкономить драгоценные 16MB PSRAM, OpenSBI модифицировали для работы по XIP из flash и внутренней SRAM. Отсюда в баннере OpenSBI размер прошивки 3915901 KB: отображения flash и SRAM не непрерывны. В mainline Linux поддержку XIP на RISC-V убрали, поэтому взяли версию 6.12, где XIP ещё есть.

Результаты: CoreMark 1.0 выдал 1058.93 итераций в секунду при компиляции GCC15.2.0. /proc/cpuinfo определяет isa как rv32imafc_zicntr_zicsr_zifencei_zca_zcf_zbb, mmu sv32, uarch espressif,esp32s31. uname сообщает Linux 6.12.0-00036-gdccf9c1b2c4f-dirty, riscv32. free показывает 15004 kB total, свободно 12784 kB. В системе обычные процессы: kthreadd, kworker, ksoftirqd, kdevtmpfs, oom_reaper, kcompactd, kswapd, khvcd.

Читать оригинал →