
Framework para compilar e executar aplicações Go em processadores bare metal, permitindo o desenvolvimento seguro de firmware com superfície de ataque reduzida através da remoção de dependências de SO e C.
tamago | https://github.com/usbarmory/tamago
Copyright (c) The TamaGo Authors. Todos os direitos reservados.
TamaGo é um framework que possibilita a compilação e execução de aplicações Go sem dependências em processadores bare metal (AMD64, ARM, ARM64, RISCV64).
O projeto surge do desejo de reduzir a superfície de ataque do firmware de sistemas embarcados, removendo qualquer dependência em tempo de execução de código C e sistemas operacionais.
O framework TamaGo consiste nos seguintes componentes:
Uma distribuição Go modificada
que estende o suporte a GOOS para o destino tamago, permitindo execução
bare metal através de uma sobreposição runtime/goos
definida por GOOSPKG.
Pacotes Go para suporte a processadores/SoCs.
Pacotes Go para suporte a placas.
As modificações são mínimas em relação ao compilador Go original, runtime e a aplicação alvo (uma importação necessária), com uma separação limpa de outras arquiteturas.
Uma forte ênfase é colocada na reutilização de código de arquiteturas existentes já incluídas no runtime Go padrão, veja Internos.
As modificações mantêm suporte completo à biblioteca padrão.
Tais aspectos são motivados pelo desejo de fornecer um framework que permita o desenvolvimento seguro de firmware Go em sistemas embarcados.
Os links a seguir são os lançamentos mais recentes da
Distribuição Go modificada TamaGo,
que adiciona suporte a GOOS=tamago à versão Go correspondente, e da
Biblioteca TamaGo:
A documentação principal pode ser encontrada no wiki do projeto.
A documentação da API dos pacotes pode ser encontrada em pkg.go.dev.
A tabela a seguir resume os destinos x86-64 atualmente suportados
(GOOS=tamago GOARCH=amd64).
A tabela a seguir resume os SoCs e placas ARM atualmente suportados
(GOOS=tamago GOARCH=arm).
A tabela a seguir resume os SoCs e placas ARM64 atualmente suportados
(GOOS=tamago GOARCH=arm64).
A tabela a seguir resume os SoCs e placas RISC-V atualmente suportados
(GOOS=tamago GOARCH=riscv64).
A execução de programas compilados com GOOS=tamago também pode ocorrer em
espaço de usuário, importando qualquer pacote que implemente a sobreposição
runtime/goos necessária com supervisão do SO em vez de drivers bare metal.
Compilar e executar programas Go em espaço de usuário como GOOS=tamago
fornece o benefício do isolamento de chamadas de sistema, pois o executável
não pode aproveitar o runtime Go para acessar diretamente os recursos do SO,
isso resulta em:
A tabela a seguir resume o suporte atual para espaço de usuário:
¹ Usado para executar testes de distribuição padrão e go test -tags user_linux
GOOS=tamagoO comando tamago
baixa, compila e executa o comando go da
Distribuição TamaGo correspondente à
versão do módulo tamago no go.mod da aplicação.
As aplicações podem adicionar github.com/usbarmory/tamago ao go.mod e, em
seguida, substituir o comando go por:
go run github.com/usbarmory/tamago/cmd/tamago
ou adicionar a seguinte linha ao go.mod para usar go tool tamago como comando go:
tool github.com/usbarmory/tamago/cmd/tamago
Alternativamente, a última distribuição TamaGo pode ser compilada manualmente ou o último lançamento binário pode ser usado:
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
Durante a compilação, a variável de ambiente Go GOOSPKG deve ser definida para
habilitar esta biblioteca como sobreposição para suportar GOOS=tamago.
export GOOSPKG=github.com/usbarmory/tamago
As aplicações Go são obrigadas a importar o pacote de placa relevante para garantir que a inicialização de hardware e o suporte de runtime ocorram:
import (
// Exemplo para USB armory Mk II
_ "github.com/usbarmory/tamago/board/usbarmory/mk2"
)
As aplicações Go podem ser compiladas com o compilador construído na etapa anterior, com a adição de alguns flags/variáveis:
# define esta biblioteca como sobreposição `runtime/goos`
export GOOSPKG=github.com/usbarmory/tamago
# Exemplo para Cloud Hypervisor, QEMU e Firecracker KVM
GOOS=tamago GOARCH=amd64 ${TAMAGO} build -ldflags "-T 0x10010000 -R 0x1000" main.go
# Exemplo para NXP i.MX6UL
GOOS=tamago GOARM=7 GOARCH=arm ${TAMAGO} build -ldflags "-T 0x80010000 -R 0x1000" main.go
# Exemplo para NXP 8MPLUSLPD4-EVK
GOOS=tamago GOARCH=arm64 ${TAMAGO} build -ldflags "-T 0x40010000 -R 0x1000" main.go
# Exemplo para SiFive FU540
GOOS=tamago GOARCH=riscv64 ${TAMAGO} build -ldflags "-T 0x80010000 -R 0x1000" main.go
# Exemplo para AI Foundry Erbium
GOOS=tamago GOARCH=riscv64 GOSOFT=1 ${TAMAGO} build -ldflags "-T 0x40010000 -R 0x1000" main.go
# Exemplo para espaço de usuário Linux
GOOS=tamago ${TAMAGO} build main.go
Veja o arquivo README do respectivo pacote de placa para informações de compilação para cada destino específico.
As seguintes build tags permitem que as aplicações substituam a definição do
próprio pacote para a sobreposição runtime/goos:
linkramstart: substitui ramStartlinkramsize: substitui ramSizelinkprintk: substitui printklinkcpuinit: substitui cpuinittiny: reduz requisitos de alocação de heapVeja o arquivo README do respectivo pacote de placa para informações de execução e depuração para cada destino específico (real ou emulado).
A aplicação de exemplo fornece uso de driver de exemplo e instruções para execução nativa, bem como emulada.
Uma execução emulada da aplicação de exemplo pode ser iniciada da seguinte forma:
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. Todos os direitos reservados.
Este projeto é distribuído sob a licença BSD encontrada no arquivo LICENSE.
O logotipo TamaGo é adaptado do gopher Go projetado por Renee French e licenciado sob a licença Creative Commons 3.0 Attributions. Ilustração vetorial do Go Gopher por Hugo Arganda.
| CPU | Plataforma | Pacote CPU | Pacote 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 | Pacote SoC | Pacote 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 | Pacote SoC | Pacote Placa |
|---|
| NXP i.MX8M Plus | 8MPLUSLPD4-EVK | imx8mp | imx8mpevk |
| Microchip LAN969x | EVB-LAN9696-24port | lan969x | lan9696evb |
| SoC | Placa | Pacote SoC | Pacote 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 Operacional | GOARCH | Pacotes Runtime |
|---|
| Linux | amd64,arm,arm64,riscv64 | runtime/goos¹ |
| Linux | amd64,arm,arm64,riscv64 | linux |
| GoTEE | arm,riscv64 | applet |