
إطار لتجميع وتنفيذ تطبيقات Go على معالجات عارية (bare metal)، مما يتيح تطوير برامج ثابتة آمنة مع تقليل سطح الهجوم من خلال إزالة اعتماديات نظام التشغيل وC.
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.
يلخص الجدول التالي أهداف x86-64 المدعومة حاليًا
(GOOS=tamago GOARCH=amd64).
يلخص الجدول التالي معالجات SoC واللوحات ARM المدعومة حاليًا
(GOOS=tamago GOARCH=arm).
يلخص الجدول التالي معالجات SoC واللوحات ARM64 المدعومة حاليًا
(GOOS=tamago GOARCH=arm64).
يلخص الجدول التالي معالجات SoC واللوحات RISC-V المدعومة حاليًا
(GOOS=tamago GOARCH=riscv64).
يمكن أيضًا تنفيذ البرامج المجمعة باستخدام GOOS=tamago في مساحة المستخدم عن طريق استيراد أي حزمة تطبق طبقة التراكب المطلوبة runtime/goos مع إشراف نظام التشغيل بدلاً من برامج تشغيل العارية.
يوفر تجميع وتشغيل برامج Go في مساحة المستخدم كـ GOOS=tamago ميزة عزل استدعاءات النظام حيث لا يمكن للبرنامج التنفيذي الاستفادة من وقت تشغيل Go للوصول المباشر إلى موارد نظام التشغيل، وينتج عن ذلك:
يلخص الجدول التالي دعم مساحة المستخدم المتاح حاليًا:
¹ يُستخدم لتشغيل اختبارات التوزيع القياسية و go test -tags user_linux
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 الخاص بحزمة اللوحة المعنية للحصول على معلومات التجميع لكل هدف محدد.
تسمح علامات البناء التالية للتطبيقات بتجاوز تعريف الحزمة الخاص لطبقة التراكب runtime/goos:
linkramstart: تجاوز ramStartlinkramsize: تجاوز ramSizelinkprintk: تجاوز printklinkcpuinit: تجاوز cpuinittiny: تقليل متطلبات تخصيص الكومةراجع ملف README الخاص بحزمة اللوحة المعنية للحصول على معلومات التنفيذ وتصحيح الأخطاء لكل هدف محدد (حقيقي أو محاكي).
يوفر التطبيق النموذجي استخدامًا نموذجيًا لبرنامج التشغيل وتعليمات للتنفيذ الأصلي وكذلك المحاكي.
يمكن إطلاق تشغيل محاكي لـ التطبيق النموذجي على النحو التالي:
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
حقوق النشر (ج) مؤلفو TamaGo. جميع الحقوق محفوظة.
يتم توزيع هذا المشروع بموجب ترخيص نمط BSD الموجود في ملف LICENSE.
شعار TamaGo مقتبس من تميمة Go المصممة من قبل Renee French والمرخصة بموجب ترخيص Creative Commons 3.0 Attributions. رسم توضيحي متجه لتميمة Go بواسطة Hugo Arganda.
| 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 |
| 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 |
| SoC | Board | SoC package | Board package |
|---|
| NXP i.MX8M Plus | 8MPLUSLPD4-EVK | imx8mp | imx8mpevk |
| Microchip LAN969x | EVB-LAN9696-24port | lan969x | lan9696evb |
| 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 |
| Operating System | GOARCH | Runtime packages |
|---|
| Linux | amd64,arm,arm64,riscv64 | runtime/goos¹ |
| Linux | amd64,arm,arm64,riscv64 | linux |
| GoTEE | arm,riscv64 | applet |