
Framework pour compiler et exécuter des applications Go sur des processeurs bare metal, permettant un développement de firmware sécurisé avec une surface d'attaque réduite grâce à la suppression des dépendances OS et C.
TamaGo - Go sur métal nu
======================
tamago | https://github.com/usbarmory/tamago
Copyright (c) The TamaGo Authors. All Rights Reserved.

Introduction
============
TamaGo est un framework qui permet la compilation et l'exécution d'applications Go non entravées sur des processeurs en métal nu.
Les projets naissent du désir de réduire la surface d'attaque des firmwares de systèmes embarqués en supprimant toute dépendance à l'exécution de code C et de systèmes d'exploitation.
Le framework TamaGo est constitué des composants suivants :
- Une [distribution Go](https://github.com/usbarmory/tamago-go) modifiée
qui étend le support de `GOOS` à la cible `tamago`, permettant une exécution
en métal nu via une surcouche [runtime/goos](https://github.com/usbarmory/tamago-go/tree/latest/src/runtime/goos)
définie par `GOOSPKG`.
- Des paquets Go pour le support des processeurs/SoC.
- Des paquets Go pour le support des cartes.
Les modifications sont minimales par rapport au compilateur Go original, au runtime et à l'application cible (un import requis), avec une séparation nette des autres architectures.
Une forte emphase est mise sur la réutilisation du code des architectures existantes déjà incluses dans le runtime Go standard, voir
[Internals](https://github.com/usbarmory/tamago/wiki/Internals).
Les modifications maintiennent un [support complet de la bibliothèque standard](https://github.com/usbarmory/tamago/wiki/Compatibility).
Ces aspects sont motivés par le désir de fournir un framework qui permet le développement sécurisé de firmwares Go sur des systèmes embarqués.
Versions actuelles
==================
Les liens suivants sont les dernières versions de la
[distribution Go modifiée TamaGo](https://github.com/usbarmory/tamago-go),
qui ajoute le support de `GOOS=tamago` à la version Go correspondante, et de la
[bibliothèque TamaGo](https://github.com/usbarmory/tamago) :
[](https://github.com/usbarmory/tamago-go/releases/latest) [](https://github.com/usbarmory/tamago-go/actions)
[](https://github.com/usbarmory/tamago/releases/latest)
Documentation
=============
[](https://pkg.go.dev/github.com/usbarmory/tamago)
La documentation principale se trouve sur le
[wiki du projet](https://github.com/usbarmory/tamago/wiki).
La documentation de l'API des paquets se trouve sur
[pkg.go.dev](https://pkg.go.dev/github.com/usbarmory/tamago).
Cibles AMD64 supportées
=======================
Le tableau suivant résume les cibles x86-64 actuellement supportées
(`GOOS=tamago GOARCH=amd64`).
| CPU | Plateforme | Paquet CPU | Paquet plateforme |
|------------------|---------------------------------------------------------------------------|----------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------|
| AMD/Intel 64-bit | [Cloud Hypervisor](https://www.cloudhypervisor.org ) | [amd64](https://github.com/usbarmory/tamago/tree/master/amd64) | [cloud_hypervisor/vm](https://github.com/usbarmory/tamago/tree/master/board/cloud_hypervisor/vm) |
| AMD/Intel 64-bit | [Firecracker microvm](https://firecracker-microvm.github.io) | [amd64](https://github.com/usbarmory/tamago/tree/master/amd64) | [firecracker/microvm](https://github.com/usbarmory/tamago/tree/master/board/firecracker/microvm) |
| AMD/Intel 64-bit | [QEMU microvm](https://www.qemu.org/docs/master/system/i386/microvm.html) | [amd64](https://github.com/usbarmory/tamago/tree/master/amd64) | [qemu/microvm](https://github.com/usbarmory/tamago/tree/master/board/qemu/microvm) |
| AMD/Intel 64-bit | [UEFI](https://uefi.org/) | [amd64](https://github.com/usbarmory/tamago/tree/master/amd64) | [uefi/x64](https://github.com/usbarmory/go-boot/tree/main/uefi/x64) |
| AMD/Intel 64-bit | [Google Compute Engine](https://cloud.google.com/products/compute) | [amd64](https://github.com/usbarmory/tamago/tree/master/amd64) | [google/gcp](https://github.com/usbarmory/tamago/tree/master/board/google/gcp), [uefi/x64](https://github.com/usbarmory/go-boot/tree/main/uefi/x64) |
Cibles ARM supportées
=====================
Le tableau suivant résume les SoC et cartes ARM actuellement supportés
(`GOOS=tamago GOARCH=arm`).
| SoC | Carte | Paquet SoC | Paquet carte |
|-----------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------|----------------------------------------------------------------------------------------|
| NXP i.MX6ULZ/i.MX6UL | [USB armory Mk II](https://github.com/usbarmory/usbarmory/wiki/Mk-II-Introduction) | [imx6ul](https://github.com/usbarmory/tamago/tree/master/soc/nxp/imx6ul) | [usbarmory/mk2](https://github.com/usbarmory/tamago/tree/master/board/usbarmory) |
| NXP i.MX6ULL/i.MX6UL | [USB armory Mk II LAN](https://github.com/usbarmory/usbarmory/wiki/Mk-II-LAN) | [imx6ul](https://github.com/usbarmory/tamago/tree/master/soc/nxp/imx6ul) | [usbarmory/mk2](https://github.com/usbarmory/tamago/tree/master/board/usbarmory) |
| NXP i.MX6ULL/i.MX6ULZ | [MCIMX6ULL-EVK](https://www.nxp.com/design/development-boards/i-mx-evaluation-and-development-boards/evaluation-kit-for-the-i-mx-6ull-and-6ulz-applications-processor:MCIMX6ULL-EVK) | [imx6ul](https://github.com/usbarmory/tamago/tree/master/soc/nxp/imx6ul) | [mx6ullevk](https://github.com/usbarmory/tamago/tree/master/board/nxp/mx6ullevk) |
| Broadcom BCM2835 | [Raspberry Pi Zero](https://www.raspberrypi.org/products/raspberry-pi-zero) | [bcm2835](https://github.com/usbarmory/tamago/tree/master/soc/bcm2835) | [pi/pizero](https://github.com/usbarmory/tamago/tree/master/board/raspberrypi) |
| Broadcom BCM2835 | [Raspberry Pi 1 Model A+](https://www.raspberrypi.org/products/raspberry-pi-1-model-a-plus/) | [bcm2835](https://github.com/usbarmory/tamago/tree/master/soc/bcm2835) | [pi/pi1](https://github.com/usbarmory/tamago/tree/master/board/raspberrypi) |
| Broadcom BCM2835 | [Raspberry Pi 1 Model B+](https://www.raspberrypi.org/products/raspberry-pi-1-model-b-plus/) | [bcm2835](https://github.com/usbarmory/tamago/tree/master/soc/bcm2835) | [pi/pi1](https://github.com/usbarmory/tamago/tree/master/board/raspberrypi) |
| Broadcom BCM2836 | [Raspberry Pi 2 Model B](https://www.raspberrypi.org/products/raspberry-pi-2-model-b) | [bcm2835](https://github.com/usbarmory/tamago/tree/master/soc/bcm2835) | [pi/pi2](https://github.com/usbarmory/tamago/tree/master/board/raspberrypi) |
| Nuvoton NUC980 | [NuMaker-IIoT-NUC980G2](https://www.nuvoton.com/products/iot-solution/iot-platform/numaker-iiot-nuc980g2) | [nuc980](https://github.com/usbarmory/tamago/tree/master/soc/nuvoton/nuc980) | [nuc980iiot](https://github.com/usbarmory/tamago/tree/master/board/nuvoton/nuc980iiot) |
Cibles ARM64 supportées
=======================
Le tableau suivant résume les SoC et cartes ARM64 actuellement supportés
(`GOOS=tamago GOARCH=arm64`).
| SoC | Carte | Paquet SoC | Paquet carte |
|-------------------|----------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|------------------------------------------------------------------------------------------|
| NXP i.MX8M Plus | [8MPLUSLPD4-EVK](https://www.nxp.com/design/design-center/development-boards-and-designs/8MPLUSLPD4-EVK) | [imx8mp](https://github.com/usbarmory/tamago/tree/master/soc/nxp/imx8mp) | [imx8mpevk](https://github.com/usbarmory/tamago/tree/master/board/nxp/imx8mpevk) |
| Microchip LAN969x | [EVB-LAN9696-24port](https://www.microchip.com/en-us/development-tool/ev23x71a) | [lan969x](https://github.com/usbarmory/tamago/tree/master/soc/microchip/lan969x) | [lan9696evb](https://github.com/usbarmory/tamago/tree/master/board/microchip/lan9696evb) |
Cibles RISC-V supportées
========================
Le tableau suivant résume les SoC et cartes RISC-V actuellement supportés
(`GOOS=tamago GOARCH=riscv64`).
| SoC | Carte | Paquet SoC | Paquet carte |
|---------------------|-------------------------------------------------------------------------------|-----------------------------------------------------------------------------------|------------------------------------------------------------------------------------------|
| AI Foundry Erbium | [erbium_emu](https://github.com/aifoundry-org/et-platform) | [erbium](https://github.com/usbarmory/tamago/tree/master/soc/aifoundry/erbium) | [erbium_emu](https://github.com/usbarmory/tamago/tree/master/board/aifoundry/erbium_emu) |
| AI Foundry ET-SoC-1 | [sys_emu](https://github.com/aifoundry-org/et-platform/tree/master/sw-sysemu) | [etsoc1](https://github.com/usbarmory/tamago/tree/master/soc/aifoundry/etsoc1) | [sys_emu](https://github.com/usbarmory/tamago/tree/master/board/aifoundry/sys_emu) |
| Fisilink FSL91030 | [MilkV Vega](https://milkv.io/vega) | [fsl91030](https://github.com/usbarmory/tamago/tree/master/soc/fisilink/fsl91030) | [vega](https://github.com/usbarmory/tamago/tree/master/board/milkv/vega) |
| Fisilink FSL91030 | [Nuclei QEMU](https://doc.nucleisys.com/nuclei_tools/qemu/index.html) | [fsl91030](https://github.com/usbarmory/tamago/tree/master/soc/fisilink/fsl91030) | [eval_soc](https://github.com/usbarmory/tamago/tree/master/board/nuclei/eval_soc) |
| SiFive FU540 | [QEMU sifive_u](https://www.qemu.org/docs/master/system/riscv/sifive_u.html) | [fu540](https://github.com/usbarmory/tamago/tree/master/soc/sifive/fu540) | [qemu/sifive_u](https://github.com/usbarmory/tamago/tree/master/board/qemu/sifive_u) |
Cibles LoongArch supportées
===========================
Le tableau suivant résume les SoC et cartes LoongArch actuellement supportés
(`GOOS=tamago GOARCH=loong64`).
| SoC | Carte | Paquet SoC | Paquet carte |
|-----------------|--------------------------------------------------------------------------|-----------------------------------------------------------------------------------|------------------------------------------------------------------------------|
| Loongson 3A5000 | [QEMU virt](https://www.qemu.org/docs/master/system/loongarch/virt.html) | [ls3a5000](https://github.com/usbarmory/tamago/tree/master/soc/loongson/ls3a5000) | [qemu/virt](https://github.com/usbarmory/tamago/tree/master/board/qemu/virt) |
Cibles espace utilisateur
=========================
L'exécution de programmes compilés avec `GOOS=tamago` peut également avoir lieu dans
l'espace utilisateur en important n'importe quel paquet qui implémente la surcouche
`runtime/goos` requise avec une supervision du système d'exploitation au lieu de pilotes en métal nu.
Compiler et exécuter des programmes Go dans l'espace utilisateur en tant que `GOOS=tamago` offre le
bénéfice de l'isolation des appels système, car l'exécutable ne peut pas s'appuyer sur le runtime Go
pour accéder directement aux ressources du système d'exploitation, ce qui entraîne :
* une isolation du système de fichiers de l'OS, via un disque émulé en mémoire
* une isolation du réseau de l'OS, voir [net.SocketFunc](https://github.com/usbarmory/tamago-go/blob/latest/src/net/net_tamago.go)
* une API pour la mise en réseau, le rng et les gestionnaires de temps personnalisés
Le tableau suivant résume le support actuellement disponible pour l'espace utilisateur :
| Système d'exploitation | `GOARCH` | Paquets runtime |
|----------------------------------------------|-------------------------|--------------------------------------------------------------------------------------|
| [Linux](https://www.kernel.org/) | amd64,arm,arm64,riscv64 | [runtime/goos](https://github.com/usbarmory/tamago-go/blob/latest/src/runtime/goos)¹ |
| [Linux](https://www.kernel.org/) | amd64,arm,arm64,riscv64 | [linux](https://github.com/usbarmory/tamago/tree/master/user/linux) |
| [GoTEE](https://github.com/usbarmory/GoTEE/) | arm,riscv64 | [applet](https://pkg.go.dev/github.com/usbarmory/GoTEE/applet) |
¹ Utilisé pour exécuter les [tests de la distribution standard](https://github.com/usbarmory/tamago/wiki/Compatibility) et `go test -tags user_linux`
Compilation
===========
Distribution Go supportant `GOOS=tamago`
---------------------------------------
La commande [tamago](https://github.com/usbarmory/tamago/tree/latest/cmd/tamago)
télécharge, compile et exécute la commande `go` de la
[distribution TamaGo](https://github.com/usbarmory/tamago-go) correspondant à la
version du module tamago du `go.mod` de l'application.
Les applications peuvent ajouter `github.com/usbarmory/tamago` à `go.mod`, puis
remplacer la commande `go` par :
```sh
go run github.com/usbarmory/tamago/cmd/tamago
```
ou ajoutez la ligne suivante à `go.mod` pour utiliser `go tool tamago` comme commande go :
```
tool github.com/usbarmory/tamago/cmd/tamago
```
Alternativement, la
[dernière distribution TamaGo](https://github.com/usbarmory/tamago-go/tree/latest) peut être
compilée manuellement ou la
[dernière version binaire](https://github.com/usbarmory/tamago-go/releases/latest) peut être utilisée :
```sh
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
```
Compilation d'applications
----------------------------
Lors de la compilation, la variable d'environnement Go `GOOSPKG` doit être définie pour activer cette bibliothèque en tant qu'overlay afin de prendre en charge `GOOS=tamago`.
```
export GOOSPKG=github.com/usbarmory/tamago
```
Les applications Go doivent importer le paquet de carte approprié pour garantir que l'initialisation du matériel et la prise en charge de l'exécution aient lieu :
```golang
import (
// Example for USB armory Mk II
_ "github.com/usbarmory/tamago/board/usbarmory/mk2"
)
```
Les applications Go peuvent être compilées avec le compilateur construit à l'étape précédente,
avec l'ajout de quelques flags/variables :
```sh
# set this library as `runtime/goos` overlay
export GOOSPKG=github.com/usbarmory/tamago
# Example for Cloud Hypervisory, QEMU and Firecracker KVMs
GOOS=tamago GOARCH=amd64 ${TAMAGO} build -ldflags "-T 0x10010000 -R 0x1000" main.go
# Example for NXP i.MX6UL
GOOS=tamago GOARM=7 GOARCH=arm ${TAMAGO} build -ldflags "-T 0x80010000 -R 0x1000" main.go
# Example for NXP 8MPLUSLPD4-EVK
GOOS=tamago GOARCH=arm64 ${TAMAGO} build -ldflags "-T 0x40010000 -R 0x1000" main.go
# Example for SiFive FU540
GOOS=tamago GOARCH=riscv64 ${TAMAGO} build -ldflags "-T 0x80010000 -R 0x1000" main.go
# Example for AI Foundry Erbium
GOOS=tamago GOARCH=riscv64 GOEXPERIMENT=softfloat ${TAMAGO} build -ldflags "-T 0x40010000 -R 0x1000" main.go
# Example for QEMU LoongArch virt
GOOS=tamago GOARCH=loong64 ${TAMAGO} build -ldflags "-T 0x1000000 -R 0x1000" main.go
# Example for Linux userspace
GOOS=tamago ${TAMAGO} build main.go
```
Consultez le fichier README du paquet de carte correspondant pour les informations de compilation relatives à chaque cible spécifique.
Balises de compilation
======================
Les balises de compilation suivantes permettent aux applications de remplacer la définition propre au paquet pour la surcouche `runtime/goos` :
* `linkramstart` : remplacer `ramStart`
* `linkramsize` : remplacer `ramSize`
* `linkprintk` : remplacer `printk`
* `linkcpuinit` : remplacer `cpuinit`
* `tiny` : réduire les besoins d'allocation du tas
Exécution et débogage
=====================
Consultez le fichier README du paquet de carte correspondant pour les informations d'exécution et de débogage relatives à chaque cible spécifique (réelle ou émulée).
L'[application d'exemple](https://github.com/usbarmory/tamago-example) fournit des exemples d'utilisation des pilotes ainsi que des instructions pour l'exécution native et émulée.
Une exécution émulée de l'[application d'exemple](https://github.com/usbarmory/tamago-example) peut être lancée comme suit :
```sh
git clone https://github.com/usbarmory/tamago-example
cd tamago-example && make qemu
```
Applications utilisant TamaGo
==============================
* [go-boot](https://github.com/usbarmory/go-boot) - le gestionnaire de démarrage UEFI Go bare metal
* [GoKey](https://github.com/usbarmory/GoKey) - la smartcard Go bare metal
* [GoTEE](https://github.com/usbarmory/GoTEE) - Go Trusted Execution Environment
* [ArmoredWitness](https://github.com/transparency-dev/armored-witness) - réseau de témoins inter-écosystèmes
* [armory-drive](https://github.com/usbarmory/armory-drive) - lecteur USB chiffré
* [armory-ums](https://github.com/usbarmory/armory-ums) - firmware USB Mass Storage
* [armory-boot](https://github.com/usbarmory/armory-boot) - chargeur de démarrage USB armory
* [tamago-example](https://github.com/usbarmory/tamago-example) - application d'exemple TamaGo
* [tamago-sev-example](https://github.com/usbarmory/tamago-sev-example) - exemple de VM confidentielle (AMD SEV-SNP)
* [kotama](https://github.com/usbarmory/kotama) - démonstrateur de cible RISC-V miniature
* [kanzashi](https://github.com/abarisani/kanzashi) - agent bare metal
Pilotes externes utilisant TamaGo
=================================
* [go-net](https://github.com/usbarmory/go-net) - pilote réseau générique
* [go-net/imx-usb](https://github.com/usbarmory/go-net/tree/main/imx-usb) - pilote i.MX Ethernet over USB
* [go-net/virtio](https://github.com/usbarmory/go-net/tree/main/virtio) - pilote réseau VirtIO
* [imx-usbserial](https://github.com/usbarmory/imx-usbserial) - pilote i.MX Serial over USB
Ressources supplémentaires
==========================
* [API du package](https://pkg.go.dev/github.com/usbarmory/tamago)
* [API du runtime](https://github.com/usbarmory/tamago-go/blob/latest/src/runtime/goos/README.md)
* [Compatibilité](https://github.com/usbarmory/tamago/wiki/Compatibility)
* [Fonctionnement interne](https://github.com/usbarmory/tamago/wiki/Internals)
* [FAQ](https://github.com/usbarmory/tamago/wiki/Frequently-Asked-Questions-(FAQ))
* Présentations : [TamaGo](https://github.com/abarisani/abarisani.github.io/tree/master/research/tamago), [ArmoredWitness](https://github.com/abarisani/abarisani.github.io/tree/master/research/witness)
Mainteneurs
===========
Andrea Barisani
[email protected]
Andrej Rosano
[email protected]
Licence
=======
tamago | https://github.com/usbarmory/tamago
Copyright (c) The TamaGo Authors. All Rights Reserved.
Ce projet est distribué sous la licence de style BSD disponible dans le
fichier [LICENSE](https://github.com/usbarmory/tamago/blob/master/LICENSE).
Le logo TamaGo est adapté du gopher Go conçu par Renee French et
sous licence Creative Commons 3.0 Attributions. Illustration vectorielle du
Go Gopher par Hugo Arganda.