
tamago v1.26.5
Framework for compiling and executing Go applications on bare metal processors, enabling secure firmware development with reduced attack surface through OS and C dependency removal. Goアプリケーションをベアメタルプロセッサ上でコンパイルおよび実行するためのフレームワーク。OSとCの依存関係を取り除くことで攻撃対象領域を減らし、セキュアなファームウェア開発を可能にします。
TamaGo - ベアメタルGo
tamago | https://github.com/usbarmory/tamago
著作権所有 (c) TamaGo Authors. 無断複製・転載を禁じます。
はじめに
TamaGo は、ベアメタルプロセッサ(AMD64、ARM、ARM64、RISCV64)上で、制約のない Go アプリケーションのコンパイルと実行を可能にするフレームワークです。
このプロジェクトは、C コードやオペレーティングシステムへの実行時依存性を排除することで、組み込みシステム ファームウェアの攻撃対象領域を削減したいという願いから生まれました。
TamaGo フレームワークは以下のコンポーネントで構成されています:
-
GOOS のサポートを
tamagoターゲットに拡張する、修正版の Go ディストリビューション。GOOSPKGによって設定される runtime/goos オーバーレイを通じてベアメタル実行を可能にします。 -
プロセッサ/SoC サポート用の Go パッケージ。
-
ボードサポート用の Go パッケージ。
変更は元の Go コンパイラ、ランタイム、およびターゲットアプリケーションに対して最小限であり(必要なインポートは1つ)、他のアーキテクチャから明確に分離されています。
標準 Go ランタイムに既に含まれている既存のアーキテクチャからのコード再利用に重点が置かれています。詳細は Internals を参照してください。
この変更により、完全な標準ライブラリのサポートが維持されます。
これらの側面は、組み込みシステム上で安全な Go ファームウェア開発を可能にするフレームワークを提供したいという願望に動機付けられています。
現在のリリース
以下のリンクは、対応する Go バージョンに GOOS=tamago サポートを追加する TamaGo 修正版 Go ディストリビューションと、TamaGo ライブラリの最新リリースです:
ドキュメント
主要なドキュメントは プロジェクト wiki にあります。
パッケージの API ドキュメントは pkg.go.dev にあります。
サポートされている AMD64 ターゲット
以下の表は、現在サポートされている x86-64 ターゲット(GOOS=tamago GOARCH=amd64)の概要です。
| CPU | プラットフォーム | CPU パッケージ | プラットフォーム パッケージ |
|---|---|---|---|
| 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 |
サポートされている ARM ターゲット
以下の表は、現在サポートされている ARM SoC とボード(GOOS=tamago GOARCH=arm)の概要です。
| SoC | ボード | SoC パッケージ | ボード パッケージ |
|---|---|---|---|
| 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 |
サポートされている ARM64 ターゲット
以下の表は、現在サポートされている ARM64 SoC とボード(GOOS=tamago GOARCH=arm64)の概要です。
| SoC | ボード | SoC パッケージ | ボード パッケージ |
|---|---|---|---|
| NXP i.MX8M Plus | 8MPLUSLPD4-EVK | imx8mp | imx8mpevk |
| Microchip LAN969x | EVB-LAN9696-24port | lan969x | lan9696evb |
サポートされている RISC-V ターゲット
以下の表は、現在サポートされている RISC-V SoC とボード(GOOS=tamago GOARCH=riscv64)の概要です。
| SoC | ボード | SoC パッケージ | ボード パッケージ |
|---|---|---|---|
| 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 |
ユーザースペースターゲット
GOOS=tamago でコンパイルされたプログラムの実行は、ベアメタルドライバの代わりに OS の監視下で必要な runtime/goos オーバーレイを実装する任意のパッケージをインポートすることで、ユーザースペースでも行うことができます。
ユーザースペースで GOOS=tamago として Go プログラムをコンパイルして実行すると、実行可能ファイルが Go ランタイムを利用して OS リソースに直接アクセスできないため、システムコールの分離という利点が得られます。これにより、次の結果が得られます:
- メモリ内エミュレートディスクによる OS ファイルシステムからの分離
- OS ネットワーキングからの分離(net.SocketFunc 参照)
- カスタムネットワーキング、rng、タイムハンドラの API
以下の表は、現在利用可能なユーザースペースサポートの概要です:
| オペレーティングシステム | GOARCH | ランタイムパッケージ |
|---|---|---|
| Linux | amd64,arm,arm64,riscv64 | runtime/goos¹ |
| Linux | amd64,arm,arm64,riscv64 | linux |
| GoTEE | arm,riscv64 | applet |
¹ 標準ディストリビューションテストと go test -tags user_linux の実行に使用
コンパイル
GOOS=tamago をサポートする Go ディストリビューション
tamago コマンドは、アプリケーションの go.mod の tamago モジュールバージョンに一致する TamaGo ディストリビューションから go コマンドをダウンロード、コンパイル、実行します。
アプリケーションは go.mod に github.com/usbarmory/tamago を追加し、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
アプリケーションのビルド
コンパイル時には、このライブラリをオーバーレイとして有効にして GOOS=tamago をサポートするために、GOOSPKG Go 環境変数を設定する必要があります。
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 - ベアメタル Go UEFI ブートマネージャ
- GoKey - ベアメタル Go スマートカード
- GoTEE - Go Trusted Execution Environment
- ArmoredWitness - クロスエコシステム ウィットネスネットワーク
- armory-drive - USB 暗号化ドライブ
- armory-ums - USB マスストレージ ファームウェア
- armory-boot - USB armory ブートローダ
- tamago-example - TamaGo サンプルアプリケーション
- tamago-sev-example - 機密 VM (AMD SEV-SNP) サンプル
- kotama - 小型 RISC-V ターゲットデモンストレーター
- kanzashi - ベアメタルエージェント
TamaGo を使用した外部ドライバ
- go-net - 汎用ネットワークドライバ
- go-net/imx-usb - i.MX Ethernet over USB ドライバ
- go-net/virtio - VirtIO ネットワークドライバ
- imx-usbserial - i.MX Serial over USB ドライバ
追加リソース
メンテナー
Andrea Barisani
[email protected]
Andrej Rosano
[email protected]
ライセンス
tamago | https://github.com/usbarmory/tamago
著作権所有 (c) TamaGo Authors. 無断複製・転載を禁じます。
このプロジェクトは、LICENSE ファイルに記載されている BSD スタイルライセンスの下で配布されています。
TamaGo ロゴは、Renee French によってデザインされ、Creative Commons 3.0 Attribution ライセンスの下でライセンスされている Go gopher を改変したものです。Go Gopher のベクターイラストは Hugo Arganda によるものです。