HN 日本語サマリー

← 一覧へ戻る
プログラミング

ESP32上のLinux

Linux on ESP32 (github.com)

101 pointsby boveyking36 コメント

要約

ESP32-S31マイクロコントローラー向けに、MMU付きLinuxを移植する試みが行われています。このプロジェクトは、Linux 6.12カーネルをESP32-S31のRISC-Vアーキテクチャ(RV32IMAFBCNSUX)に適合させることを目指しています。現時点では、多くのペリフェラルドライバや接続性ドライバが開発中または未テストですが、基本的なシステム機能の移植が進められています。

全文翻訳

ESP32-S31用Linux 6.12 S31のアーキテクチャ(RV32IMAFBCNSUX)へのMMU付きLinuxの移植を試みています。テストされたモジュール: ESP32-S31-WROOM-3 E1H16R16V(ESP32-S31コアボード)。起動ログの例 ビルド/フラッシュ手順 ビルド手順を参照してください。移植の進捗状況 一般的な機能 ステータス Buildroot rootfs 🟡 未テスト 無線(ESP-Hosted) 🟡 未テスト 再起動とシャットダウン 🟡 未テスト デュアルハートSMP ⚫ 計画なし(FreeRTOSで使用) ペリフェラルドライバ 機能 ステータス AXI GDMA 🟡 未テスト AHB GDMA 🟡 未テスト キャッシュドライバ 🟡 未テスト TRNG 🟡 未テスト eFuse 🟡 未テスト ウォッチドッグ 🟡 未テスト PWM、カウンター、アナログペリフェラル 🟡 未テスト CLIC/CLINT割り込みドライバ 🟡 未テスト フラッシュMTDドライバ 🟡 未テスト タイマー 🟠 開発中 クロックツリー 🟠 開発中 セキュリティアクセラレータ 🟠 開発中 LPサブシステム&IPC 🔴 未実装 PMP/APM 🔴 未実装(適切に) 接続性ドライバ 機能 ステータス UART0コンソール 🟡 未テスト UART1/2 🟡 未テスト GMACイーサネット 🟡 未テスト SDMMC 🟡 未テスト GPIO 🟡 未テスト pinctrl/GPIO Matrix 🟡 未テスト USB 🟠 開発中 I2C 🔴 未実装 I2S 🔴 未実装 SPI 🔴 未実装 RMT 🔴 未実装 USBシリアル/JTAG ⚫ 計画なし(FreeRTOSで使用) 🟢 安定 — 完全テスト済みで動作中 | 🟡 未テスト — 動作しているように見えますが、徹底的なテストは行われていません | 🟠 開発中 - 機能が完全に実装されていません。コマンド出力も参照してください。 S31の特殊性(より多くのハードウェア参照については、docs/フォルダを参照してください) このポートはS31 TRMが利用可能になる前に行われたため、これらの推測が行われました: CLIC v. PLIC v. CLINT S31はP4と同様にCLICとCLINTを使用します。LinuxはPLICを期待します。そのため、カスタムCLICドライバが必要です。CLICを動作させるために、このCLICパッチをdisdiから参照しました。また、標準のRISC-V割り込みCSRは使用できません。おそらく、P4のTRMから、CLINT割り込みはCLICにルーティングされ、mtvec.MODEはハードワイヤードで0x3(CLICモード)になっているためです。OpenSBI割り込みを機能させるためにパッチが必要です。 Sモード S31のスーパーバイザーモードは標準ではなく、ESP-IDFでは全く使用されていません。そのため、これらのCSRの使用の多くは、P4のTRMからの推測、またはCSRプロービング(docs/を参照)に基づいています。例えば、sclicbase(?)の使用とsieの欠如。S31はSCLIC(スーパーバイザーCLIC?)を実装していますが、標準化されていないため混乱します。ESP-IDFのすべての法則によれば、mcliccfg.NMBITSは書き込み可能ではありません。書き込み可能です!そして、それを0b01に設定すると、clicintattr[i].MODEフィールドへの書き込みが可能になり、Sモード割り込みの使用が可能になります。 OpenSBIとLinux XIP 貴重な16MB PSRAMメモリを節約するため、OpenSBIはフラッシュと内部SRAMでのXIPを使用するように変更されました(そのため、OpenSBIバナーのファームウェアサイズが3915901 KBになっているのは、フラッシュとSRAMのマッピングが連続していないためです)。メインラインのLinuxでは、RISC-VでのXIPサポートは削除されたため、適切なXIPサポートを備えた6.12が使用されました。 付録(2026年7月21日現在) ~ # coremark 2Kパフォーマンス実行パラメータ coremark. CoreMarkサイズ: 666 総ティック数: 18887 総時間(秒): 18.887000 イテレーション/秒: 1058.929422 イテレーション: 20000 コンパイラバージョン: GCC15.2.0 コンパイラフラグ: -O2 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -O2 -g0 メモリ場所: ここにデータメモリの場所を記載してください(例: コードはフラッシュ、データはヒープなど) seedcrc: 0xe9f5 [0]crclist: 0xe714 [0]crcmatrix: 0x1fd7 [0]crcstate: 0x8e3a [0]crcfinal: 0x382f 正しい操作が検証されました。実行および報告規則についてはREADME.mdを参照してください。 CoreMark 1.0: 1058.929422 / GCC15.2.0 -O2 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -O2 -g0 / ヒープ # cat /proc/cpuinfo processor: 0 hart: 0 isa: rv32imafc_zicntr_zicsr_zifencei_zca_zcf_zbb mmu: sv32 uarch: espressif,esp32s31 mvendorid: 0x612 marchid: 0x80000003 mimpid: 0x1 hart isa: rv32imafc_zicntr_zicsr_zifencei_zca_zcf_zbb # uname -a Linux (none) 6.12.0-00036-gdccf9c1b2c4f-dirty #30 Thu Jul 2 23:48:23 CST 2026 riscv32 # free -h total used free shared buff/cache available Mem: 15004 1892 12784 0 328 12108 Swap: 0 0 0 # ps -aux 1 0 380 S /bin/sh -i 2 0 0 SW [kthreadd] 3 0 0 SW [pool_workqueue_] 4 0 0 IW [kworker/0:0-eve] 5 0 0 IW< [kworker/0:0H] 6 0 0 IW [kworker/u4:0-ev] 7 0 0 IW< [kworker/R-mm_pe] 8 0 0 SW [ksoftirqd/0] 9 0 0 SW [kdevtmpfs] 10 0 0 IW< [kworker/R-inet_] 11 0 0 SW [oom_reaper] 12 0 0 IW< [kworker/R-write] 13 0 0 SW [kcompactd0] 14 0 0 IW< [kworker/R-kbloc] 15 0 0 SW [kswapd0] 16 0 0 IW [kworker/0:1-pm] 17 0 0 IW [kworker/u4:1-ev] 18 0 0 SW [khvcd] 19 0 0 IW< [kworker/R-mld] 20 0 0 IW< [kworker/R-ipv6_] 34 0 380 R ps -aux # cat /proc/meminfo MemTotal: 15004 kB MemFree: 12788 kB MemAvailable: 12112 kB Buffers: 0 kB Cached: 328 kB SwapCached: 0 kB Active: 4 kB Inactive: 32 kB Active(anon): 4 kB Inactive(anon): 32 kB Active(file): 0 kB Inactive(file): 0 kB Unevictable: 328 kB Mlocked: 0 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 52 kB Mapped: 208 kB Shmem: 0 kB KReclaimable: 0 kB Slab: 756 kB SReclaimable: 0 kB SUnreclaim: 756 kB KernelStack: 352 kB PageTables: 24 kB SecPageTables: 0 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 7500 kB Committed_AS: 304 kB VmallocTotal: 524288 kB VmallocUsed: 12 kB VmallocChunk: 0 kB Percpu: 32 kB