
tamago v1.26.5
إطار لتجميع وتنفيذ تطبيقات Go على معالجات عارية (bare metal)، مما يتيح تطوير برامج ثابتة آمنة مع تقليل سطح الهجوم من خلال إزالة اعتماديات نظام التشغيل وC.
TamaGo - bare metal Go
tamago | https://github.com/usbarmory/tamago
حقوق النشر (ج) مؤلفو TamaGo. جميع الحقوق محفوظة.
مقدمة
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:
التوثيق
يمكن العثور على التوثيق الرئيسي على مشروع ويكي.
يمكن العثور على توثيق واجهة برمجة التطبيقات (API) على pkg.go.dev.
أهداف AMD64 المدعومة
يلخص الجدول التالي أهداف x86-64 المدعومة حاليًا
(GOOS=tamago GOARCH=amd64).
| CPU | Platform | CPU package | Platform package |
|---|---|---|---|
| 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 المدعومة
يلخص الجدول التالي معالجات SoC واللوحات ARM المدعومة حاليًا
(GOOS=tamago GOARCH=arm).
| SoC | Board | SoC package | Board package |
|---|---|---|---|
| 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 المدعومة
يلخص الجدول التالي معالجات SoC واللوحات ARM64 المدعومة حاليًا
(GOOS=tamago GOARCH=arm64).
| SoC | Board | SoC package | Board package |
|---|---|---|---|
| NXP i.MX8M Plus | 8MPLUSLPD4-EVK | imx8mp | imx8mpevk |
| Microchip LAN969x | EVB-LAN9696-24port | lan969x | lan9696evb |
أهداف RISC-V المدعومة
يلخص الجدول التالي معالجات SoC واللوحات RISC-V المدعومة حاليًا
(GOOS=tamago GOARCH=riscv64).
| SoC | Board | SoC package | Board package |
|---|---|---|---|
| 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 في مساحة المستخدم عن طريق استيراد أي حزمة تطبق طبقة التراكب المطلوبة runtime/goos مع إشراف نظام التشغيل بدلاً من برامج تشغيل العارية.
يوفر تجميع وتشغيل برامج Go في مساحة المستخدم كـ GOOS=tamago ميزة عزل استدعاءات النظام حيث لا يمكن للبرنامج التنفيذي الاستفادة من وقت تشغيل Go للوصول المباشر إلى موارد نظام التشغيل، وينتج عن ذلك:
- عزل عن نظام ملفات نظام التشغيل، من خلال قرص محاكى في الذاكرة
- عزل عن شبكات نظام التشغيل، انظر net.SocketFunc
- واجهة برمجة تطبيقات (API) للشبكات المخصصة، ومعالجات rng، والوقت
يلخص الجدول التالي دعم مساحة المستخدم المتاح حاليًا:
| Operating System | GOARCH | Runtime packages |
|---|---|---|
| Linux | amd64,arm,arm64,riscv64 | runtime/goos¹ |
| Linux | amd64,arm,arm64,riscv64 | linux |
| GoTEE | arm,riscv64 | applet |
¹ يُستخدم لتشغيل اختبارات التوزيع القياسية و 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 Hypervisory, QEMU و Firecracker KVMs
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 userspace
GOOS=tamago ${TAMAGO} build main.go
راجع ملف README الخاص بحزمة اللوحة المعنية للحصول على معلومات التجميع لكل هدف محدد.
علامات البناء (Build tags)
تسمح علامات البناء التالية للتطبيقات بتجاوز تعريف الحزمة الخاص لطبقة التراكب runtime/goos:
linkramstart: تجاوزramStartlinkramsize: تجاوزramSizelinkprintk: تجاوزprintklinkcpuinit: تجاوزcpuinittiny: تقليل متطلبات تخصيص الكومة
التنفيذ وتصحيح الأخطاء
راجع ملف 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
- 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 - برنامج تشغيل Ethernet عبر USB لـ i.MX
- go-net/virtio - برنامج تشغيل شبكة VirtIO
- imx-usbserial - برنامج تشغيل Serial عبر USB لـ i.MX
موارد إضافية
- واجهة برمجة التطبيقات (API)
- واجهة برمجة تطبيقات وقت التشغيل (Runtime API)
- التوافق
- الداخلية
- الأسئلة الشائعة (FAQ)
- العروض التقديمية: TamaGo, ArmoredWitness
المسؤولون
Andrea Barisani
[email protected]
Andrej Rosano
[email protected]
الترخيص
tamago | https://github.com/usbarmory/tamago
حقوق النشر (ج) مؤلفو TamaGo. جميع الحقوق محفوظة.
يتم توزيع هذا المشروع بموجب ترخيص نمط BSD الموجود في ملف LICENSE.
شعار TamaGo مقتبس من تميمة Go المصممة من قبل Renee French والمرخصة بموجب ترخيص Creative Commons 3.0 Attributions. رسم توضيحي متجه لتميمة Go بواسطة Hugo Arganda.