Linux 6.12 khởi động trên ESP32-S31: một bản port RISC-V đầy phỏng đoán
Một nhà phát triển độc lập đã chạy Linux 6.12 trên ESP32-S31 của Espressif, một vi điều khiển RISC-V với chế độ supervisor không chuẩn và không có TRM chính thức. Bản port dựa vào các bản vá CLIC, XIP trong flash, và rất nhiều thử nghiệm.

Linux trên vi điều khiển thường chỉ là trò vui, nhưng lần này thì khác. GrieferPig đã port Linux 6.12 lên ESP32-S31, sản phẩm RISC-V mới nhất của Espressif, và nhật ký khởi động cho thấy một userspace thực sự với shell, CoreMark, và 15 MB RAM hiển thị cho kernel. Vấn đề: kiến trúc của S31 là RV32IMAFBCNSUX, và chế độ supervisor của nó không hề chuẩn.
Bản port nhắm đến module ESP32-S31-WROOM-3 và khởi động kernel mainline với OpenSBI. Vì TRM của chip không có sẵn vào thời điểm đó, nhà phát triển đã đưa ra các phỏng đoán có cơ sở dựa trên TRM của P4 và thử nghiệm CSR. Điều đó thể hiện trong phần quirks: S31 dùng CLIC và CLINT thay vì PLIC mà Linux mong đợi, và các CSR ngắt RISC-V tiêu chuẩn không dùng được vì mtvec.MODE bị hardwire sang chế độ CLIC. Một driver CLIC tùy chỉnh, mượn từ một PR của litex-hub, giúp ngắt hoạt động.
Chế độ supervisor còn kỳ lạ hơn. S31 triển khai thứ gọi là SCLIC, không được chuẩn hóa ở bất kỳ đâu. Nhà phát triển phát hiện rằng mcliccfg.NMBITS có thể ghi được dù tài liệu ESP-IDF nói ngược lại, và đặt nó thành 0b01 mở khóa cấu hình ngắt S-mode. Đó là kiểu khám phá chỉ xảy ra khi bạn mò mẫm phần cứng mà không có datasheet.
Bộ nhớ eo hẹp: chip có 16 MB PSRAM, và để tiết kiệm, OpenSBI chạy XIP từ flash và SRAM nội bộ. Đó là lý do kích thước firmware trong banner là 3.9 GB kỳ lạ—ánh xạ flash và SRAM không liền mạch. Mainline Linux đã bỏ hỗ trợ XIP RISC-V, nên bản port dùng 6.12, phiên bản cuối cùng có nó.
Bảng trạng thái driver chủ yếu màu vàng. UART, GPIO, Ethernet, SDMMC, và driver cache chưa được kiểm tra; USB, timer, cây clock, và tăng tốc bảo mật đang WIP; I2C, I2S, SPI, RMT, và hệ thống LP chưa được triển khai. SMP hai lõi không được lên kế hoạch vì FreeRTOS giữ lõi thứ hai. Nhật ký khởi động cho thấy một hart duy nhất với rv32imafc và MMU, chạy shell với 15 MB trống.
CoreMark đạt 1058 vòng lặp mỗi giây với GCC 15.2 ở -O2. Đó không phải benchmark đáng khoe, nhưng đó là userspace Linux đầy đủ trên một chip mà Espressif chưa bao giờ định chạy nó.
Theo mọi quy luật của esp-idf, mcliccfg.NMBITS không thể ghi. NHƯNG NÓ CÓ THỂ GHI!
| Tính năng | Trạng thái |
|---|---|
| Console UART0 | Chưa kiểm tra |
| GPIO | Chưa kiểm tra |
| GMAC Ethernet | Chưa kiểm tra |
| SDMMC | Chưa kiểm tra |
| USB | Đang phát triển |
| Timer | Đang phát triển |
| Cây clock | Đang phát triển |
| Tăng tốc bảo mật | Đang phát triển |
| I2C | Chưa triển khai |
| I2S | Chưa triển khai |
| SPI | Chưa triển khai |
| RMT | Chưa triển khai |
| Hệ thống LP & IPC | Chưa triển khai |
| PMP/APM | Chưa triển khai (đúng cách) |
| SMP hai lõi | Không lên kế hoạch |