Bauen
Betrieb auf einem Raspberry Pi 5
Was Sie kaufen sollten, wie Sie die SD-Karte bauen und beschreiben, wie Sie das serielle Log des Boards lesen und prüfen und wie Sie Systeme unbeaufsichtigt auf dem Pi 5 laufen lassen oder die Benutzeroberfläche auf seinem HDMI-Bildschirm verfolgen.
Der Raspberry Pi 5 ist das Referenzboard von NoWayOS: günstig, überall erhältlich und das Board, auf dem die ersten Hardwaretests laufen. Ein System, das in QEMU besteht, wird auf dem Pi gegen dieselbe Expect-Datei geprüft, anhand des seriellen Logs des Boards.
Zwei Regeln für das Board. Schließen Sie nie einen 5-V-Seriell-Adapter an den UART des Pi an: Es ist ein 3,3-V-Port. Und programmieren Sie auf einem Entwicklungsboard nie den einmal programmierbaren Speicher (OTP) des Pi und aktivieren Sie dort nie Secure Boot: Beides ist unumkehrbar.
make sdcardlehnt eineconfig.txtab, die eines davon tun oder die Spannung des Boards ändern würde.
Was Sie brauchen
| Teil | Hinweise |
|---|---|
| Raspberry Pi 5 | Entwickelt und getestet auf dem Board mit 16 GB. Jeder Befehl nennt das Board rpi5b_2gb: die seL4-Konfiguration für den Pi 5, die seine ersten 2 GB Arbeitsspeicher nutzt, von denen der Build seL4 knapp 1 GB gibt. Die Boards mit 2, 4 und 8 GB sollten daher nichts anderes brauchen, wurden aber noch nicht ausprobiert |
| Netzteil | Das offizielle USB-C-Netzteil mit 5 V, 5 A oder ein gleichwertiges. Ein unterversorgter Pi 5 spielt verrückt, als hätte er einen Softwarefehler |
| microSD-Karte | Für die Boot-Partition, die make sdcard baut |
| Raspberry Pi Debug Probe | Ihr UART-Kabel passt an den 3-poligen Debug-Anschluss des Pi 5. Jeder 3,3-V-USB-zu-Seriell-Adapter mit dem passenden Kabel funktioniert ebenfalls |
| HDMI-Monitor, USB-Tastatur und -Maus | Für die Benutzeroberfläche. Schließen Sie den Monitor vor dem Einschalten an: Die Firmware richtet den Bildschirm nur beim Booten ein. USB-Boot-Tastaturen und -Mäuse funktionieren, Hubs noch nicht |
Die SD-Karte bauen
make sdcard BOARD=rpi5b_2gb SYSTEM=hello
Das schreibt die Boot-Partition der Karte nach build/rpi5b_2gb/hello/sdcard/: U-Boot, den Device Tree und die Overlays, config.txt, das seL4-Image loader.img, die Lizenzdateien und eine SHA256SUMS, um die Karte danach zu prüfen. U-Boot wird im Container aus dem Quellcode gebaut, reproduzierbar.
Die Karte beschreiben
Unter macOS
- Finden Sie die Karte mit
diskutil list: Sie ist external, physical und hat die Größe der Karte. Der nächste Schritt löscht diesen gesamten Datenträger, prüfen Sie die Nummer also zweimal. - Formatieren Sie sie mit der Bezeichnung
PIBOOT:
diskutil eraseDisk FAT32 PIBOOT MBRFormat /dev/diskN
- Kopieren Sie die Dateien und prüfen Sie, dass jede unversehrt angekommen ist (das gibt nichts aus, wenn alle übereinstimmen):
cp -RX build/rpi5b_2gb/hello/sdcard/ /Volumes/PIBOOT/
dot_clean -m /Volumes/PIBOOT
(cd /Volumes/PIBOOT && shasum -a 256 -c SHA256SUMS | grep -v ': OK$')
- Werfen Sie sie mit
diskutil eject /dev/diskNaus und stecken Sie sie in den Pi.
Unter Linux
Dieselben Schritte mit den Werkzeugen von Linux (die eigenen Karten des Projekts entstehen unter macOS):
- Finden Sie die Karte mit
lsblk -p: ein Datenträger in der Größe der Karte, etwa/dev/sdXoder/dev/mmcblk0. Der nächste Schritt löscht diesen gesamten Datenträger, prüfen Sie den Namen also zweimal und hängen Sie alle seine Partitionen aus. - Legen Sie eine FAT32-Partition mit der Bezeichnung
PIBOOTan (mit installiertemdosfstoolsundparted):
sudo parted --script /dev/sdX mklabel msdos mkpart primary fat32 1MiB 100% set 1 lba on
sudo mkfs.vfat -F 32 -n PIBOOT /dev/sdX1
- Kopieren Sie die Dateien und prüfen Sie, dass jede unversehrt angekommen ist (das gibt nichts aus, wenn alle übereinstimmen):
sudo mount /dev/sdX1 /mnt
sudo cp -r build/rpi5b_2gb/hello/sdcard/. /mnt/
(cd /mnt && sha256sum -c SHA256SUMS | grep -v ': OK$')
sudo umount /mnt
- Stecken Sie sie in den Pi.
Die serielle Konsole anschließen
Stecken Sie die Debug Probe an den eigenen 3-poligen Debug-Anschluss des Pi 5, zwischen den HDMI-Ports, nicht an die GPIO-Pins. Sie läuft mit 115200 Baud, 8N1. Die Probe erscheint auf einem Mac als /dev/cu.usbmodem… und unter Linux als /dev/ttyACM0 oder ähnlich (Ihr Benutzer muss dazu in der Gruppe dialout sein).
Starten Sie die Aufzeichnung, bevor Sie den Pi einschalten, ein Boot pro Log:
mkdir -p build/rpi5b_2gb/hello
(stty 115200 raw -echo; cat) < /dev/cu.usbmodemXXXX | tee build/rpi5b_2gb/hello/serial.log
Halten Sie Einstellungen und Lesen in einem Befehl zusammen, wie hier: Unter macOS fällt ein zweites Öffnen des Ports auf 9600 Baud zurück. Unter Linux stellen Sie den Port mit stty -F /dev/ttyACM0 115200 raw -echo ein und lesen ihn mit cat /dev/ttyACM0. Beenden Sie nach der letzten erwarteten Zeile mit Ctrl-C.
Beim Einschalten zählt U-Boot drei Sekunden herunter und bootet dann das loader.img der Karte. Um stattdessen an seinem Prompt anzuhalten, tippen Sie während des Countdowns stopboot. (Nur dieses Wort hält es an, sodass das Rauschen, das eine nicht verbundene serielle Leitung auffängt, ein Gerät nie in U-Boot festhalten kann.)
Das Log prüfen
Prüfen Sie das Log des Boards gegen die Expect-Datei des Systems, nach denselben Regeln, nach denen die Ausgabe von QEMU geprüft wird:
make check-serial SYSTEM=hello LOG=build/rpi5b_2gb/hello/serial.log
Ergänzen Sie BOARD=rpi5b_2gb für ein System, das eine eigene Expect-Datei für den Pi hat.
Systeme unbeaufsichtigt ausführen
Mit angeschlossener Probe führt make pi-run eine Reihe von Systemen auf dem Board aus, ohne dass eine Karte umgesteckt werden muss und ohne dass jemand am Board sitzt. Führen Sie es direkt auf Ihrem Rechner aus, nicht im Container (auf einem Mac sieht die virtuelle Maschine von Podman keine seriellen USB-Geräte). Dort braucht es Python 3.11 oder neuer, nur mit der Standardbibliothek:
make pi-run PI_DEVICE=/dev/cu.usbmodemXXXX PI_SYSTEMS="hello ipc-demo isolation-test"
Für jedes System baut es das Image im Container, setzt das Board zurück, sendet das Image über die serielle Leitung und prüft, dass es unversehrt angekommen ist, schärft den Watchdog des Boards und startet es. Jedes Log wird beim Eintreffen geprüft, und der Watchdog setzt das Board für das nächste System zurück. Jeder Befehl, den es eintippt, wird als Echo zurückgesendet und geprüft, bevor er abgeschickt wird. Die Logs landen in build/rpi5b_2gb/pi-run/.
Die Benutzeroberfläche verfolgen
Ist der Monitor vor dem Einschalten angeschlossen, führt
make pi-run PI_DEVICE=/dev/cu.usbmodemXXXX PI_SYSTEMS=ui-demo PI_WATCHDOG=15
die gescriptete Sitzung der Benutzeroberfläche auf dem HDMI-Bildschirm aus und prüft einen Hash jedes Frames. Um ein System für einen Menschen zum Zuschauen laufen zu lassen, ohne Watchdog, verwenden Sie make pi-show PI_DEVICE=… SYSTEM=ui-demo; es läuft, bis das Board aus- und wieder eingeschaltet wird.
Wenn etwas fehlschlägt
Gehen Sie zum letzten Image zurück, das funktioniert hat, und prüfen Sie die serielle Leitung und die Boot-Kette erneut, bevor Sie mehr als eine Sache auf einmal ändern. Erscheint vor U-Boot gar nichts, prüfen Sie die Einstellung BOOT_UART des Bootloaders und enable_uart=1 in der config.txt der Karte, bevor Sie die Probe oder die Verkabelung verdächtigen.