Linux na mikrokontroléru ESP32-S3 zvládne volání fork() i bez jednotky správy paměti
Projekt Linux-on-esp32-S3 vydal 8. září verzi 0.7 a s ní podporu volání fork() na čipu, který jednotku správy paměti nemá. Zastupují ji softwarové paměťové banky: rodičovský proces i potomek si drží vlastní soukromá data, na jeden fork ale smí připadnout nejvýš 512 KiB. O dva dny později k projektu přibyla větev, která zrcadlí shell na 9,7palcový e-paper.
Mikrokontrolér ESP32-S3 od firmy Espressif má dvě jádra Xtensa LX7, 512 KiB vnitřní paměti a žádnou jednotku správy paměti. Na takovém čipu se dá spustit Linux několika způsoby a většina z nich vede přes emulaci cizího procesoru. Projekt Linux-on-esp32-S3 šel jinudy a 8. září vydal verzi 0.7, ve které funguje volání fork().

Přeložený pro Xtensu, ne emulovaný
První verze projektu z 13. července emulovala stroj s architekturou RISC-V, tedy cizí procesor interpretovaný softwarem. O čtyři dny později vyšla 0.2, kde už jádro Linuxu běží jako nativní kód přeložený rovnou pro instrukční sadu Xtensa. Dnešní systém stojí na jádru 6.11 a v repozitáři zůstala i ta stará cesta, aby se daly obě porovnat.
Dvě jádra, dva operační systémy
Rádio Wi-Fi na ESP32-S3 ovládá uzavřená binární komponenta, která běží jedině pod ESP-IDF a FreeRTOS. Linux si ji proto nemůže vzít pod sebe. Projekt to řeší rozdělením čipu: na jádru 0 sedí firmware Espressifu s rádiem a přístupem k paměti flash, na jádru 1 běží Linux a oba spolu mluví přes sdílenou paměť. Ze strany Linuxu z toho vyleze obyčejné síťové rozhraní espsta0.
To rozvržení není dílem tohoto projektu. Postavil ho Max Filippov (jcmvbkbc) v rámci portu Linuxu na Xtensu. Jeho sestavovací skripty pro ESP32-S3 leží na GitHubu od září 2023 a větev projektu esp-hosted, kterou Wi-Fi do Linuxu prochází, má poslední commit ze srpna 2024. Autor Linux-on-esp32-S3 se k tomu hlásí a Filippovu práci uvádí mezi prameny.
Deska umí být jen klientem cizí sítě. Režim přístupového bodu projekt vyhodil a v dokumentaci píše proč: uzavřený firmware vysílal majáky jako WEP, takže ho klienti odmítali, a spuštění přístupového bodu navíc zaseklo úlohu Wi-Fi natolik, že se rádio přestalo umět rozhlédnout po sítích.
Co dělají softwarové paměťové banky
Bez jednotky správy paměti běží Linux v režimu NOMMU. Ten existuje léta, jenže rozmnožení procesu voláním fork() v něm bývá problém: potomek nemá kam dostat vlastní kopii soukromých dat. Vydání 0.7 na to nasadilo softwarové banky. Každá paměťová oblast si vede kruhový seznam svých kopií, a jakmile zbude poslední, systém jí uvolní podkladové stránky.
Autor u toho nikde netvrdí, že nahradil hardware. Kopírování je okamžité, ne odložené na první zápis, běh je omezený na jedno jádro, vícevláknový fork() backend odmítá a soukromá paměť smí na jeden fork() zabrat nejvýš 512 KiB. Izolace procesů žádná: práva v souborovém systému nejsou ochrana paměti.
Účet za to je vidět v měření. Při prvním rozmnožení oblasti, kterou zatím nikdo nesdílí, vzniknou zálohy dvě, takže proces se soukromými daty o velikosti P potřebuje navíc zhruba dvojnásobek. Naměřené hodnoty na desce vypadají takhle:
| program | RAM po spuštění | pozorovaný vrchol | zálohy při prvním fork() |
|---|---|---|---|
| Bash | 140 KiB | 276 KiB | až 552 KiB |
| Dash | 84 KiB | 140 KiB | až 280 KiB |
| MicroPython | 104 KiB | 308 KiB | až 616 KiB |
V opravdovém přihlášení spotřeboval Bash 344 až 380 KiB soukromé paměti podle toho, co zrovna dělal. Na desku s 8 MB PSRAM to pořád sedí, na několik souběžných relací Bashe už ne.
Co se na 16 MB flash vešlo
Referenční deska má 16 MB paměti flash a 8 MB PSRAM v režimu Octal. Kořenový souborový systém je cramfs jen pro čtení a programy se z něj spouštějí přímo, bez kopírování do paměti RAM. Zapisovat jde do /etc a /home, které jedou na JFFS2.
Uvnitř je Bash 5.2.37 jako přihlašovací shell, BusyBox jako /bin/sh, dále Dash 0.5.12, GNU Make 4.4.1, MicroPython 1.26.0, socat a nc. Přibyla domovská složka pro každého uživatele, su, passwd, cron s úlohami @reboot a odpojitelné relace. CPython, SQLite, sudo ani doas v obrazu nejsou.
Zápis do JFFS2 umí být podle vlastní dokumentace projektu extrémně pomalý, když dojde na uvolňování bloků. Příčinu autor neuzavřel a píše, že ji chce opravit později. Telnet je zapnutý ve výchozím stavu a posílá přihlašovací údaje v čitelné podobě; tovární heslo changeme123 je veřejné.
Jak se to ověřuje
Na obrázky projekt vede datované záznamy z běhu na desce. Čistý obraz z 6. září prošel 26 kontrolami z 26 a k přihlašovací výzvě se poprvé dostal za 19,08 sekundy; dokumentace zároveň uvádí, že obvyklý start od resetu trvá kolem čtrnácti sekund, protože první zavedení po nahrání ještě zakládá domovské složky.
Dva nezávislé překlady téhož commitu daly pět bajtově shodných souborů z osmi a ze 772 položek kořenového systému se lišil jediný, /etc/shadow, kvůli náhodné soli u hesla. Autor z toho výslovně nedělá závěr, že je obraz reprodukovatelný bit po bitu.
Terminál na e-paperu
Deset dní po vydání 0.7 založil uživatel svermigo větev s e-paperovým terminálem pro displej ED097TC2 o rozlišení 1 200 × 825 bodů. Vykreslování drží jádro 0, Linux posílá znaky přes zařízení /dev/epd a přihlášený root dostane shell zrcadlený na displej i na sériovou linku zároveň.
Je to znakový terminál 75 × 34, ne úplná náhrada VT100, a rané hlášky při zavádění systému na něm nejsou. Místo velkého obrazového bufferu si drží jen stavy textu, aby nebral paměť PSRAM, se kterou hospodaří Linux. Třetí provedení vzniklo poté, co dvě předchozí nestíhala plnit frontu řádků, zatímco Linux pracoval. Že se bezdisplejová varianta na desce doopravdy zavede a že ji zvládne nahrát webový instalátor, zatím nikdo neověřil.
Celý systém je pod licencí GPLv3 a staví na Buildrootu, na portu Xtensy a na projektu esp-hosted. Sestavení z čistého stromu zabere podle dokumentace zhruba 40 minut a 21 GB místa na disku.
Zdroje
- paulneja/Linux-on-esp32-S3 – README, ARCHITECTURE.md, CHANGELOG.md a záznamy v
build/verification/ - Vydání 0.7 na GitHubu (8. září 2026)
- jcmvbkbc/esp32-linux-build a jcmvbkbc/esp-hosted – port Linuxu na Xtensu a rozdělení jader, na kterém projekt stojí
- Paperboard ED097TC2 console – popis e-paperového terminálu
- Linux nativně na ESP32-S3, Chiptron.cz, 13. září 2026