
Framework para compilar y ejecutar aplicaciones Go en procesadores bare metal, que permite el desarrollo seguro de firmware con una superficie de ataque reducida al eliminar las dependencias del sistema operativo y de C.
tamago | https://github.com/usbarmory/tamago
Copyright (c) The TamaGo Authors. All Rights Reserved.
TamaGo es un framework que permite la compilación y ejecución de aplicaciones Go sin restricciones en procesadores de metal desnudo (AMD64, ARM, ARM64, RISCV64).
El proyecto surge del deseo de reducir la superficie de ataque del firmware de sistemas embebidos eliminando cualquier dependencia en tiempo de ejecución de código C y sistemas operativos.
El framework TamaGo consta de los siguientes componentes:
Una distribución Go modificada
que extiende el soporte GOOS al objetivo tamago, permitiendo la ejecución en metal desnudo a través de una
superposición runtime/goos
establecida por GOOSPKG.
Paquetes Go para soporte de procesador/SoC.
Paquetes Go para soporte de placas.
Las modificaciones son mínimas en comparación con el compilador Go original, el runtime y la aplicación objetivo (una importación requerida), con una separación limpia de otras arquitecturas.
Se pone un fuerte énfasis en la reutilización de código de las arquitecturas existentes ya incluidas en el runtime estándar de Go, consulte Internals.
Las modificaciones mantienen soporte completo de la biblioteca estándar.
Dichos aspectos están motivados por el deseo de proporcionar un framework que permita el desarrollo seguro de firmware Go en sistemas embebidos.
Los siguientes enlaces son los últimos lanzamientos para la
distribución Go modificada de TamaGo,
que agrega soporte GOOS=tamago a la versión Go correspondiente, y la
biblioteca TamaGo:
La documentación principal se puede encontrar en el wiki del proyecto.
La documentación de la API del paquete se puede encontrar en pkg.go.dev.
La siguiente tabla resume los objetivos x86-64 actualmente compatibles
(GOOS=tamago GOARCH=amd64).
La siguiente tabla resume los SoC y placas ARM actualmente compatibles
(GOOS=tamago GOARCH=arm).
La siguiente tabla resume los SoC y placas ARM64 actualmente compatibles
(GOOS=tamago GOARCH=arm64).
La siguiente tabla resume los SoC y placas RISC-V actualmente compatibles
(GOOS=tamago GOARCH=riscv64).
La ejecución de programas compilados con GOOS=tamago también puede realizarse en
espacio de usuario importando cualquier paquete que implemente la superposición
runtime/goos requerida con supervisión del sistema operativo en lugar de controladores de metal desnudo.
Compilar y ejecutar programas Go en espacio de usuario como GOOS=tamago proporciona el
beneficio del aislamiento de llamadas al sistema, ya que el ejecutable no puede aprovechar
el runtime Go para acceder directamente a los recursos del sistema operativo; esto resulta en:
La siguiente tabla resume el soporte de espacio de usuario actualmente disponible:
¹ Se usa para ejecutar pruebas de distribución estándar y go test -tags user_linux
GOOS=tamagoEl comando tamago
descarga, compila y ejecuta el comando go de la
distribución TamaGo que coincide con la
versión del módulo tamago desde el go.mod de la aplicación.
Las aplicaciones pueden agregar github.com/usbarmory/tamago a go.mod, y luego
reemplazar el comando go con:
go run github.com/usbarmory/tamago/cmd/tamago
o agregar la siguiente línea a go.mod para usar go tool tamago como comando go:
tool github.com/usbarmory/tamago/cmd/tamago
Alternativamente, se puede compilar manualmente la última distribución TamaGo o usar la última versión binaria:
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
Al compilar, la variable de entorno Go GOOSPKG debe configurarse para habilitar
esta biblioteca como superposición para soportar GOOS=tamago.
export GOOSPKG=github.com/usbarmory/tamago
Las aplicaciones Go deben importar el paquete de placa correspondiente para asegurar que la inicialización del hardware y el soporte de runtime se realicen:
import (
// Ejemplo para USB armory Mk II
_ "github.com/usbarmory/tamago/board/usbarmory/mk2"
)
Las aplicaciones Go se pueden compilar con el compilador construido en el paso anterior, con la adición de algunas banderas/variables:
# establecer esta biblioteca como superposición `runtime/goos`
export GOOSPKG=github.com/usbarmory/tamago
# Ejemplo para Cloud Hypervisory, QEMU y Firecracker KVMs
GOOS=tamago GOARCH=amd64 ${TAMAGO} build -ldflags "-T 0x10010000 -R 0x1000" main.go
# Ejemplo para NXP i.MX6UL
GOOS=tamago GOARM=7 GOARCH=arm ${TAMAGO} build -ldflags "-T 0x80010000 -R 0x1000" main.go
# Ejemplo para NXP 8MPLUSLPD4-EVK
GOOS=tamago GOARCH=arm64 ${TAMAGO} build -ldflags "-T 0x40010000 -R 0x1000" main.go
# Ejemplo para SiFive FU540
GOOS=tamago GOARCH=riscv64 ${TAMAGO} build -ldflags "-T 0x80010000 -R 0x1000" main.go
# Ejemplo para AI Foundry Erbium
GOOS=tamago GOARCH=riscv64 GOSOFT=1 ${TAMAGO} build -ldflags "-T 0x40010000 -R 0x1000" main.go
# Ejemplo para espacio de usuario Linux
GOOS=tamago ${TAMAGO} build main.go
Consulte el archivo README del paquete de placa respectivo para obtener información de compilación para cada objetivo específico.
Las siguientes etiquetas de compilación permiten a las aplicaciones anular la definición
del propio paquete para la superposición runtime/goos:
linkramstart: anular ramStartlinkramsize: anular ramSizelinkprintk: anular printklinkcpuinit: anular cpuinittiny: reducir los requisitos de asignación de heapConsulte el archivo README del paquete de placa respectivo para obtener información de ejecución y depuración para cada objetivo específico (real o emulado).
La aplicación de ejemplo proporciona un uso de controlador de muestra e instrucciones para la ejecución nativa y emulada.
Se puede lanzar una ejecución emulada de la aplicación de ejemplo de la siguiente manera:
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.
Este proyecto se distribuye bajo la licencia de estilo BSD que se encuentra en el archivo LICENSE.
El logotipo de TamaGo está adaptado del gopher de Go diseñado por Renee French y licenciado bajo la licencia Creative Commons 3.0 Attributions. Ilustración vectorial del gopher Go por Hugo Arganda.
| CPU | Plataforma | Paquete CPU | Paquete de plataforma |
|---|
| 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 | Placa | Paquete SoC | Paquete de placa |
|---|
| 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 | Placa | Paquete SoC | Paquete de placa |
|---|
| NXP i.MX8M Plus | 8MPLUSLPD4-EVK | imx8mp | imx8mpevk |
| Microchip LAN969x | EVB-LAN9696-24port | lan969x | lan9696evb |
| SoC | Placa | Paquete SoC | Paquete de placa |
|---|
| 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 |
| Sistema Operativo | GOARCH | Paquetes de runtime |
|---|
| Linux | amd64,arm,arm64,riscv64 | runtime/goos¹ |
| Linux | amd64,arm,arm64,riscv64 | linux |
| GoTEE | arm,riscv64 | applet |