
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 | https://github.com/usbarmory/tamago
Copyright (c) The TamaGo Authors. All Rights Reserved.
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 GOOS um das Ziel tamago erweitert und Bare-Metal-Ausführung durch einen von GOOSPKG gesetzten 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.
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:
Die Hauptdokumentation befindet sich im Projekt-Wiki.
Die API-Dokumentation der Pakete findet sich unter pkg.go.dev.
Die folgende Tabelle fasst derzeit unterstützte x86-64-Ziele zusammen
(GOOS=tamago GOARCH=amd64).
Die folgende Tabelle fasst derzeit unterstützte ARM-SoCs und -Boards zusammen
(GOOS=tamago GOARCH=arm).
Die folgende Tabelle fasst derzeit unterstützte ARM64-SoCs und -Boards zusammen
(GOOS=tamago GOARCH=arm64).
Die folgende Tabelle fasst derzeit unterstützte RISC-V-SoCs und -Boards zusammen
(GOOS=tamago GOARCH=riscv64).
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:
Die folgende Tabelle fasst derzeit verfügbare Userspace-Unterstützung zusammen:
¹ Verwendet zum Ausführen von Standard-Distributionstests und go test -tags user_linux
GOOS=tamagoDer 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
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.
Die folgenden Build-Tags erlauben es Anwendungen, die paketeigenen Definitionen für den runtime/goos-Overlay zu überschreiben:
linkramstart: Überschreibt ramStartlinkramsize: Überschreibt ramSizelinkprintk: Überschreibt printklinkcpuinit: Überschreibt cpuinittiny: Reduziert die Heap-AllokationsanforderungenSiehe 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
Andrea Barisani
[email protected]
Andrej Rosano
[email protected]
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.
| 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 |
| 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 |
| SoC | Board | SoC-Paket | Board-Paket |
|---|
| NXP i.MX8M Plus | 8MPLUSLPD4-EVK | imx8mp | imx8mpevk |
| Microchip LAN969x | EVB-LAN9696-24port | lan969x | lan9696evb |
| 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 |
| Betriebssystem | GOARCH | Laufzeit-Pakete |
|---|
| Linux | amd64,arm,arm64,riscv64 | runtime/goos¹ |
| Linux | amd64,arm,arm64,riscv64 | linux |
| GoTEE | arm,riscv64 | applet |