Назад к обновлениям
New releaseJul 14, 2026

tamago v1.26.5

Фреймворк для компиляции и выполнения Go-приложений на голых металлических процессорах, обеспечивающий безопасную разработку прошивок с уменьшенной поверхностью атаки за счет удаления зависимостей от ОС и C.

Поделиться

TamaGo - bare metal Go

tamago | https://github.com/usbarmory/tamago

Copyright (c) The TamaGo Authors. All Rights Reserved.

TamaGo gopher

Введение

TamaGo — это фреймворк, который позволяет компилировать и выполнять Go-приложения без внешних зависимостей на голом железе (AMD64, ARM, ARM64, RISCV64).

Проект возник из желания уменьшить поверхность атаки встроенного ПО, устранив любые зависимости времени выполнения от кода на C и операционных систем.

Фреймворк TamaGo состоит из следующих компонентов:

  • Модифицированная дистрибуция Go, расширяющая поддержку GOOS до цели tamago, позволяющая выполнение на голом железе через наложение runtime/goos, устанавливаемое с помощью GOOSPKG.

  • Пакеты Go для поддержки процессоров/SoC.

  • Пакеты Go для поддержки плат.

Модификации минимальны по сравнению с оригинальным компилятором Go, средой выполнения и целевым приложением (требуется один импорт), с четким отделением от других архитектур.

Большое внимание уделяется повторному использованию кода из существующих архитектур, уже включенных в стандартную среду выполнения Go, см. Внутреннее устройство.

Модификации обеспечивают полную поддержку стандартной библиотеки.

Такие аспекты продиктованы желанием предоставить фреймворк, позволяющий разрабатывать безопасные Go-прошивки для встроенных систем.

Текущие релизы

Следующие ссылки ведут к последним релизам модифицированной дистрибуции Go TamaGo, добавляющей поддержку GOOS=tamago к соответствующей версии Go, и библиотеки TamaGo:

GitHub release Build Status
GitHub release

Документация

Go Reference

Основная документация находится в вики проекта.

Документация API пакетов доступна на pkg.go.dev.

Поддерживаемые цели AMD64

В следующей таблице приведены поддерживаемые в настоящее время цели x86-64 (GOOS=tamago GOARCH=amd64).

ЦППлатформаПакет ЦППакет платформы
AMD/Intel 64-bitCloud Hypervisoramd64cloud_hypervisor/vm
AMD/Intel 64-bitFirecracker microvmamd64firecracker/microvm
AMD/Intel 64-bitQEMU microvmamd64qemu/microvm
AMD/Intel 64-bitUEFIamd64uefi/x64
AMD/Intel 64-bitGoogle Compute Engineamd64google/gcp, uefi/x64

Поддерживаемые цели ARM

В следующей таблице приведены поддерживаемые в настоящее время SoC и платы ARM (GOOS=tamago GOARCH=arm).

SoCПлатаПакет SoCПакет платы
NXP i.MX6ULZ/i.MX6ULUSB armory Mk IIimx6ulusbarmory/mk2
NXP i.MX6ULL/i.MX6ULUSB armory Mk II LANimx6ulusbarmory/mk2
NXP i.MX6ULL/i.MX6ULZMCIMX6ULL-EVKimx6ulmx6ullevk
Broadcom BCM2835Raspberry Pi Zerobcm2835pi/pizero
Broadcom BCM2835Raspberry Pi 1 Model A+bcm2835pi/pi1
Broadcom BCM2835Raspberry Pi 1 Model B+bcm2835pi/pi1
Broadcom BCM2836Raspberry Pi 2 Model Bbcm2835pi/pi2
Nuvoton NUC980NuMaker-IIoT-NUC980G2nuc980nuc980iiot

Поддерживаемые цели ARM64

В следующей таблице приведены поддерживаемые в настоящее время SoC и платы ARM64 (GOOS=tamago GOARCH=arm64).

SoCПлатаПакет SoCПакет платы
NXP i.MX8M Plus8MPLUSLPD4-EVKimx8mpimx8mpevk
Microchip LAN969xEVB-LAN9696-24portlan969xlan9696evb

Поддерживаемые цели RISC-V

В следующей таблице приведены поддерживаемые в настоящее время SoC и платы RISC-V (GOOS=tamago GOARCH=riscv64).

SoCПлатаПакет SoCПакет платы
SiFive FU540QEMU sifive_ufu540qemu/sifive_u
AI Foundry Erbiumerbium_emuerbiumerbium_emu
AI Foundry ET-SoC-1sys_emuetsoc1sys_emu

Цели пользовательского пространства

Выполнение программ, скомпилированных с GOOS=tamago, также может происходить в пользовательском пространстве путем импорта любого пакета, который реализует необходимое наложение runtime/goos с контролем ОС вместо драйверов голого железа.

Компиляция и запуск Go-программ в пользовательском пространстве с GOOS=tamago дает преимущество изоляции системных вызовов, так как исполняемый файл не может использовать среду выполнения Go для прямого доступа к ресурсам ОС, что приводит к:

  • изоляция от файловой системы ОС через эмулируемый в памяти диск
  • изоляция от сетевых возможностей ОС, см. net.SocketFunc
  • API для пользовательских обработчиков сети, ГСЧ и времени

В следующей таблице приведены поддерживаемые в настоящее время цели пользовательского пространства:

Операционная системаGOARCHПакеты среды выполнения
Linuxamd64,arm,arm64,riscv64runtime/goos¹
Linuxamd64,arm,arm64,riscv64linux
GoTEEarm,riscv64applet

¹ Используется для запуска тестов стандартной дистрибуции и go test -tags user_linux

Компиляция

Дистрибуция Go с поддержкой GOOS=tamago

Команда tamago загружает, компилирует и запускает команду go из дистрибуции TamaGo, соответствующей версии модуля tamago из go.mod приложения.

Приложения могут добавить github.com/usbarmory/tamago в go.mod, а затем заменить команду go на:

go run github.com/usbarmory/tamago/cmd/tamago

или добавить следующую строку в go.mod, чтобы использовать go tool tamago в качестве команды go:

tool github.com/usbarmory/tamago/cmd/tamago

В качестве альтернативы последнюю дистрибуцию TamaGo можно собрать вручную или использовать последний бинарный релиз:

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

Сборка приложений

При компиляции необходимо установить переменную окружения Go GOOSPKG, чтобы включить эту библиотеку как наложение для поддержки GOOS=tamago.

export GOOSPKG=github.com/usbarmory/tamago

Go-приложения должны импортировать соответствующий пакет платы, чтобы обеспечить инициализацию оборудования и поддержку времени выполнения:

import (
	// Пример для USB armory Mk II
	_ "github.com/usbarmory/tamago/board/usbarmory/mk2"
)

Go-приложения могут быть скомпилированы компилятором, собранным на предыдущем шаге, с добавлением нескольких флагов/переменных:

# установите эту библиотеку как наложение `runtime/goos`
export GOOSPKG=github.com/usbarmory/tamago

# Пример для Cloud Hypervisor, QEMU и Firecracker KVM
GOOS=tamago GOARCH=amd64 ${TAMAGO} build -ldflags "-T 0x10010000 -R 0x1000" main.go

# Пример для NXP i.MX6UL
GOOS=tamago GOARM=7 GOARCH=arm ${TAMAGO} build -ldflags "-T 0x80010000 -R 0x1000" main.go

# Пример для NXP 8MPLUSLPD4-EVK
GOOS=tamago GOARCH=arm64 ${TAMAGO} build -ldflags "-T 0x40010000 -R 0x1000" main.go

# Пример для SiFive FU540
GOOS=tamago GOARCH=riscv64 ${TAMAGO} build -ldflags "-T 0x80010000 -R 0x1000" main.go

# Пример для AI Foundry Erbium
GOOS=tamago GOARCH=riscv64 GOSOFT=1 ${TAMAGO} build -ldflags "-T 0x40010000 -R 0x1000" main.go

# Пример для пользовательского пространства Linux
GOOS=tamago ${TAMAGO} build main.go

Смотрите файл README соответствующего пакета платы для информации о компиляции для каждой конкретной цели.

Теги сборки

Следующие теги сборки позволяют приложениям переопределять собственное определение пакета для наложения runtime/goos:

  • linkramstart: переопределить ramStart
  • linkramsize: переопределить ramSize
  • linkprintk: переопределить printk
  • linkcpuinit: переопределить cpuinit
  • tiny: уменьшить требования к выделению кучи

Выполнение и отладка

Смотрите файл README соответствующего пакета платы для информации о выполнении и отладке для каждой конкретной цели (реальной или эмулируемой).

Пример приложения предоставляет образцы использования драйвера и инструкции как для нативного, так и для эмулированного выполнения.

Эмулированный запуск примера приложения можно выполнить следующим образом:

git clone https://github.com/usbarmory/tamago-example
cd tamago-example && make qemu

Приложения, использующие TamaGo

  • go-boot — менеджер загрузки UEFI на голом железе Go
  • GoKey — смарт-карта на голом железе Go
  • GoTEE — доверенная среда выполнения Go
  • ArmoredWitness — кросс-экосистемная сеть свидетелей
  • armory-drive — зашифрованный USB-накопитель
  • armory-ums — прошивка USB Mass Storage
  • armory-boot — загрузчик USB armory
  • tamago-example — пример приложения TamaGo
  • tamago-sev-example — пример конфиденциальной ВМ (AMD SEV-SNP)
  • kotama — крошечный демонстратор цели RISC-V
  • kanzashi — агент голого железа

Внешние драйверы, использующие TamaGo

  • go-net — универсальный сетевой драйвер
  • go-net/imx-usb — драйвер i.MX Ethernet через USB
  • go-net/virtio — сетевой драйвер VirtIO
  • imx-usbserial — драйвер i.MX последовательного порта через USB

Дополнительные ресурсы

Сопровождающие

Andrea Barisani
[email protected]

Andrej Rosano
[email protected]

Лицензия

tamago | https://github.com/usbarmory/tamago
Copyright (c) The TamaGo Authors. All Rights Reserved.

Этот проект распространяется под лицензией BSD, находящейся в файле LICENSE.

Логотип TamaGo адаптирован из горефера Go, разработанного Renee French и лицензированного под лицензией Creative Commons 3.0 Attributions. Векторная иллюстрация Go Gopher выполнена Hugo Arganda.

Категории