Linux 6.12がESP32-S31で起動:推測だらけのRISC-Vポート
独立系開発者がEspressifのESP32-S31(非標準のスーパーバイザモードと公式TRMを持たないRISC-V MCU)でLinux 6.12を動作させた。このポートはCLICパッチ、フラッシュ内XIP、そして多くのプロービングに依存している。

マイクロコントローラでのLinuxは通常、パーティトリックに過ぎないが、これは違う。GrieferPigはLinux 6.12をEspressifの最新RISC-VパーツであるESP32-S31に移植し、ブートログにはシェル、CoreMark、そしてカーネルから見える15 MBのRAMを備えた本物のユーザースペースが表示されている。問題は、S31のアーキテクチャがRV32IMAFBCNSUXであり、そのスーパーバイザモードは標準とは程遠いことだ。
このポートはESP32-S31-WROOM-3モジュールを対象とし、OpenSBIを備えたメインラインカーネルを起動する。チップのTRMが当時入手できなかったため、開発者はP4のTRMとCSRプロービングに基づいて推測を行った。それは変な仕様のセクションに表れている:S31はLinuxが期待するPLICの代わりにCLICとCLINTを使用し、標準のRISC-V割り込みCSRはmtvec.MODEがCLICモードにハードワイヤされているため使用できない。litex-hub PRから借用したカスタムCLICドライバが割り込みを機能させている。
スーパーバイザモードはさらに奇妙だ。S31はSCLICと呼ばれるものを実装しているが、これはどこにも標準化されていない。開発者は、ESP-IDFのドキュメントがそうでないと述べているにもかかわらずmcliccfg.NMBITSが書き込み可能であることを発見し、それを0b01に設定するとSモードの割り込み設定が解放される。これは、データシートなしでハードウェアをいじっているときにしか起こらない発見だ。
メモリは逼迫している:チップには16 MBのPSRAMがあり、それを節約するために、OpenSBIはフラッシュと内部SRAMからXIPで実行される。だからバナー内のファームウェアサイズが奇妙な3.9 GBになっているのだ—フラッシュとSRAMのマッピングは連続していない。メインラインLinuxはRISC-V XIPサポートを削除したため、このポートはそれを備えた最後のバージョンである6.12を使用している。
ドライバステータステーブルはほとんどが黄色だ。UART、GPIO、イーサネット、SDMMC、キャッシュドライバは未テスト;USB、タイマー、クロックツリー、セキュリティアクセラレータはWIP;I2C、I2S、SPI、RMT、LPサブシステムは未実装。デュアルハートSMPは、FreeRTOSが2番目のコアを所有しているため計画されていない。ブートログは、rv32imafcとMMUを備えた単一ハートが、15 MBの空き容量でシェルを実行していることを示している。
CoreMarkはGCC 15.2で-O2を使用して毎秒1058回の反復を記録している。これは自慢できるベンチマークではないが、Espressifが実行することを意図したことのないチップ上での完全なLinuxユーザースペースだ。
esp-idfのすべての法則によれば、mcliccfg.NMBITSは書き込み可能ではない。書き込み可能なのだ!
| 機能 | ステータス |
|---|---|
| UART0コンソール | 未テスト |
| GPIO | 未テスト |
| GMACイーサネット | 未テスト |
| SDMMC | 未テスト |
| USB | WIP |
| タイマー | WIP |
| クロックツリー | WIP |
| セキュリティアクセラレータ | WIP |
| I2C | 未実装 |
| I2S | 未実装 |
| SPI | 未実装 |
| RMT | 未実装 |
| LPサブシステム & IPC | 未実装 |
| PMP/APM | 未実装(適切には) |
| デュアルハートSMP | 計画なし |