
tamago v1.26.6
Framework zur Kompilierung und Ausführung von Go-Anwendungen auf Bare-Metal-Prozessoren, das eine sichere Firmware-Entwicklung mit reduzierter Angriffsfläche durch Entfernung von Betriebssystem- und C-Abhängigkeiten ermöglicht.
TamaGo - Bare Metal Go
tamago | https://github.com/usbarmory/tamago
Copyright (c) The TamaGo Authors. All Rights Reserved.
Einleitung
TamaGo ist ein Framework, das die Kompilierung und Ausführung von uneingeschränkten Go-Anwendungen auf Bare-Metal-Prozessoren (AMD64, ARM, ARM64, RISCV64) ermöglicht.
Das Projekt entstand aus dem Wunsch, die Angriffsfläche von eingebetteten System-Firmware zu reduzieren, indem jegliche Laufzeitabhängigkeit von C-Code und Betriebssystemen entfernt wird.
Das TamaGo-Framework besteht aus den folgenden Komponenten:
-
Eine modifizierte Go-Distribution, die
GOOSum das Zieltamagoerweitert und Bare-Metal-Ausführung durch einen vonGOOSPKGgesetzten runtime/goos-Overlay ermöglicht. -
Go-Pakete für Prozessor-/SoC-Unterstützung.
-
Go-Pakete für Board-Unterstützung.
Die Modifikationen am ursprünglichen Go-Compiler, der Laufzeit und der Zielanwendung (ein erforderlicher Import) sind minimal und sauber von anderen Architekturen getrennt.
Es wird großer Wert auf die Wiederverwendung von Code aus bestehenden Architekturen gelegt, die bereits in der standardmäßigen Go-Laufzeit enthalten sind – siehe Internals.
Die Modifikationen erhalten die vollständige Unterstützung der Standardbibliothek.
Diese Aspekte sind motiviert durch den Wunsch, ein Framework bereitzustellen, das eine sichere Go-Firmware-Entwicklung auf eingebetteten Systemen ermöglicht.
Aktuelle Veröffentlichungen
Die folgenden Links sind die neuesten Veröffentlichungen der
modifizierten Go-Distribution von TamaGo,
die GOOS=tamago zur entsprechenden Go-Version hinzufügt, sowie der
TamaGo-Bibliothek:
Dokumentation
Die Hauptdokumentation befindet sich im Projekt-Wiki.
Die API-Dokumentation der Pakete findet sich unter pkg.go.dev.
Unterstützte AMD64-Ziele
Die folgende Tabelle fasst derzeit unterstützte x86-64-Ziele zusammen
(GOOS=tamago GOARCH=amd64).
| CPU | Plattform | CPU-Paket | Plattform-Paket |
|---|---|---|---|
| AMD/Intel 64-bit | Cloud Hypervisor | amd64 | cloud_hypervisor/vm |
| AMD/Intel 64-bit | Firecracker microvm | amd64 | firecracker/microvm |
| AMD/Intel 64-bit | QEMU microvm | amd64 | qemu/microvm |
| AMD/Intel 64-bit | UEFI | amd64 | uefi/x64 |
| AMD/Intel 64-bit | Google Compute Engine | amd64 | google/gcp, uefi/x64 |
Unterstützte ARM-Ziele
Die folgende Tabelle fasst derzeit unterstützte ARM-SoCs und -Boards zusammen
(GOOS=tamago GOARCH=arm).
| SoC | Board | SoC-Paket | Board-Paket |
|---|---|---|---|
| NXP i.MX6ULZ/i.MX6UL | USB armory Mk II | imx6ul | usbarmory/mk2 |
| NXP i.MX6ULL/i.MX6UL | USB armory Mk II LAN | imx6ul | usbarmory/mk2 |
| NXP i.MX6ULL/i.MX6ULZ | MCIMX6ULL-EVK | imx6ul | mx6ullevk |
| Broadcom BCM2835 | Raspberry Pi Zero | bcm2835 | pi/pizero |
| Broadcom BCM2835 | Raspberry Pi 1 Model A+ | bcm2835 | pi/pi1 |
| Broadcom BCM2835 | Raspberry Pi 1 Model B+ | bcm2835 | pi/pi1 |
| Broadcom BCM2836 | Raspberry Pi 2 Model B | bcm2835 | pi/pi2 |
| Nuvoton NUC980 | NuMaker-IIoT-NUC980G2 | nuc980 | nuc980iiot |
Unterstützte ARM64-Ziele
Die folgende Tabelle fasst derzeit unterstützte ARM64-SoCs und -Boards zusammen
(GOOS=tamago GOARCH=arm64).
| SoC | Board | SoC-Paket | Board-Paket |
|---|---|---|---|
| NXP i.MX8M Plus | 8MPLUSLPD4-EVK | imx8mp | imx8mpevk |
| Microchip LAN969x | EVB-LAN9696-24port | lan969x | lan9696evb |
Unterstützte RISC-V-Ziele
Die folgende Tabelle fasst derzeit unterstützte RISC-V-SoCs und -Boards zusammen
(GOOS=tamago GOARCH=riscv64).
| SoC | Board | SoC-Paket | Board-Paket |
|---|---|---|---|
| SiFive FU540 | QEMU sifive_u | fu540 | qemu/sifive_u |
| AI Foundry Erbium | erbium_emu | erbium | erbium_emu |
| AI Foundry ET-SoC-1 | sys_emu | etsoc1 | sys_emu |
Userspace-Ziele
Die Ausführung von mit GOOS=tamago kompilierten Programmen kann auch im Userspace erfolgen, indem ein Paket importiert wird, das den erforderlichen runtime/goos-Overlay mit Betriebssystem-Überwachung anstelle von Bare-Metal-Treibern implementiert.
Das Kompilieren und Ausführen von Go-Programmen im Userspace als GOOS=tamago bietet den Vorteil der Systemaufruf-Isolation, da das ausführbare Programm die Go-Laufzeit nicht nutzen kann, um direkt auf Betriebssystem-Ressourcen zuzugreifen. Dies führt zu:
- Isolation vom Betriebssystem-Dateisystem durch emulierte Festplatte im Arbeitsspeicher
- Isolation vom Betriebssystem-Netzwerk, siehe net.SocketFunc
- API für benutzerdefinierte Netzwerk-, Zufallszahlen- und Zeit-Handler
Die folgende Tabelle fasst derzeit verfügbare Userspace-Unterstützung zusammen:
| Betriebssystem | GOARCH | Laufzeit-Pakete |
|---|---|---|
| Linux | amd64,arm,arm64,riscv64 | runtime/goos¹ |
| Linux | amd64,arm,arm64,riscv64 | linux |
| GoTEE | arm,riscv64 | applet |
¹ Verwendet zum Ausführen von Standard-Distributionstests und go test -tags user_linux
Kompilieren
Go-Distribution mit Unterstützung für GOOS=tamago
Der Befehl tamago
lädt den go-Befehl aus der
TamaGo-Distribution herunter, kompiliert und führt ihn aus,
die mit der tamago-Modulversion aus der go.mod der Anwendung übereinstimmt.
Anwendungen können github.com/usbarmory/tamago zur go.mod hinzufügen und dann den go-Befehl ersetzen durch:
go run github.com/usbarmory/tamago/cmd/tamago
oder die folgende Zeile zur go.mod hinzufügen, um go tool tamago als go-Befehl zu verwenden:
tool github.com/usbarmory/tamago/cmd/tamago
Alternativ kann die neueste TamaGo-Distribution manuell erstellt werden oder die neueste binäre Veröffentlichung verwendet werden:
wget https://github.com/usbarmory/tamago-go/archive/refs/tags/latest.zip
unzip latest.zip
cd tamago-go-latest/src && ./all.bash
cd ../bin && export TAMAGO=`pwd`/go
Anwendungen erstellen
Beim Kompilieren muss die Go-Umgebungsvariable GOOSPKG gesetzt werden, um diese Bibliothek als Overlay zu aktivieren und GOOS=tamago zu unterstützen.
export GOOSPKG=github.com/usbarmory/tamago
Go-Anwendungen müssen das entsprechende Board-Paket importieren, um sicherzustellen, dass die Hardware-Initialisierung und Laufzeitunterstützung stattfinden:
import (
// Beispiel für USB armory Mk II
_ "github.com/usbarmory/tamago/board/usbarmory/mk2"
)
Go-Anwendungen können mit dem im vorherigen Schritt erstellten Compiler kompiliert werden, mit einigen zusätzlichen Flags/Variablen:
# Diese Bibliothek als `runtime/goos`-Overlay setzen
export GOOSPKG=github.com/usbarmory/tamago
# Beispiel für Cloud Hypervisory, QEMU und Firecracker KVMs
GOOS=tamago GOARCH=amd64 ${TAMAGO} build -ldflags "-T 0x10010000 -R 0x1000" main.go
# Beispiel für NXP i.MX6UL
GOOS=tamago GOARM=7 GOARCH=arm ${TAMAGO} build -ldflags "-T 0x80010000 -R 0x1000" main.go
# Beispiel für NXP 8MPLUSLPD4-EVK
GOOS=tamago GOARCH=arm64 ${TAMAGO} build -ldflags "-T 0x40010000 -R 0x1000" main.go
# Beispiel für SiFive FU540
GOOS=tamago GOARCH=riscv64 ${TAMAGO} build -ldflags "-T 0x80010000 -R 0x1000" main.go
# Beispiel für AI Foundry Erbium
GOOS=tamago GOARCH=riscv64 GOSOFT=1 ${TAMAGO} build -ldflags "-T 0x40010000 -R 0x1000" main.go
# Beispiel für Linux Userspace
GOOS=tamago ${TAMAGO} build main.go
Siehe die jeweilige README-Datei des Board-Pakets für Kompilierungsinformationen zu jedem spezifischen Ziel.
Build-Tags
Die folgenden Build-Tags erlauben es Anwendungen, die paketeigenen Definitionen für den runtime/goos-Overlay zu überschreiben:
linkramstart: ÜberschreibtramStartlinkramsize: ÜberschreibtramSizelinkprintk: Überschreibtprintklinkcpuinit: Überschreibtcpuinittiny: Reduziert die Heap-Allokationsanforderungen
Ausführen und Debuggen
Siehe die jeweilige README-Datei des Board-Pakets für Ausführungs- und Debugging-Informationen zu jedem spezifischen Ziel (echt oder emuliert).
Die Beispielanwendung bietet eine beispielhafte Treibernutzung und Anleitungen sowohl für native als auch emulierte Ausführung.
Ein emulierter Lauf der Beispielanwendung kann wie folgt gestartet werden:
git clone https://github.com/usbarmory/tamago-example
cd tamago-example && make qemu
Anwendungen, die TamaGo verwenden
- go-boot – der Bare-Metal-Go-UEFI-Boot-Manager
- GoKey – die Bare-Metal-Go-Smartcard
- GoTEE – Go Trusted Execution Environment
- ArmoredWitness – ökosystemübergreifendes Witness-Netzwerk
- armory-drive – USB-verschlüsseltes Laufwerk
- armory-ums – USB-Massenspeicher-Firmware
- armory-boot – USB armory Bootloader
- tamago-example – TamaGo-Beispielanwendung
- tamago-sev-example – Beispiel für eine vertrauliche VM (AMD SEV-SNP)
- kotama – Tiny RISC-V Ziel-Demonstrator
- kanzashi – Bare-Metal-Agent
Externe Treiber mit TamaGo
- go-net – Generischer Netzwerktreiber
- go-net/imx-usb – i.MX Ethernet über USB-Treiber
- go-net/virtio – VirtIO-Netzwerktreiber
- imx-usbserial – i.MX Seriell über USB-Treiber
Zusätzliche Ressourcen
- Paket-API
- Laufzeit-API
- Kompatibilität
- Internals
- FAQ
- Präsentationen: TamaGo, ArmoredWitness
Betreuer
Andrea Barisani
[email protected]
Andrej Rosano
[email protected]
Lizenz
tamago | https://github.com/usbarmory/tamago
Copyright (c) The TamaGo Authors. All Rights Reserved.
Dieses Projekt wird unter der BSD-ähnlichen Lizenz verteilt, die sich in der LICENSE-Datei befindet.
Das TamaGo-Logo ist eine Adaption des Go-Gophers, der von Renee French entworfen wurde und unter der Creative Commons 3.0 Attribution-Lizenz lizenziert ist. Go-Gopher-Vektorillustration von Hugo Arganda.