
tamago v1.26.6
베어 메탈 프로세서에서 Go 애플리케이션을 컴파일 및 실행하기 위한 프레임워크로, OS 및 C 종속성을 제거하여 공격 표면을 줄인 안전한 펌웨어 개발을 가능하게 합니다.
TamaGo - 베어 메탈 Go
tamago | https://github.com/usbarmory/tamago
Copyright (c) The TamaGo Authors. All Rights Reserved.
소개
TamaGo는 AMD64, ARM, ARM64, RISCV64 베어 메탈 프로세서에서 제약 없는 Go 애플리케이션의 컴파일 및 실행을 가능하게 하는 프레임워크입니다.
이 프로젝트는 C 코드 및 운영체제에 대한 런타임 의존성을 제거하여 임베디드 시스템 펌웨어의 공격 표면을 줄이려는 바람에서 시작되었습니다.
TamaGo 프레임워크는 다음 구성 요소로 이루어져 있습니다:
-
수정된 Go 배포판 -
GOOS지원을tamago타겟으로 확장하며,GOOSPKG에 의해 설정된 runtime/goos 오버레이를 통해 베어 메탈 실행을 가능하게 합니다. -
프로세서/SoC 지원용 Go 패키지.
-
보드 지원용 Go 패키지.
수정 사항은 원래 Go 컴파일러, 런타임 및 타겟 애플리케이션(필요한 임포트 하나)에 대해 최소화되어 있으며, 다른 아키텍처와 명확히 분리되어 있습니다.
기존 아키텍처(표준 Go 런타임에 이미 포함된)에서 코드를 재사용하는 데 중점을 두고 있습니다. 자세한 내용은 내부 동작을 참조하세요.
수정 사항은 완전한 표준 라이브러리 지원을 유지합니다.
이러한 측면은 임베디드 시스템에서 안전한 Go 펌웨어 개발을 가능하게 하는 프레임워크를 제공하려는 의도에서 비롯되었습니다.
현재 릴리스
다음 링크는 TamaGo 수정 Go 배포판(해당 Go 버전에 GOOS=tamago 지원을 추가) 및 TamaGo 라이브러리의 최신 릴리스입니다:
문서
주 문서는 프로젝트 위키에서 확인할 수 있습니다.
패키지 API 문서는 pkg.go.dev에서 확인할 수 있습니다.
지원되는 AMD64 타겟
다음 표는 현재 지원되는 x86-64 타겟(GOOS=tamago GOARCH=amd64)을 요약합니다.
| CPU | 플랫폼 | CPU 패키지 | 플랫폼 패키지 |
|---|---|---|---|
| AMD/Intel 64비트 | Cloud Hypervisor | amd64 | cloud_hypervisor/vm |
| AMD/Intel 64비트 | Firecracker microvm | amd64 | firecracker/microvm |
| AMD/Intel 64비트 | QEMU microvm | amd64 | qemu/microvm |
| AMD/Intel 64비트 | UEFI | amd64 | uefi/x64 |
| AMD/Intel 64비트 | 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
애플리케이션 빌드
컴파일 시, GOOSPKG Go 환경 변수를 설정하여 이 라이브러리를 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 - 베어 메탈 Go UEFI 부트 매니저
- GoKey - 베어 메탈 Go 스마트카드
- GoTEE - Go 신뢰 실행 환경
- 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 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.
이 프로젝트는 LICENSE 파일에 명시된 BSD 스타일 라이선스로 배포됩니다.
TamaGo 로고는 Renee French가 디자인하고 Creative Commons 3.0 저작자 표시 라이선스로 제공된 Go 고퍼를 각색한 것입니다. Go 고퍼 벡터 일러스트레이션은 Hugo Arganda가 제작했습니다.