🚀 init
نظرة عامة
حاوية init هي الـ Root Task — أول كود يعمل في مساحة المستخدم (User-space) بعد إقلاع نواة seL4. النواة تُعطيها كل الصلاحيات الابتدائية (Capabilities) والذاكرة الخام (Untyped Memory) عبر هيكل seL4_BootInfo، ثم تتقاعد عن التدخل المباشر.
مسؤوليات init تنقسم لمرحلتين:
- مرحلة الإقلاع (Bootstrap): تُنشئ وتُشغّل الحاويات التسع بالترتيب الصحيح، وتُوزّع عليها المفاتيح (Endpoints) التي تحتاجها للتواصل. ترتيب الإقلاع:
Crypto_Vault → Tor → Disk_Vault → FS_Vault → Auth_Vault → Bus_Vault → Desktop → Input_Vault → Programs. - مرحلة التشغيل (Runtime): تتحوّل إلى Program Manager — تستمع على
launch_epلطلبات تشغيل التطبيقات من حاوية Desktop، وتُنشئ مساحة عزل جديدة لكل تطبيق.
كل حاوية تُحمَّل كـ ELF ثنائي مدمج مباشرة في init عبر include_bytes! — صفر تبعيات على نظام ملفات وقت الإقلاع.
الملفات البرمجية
src/main.rs
النقطة الرئيسية للبرنامج. يُعرّف كل حاوية كـ static ثابت من نوع AlignedElf ويُدمج ملفها التنفيذي مباشرة في الذاكرة عبر include_bytes! (محاذاة 4096 بايت). ترتيب الإقلاع في rust_main:
src/program_manager.rs
يُدير عملية تحميل وتشغيل التطبيقات الديناميكية (SVP Packages) من ملف manifest.bin المدمج في PROGRAM_REGISTRY. الدوال الرئيسية:
src/system.rs
يُهيئ الأنظمة الثلاثة الأساسية ويختبرها مباشرة بعد الإقلاع:
src/slot_alloc.rs
مُخصِّص فتحات CNode (CNode Slot Allocator) — الأبسط والأهم في النظام.
src/untyped_alloc/mod.rs
مُخصِّص الذاكرة الخام (Untyped Memory Allocator) — الطبقة الوسيطة بين BootInfo ونواة seL4.
src/loader/mod.rs
المُنسِّق الرئيسي لتحميل ملفات ELF وتشغيل الحاويات. الهيكل ContainerLoader يحمل:
src/loader/paging.rs
بناء هياكل الـ Paging لـ x86_64 (4 مستويات: PML4→PDPT→PD→PT).
src/loader/elf_load.rs
تنفيذ تحميل مقاطع ELF عبر تقنية Scratch Mapping:
src/loader/tcb_setup.rs
المرحلة الأخيرة من تهيئة الحاوية: ربط الذاكرة المشتركة وتشغيل الـ Thread.
src/vault_setup.rs
setup_crypto_vault() — نموذج قياسي لكيفية تشغيل أي حاوية من init. الخطوات الست:
src/auth_setup.rs
setup_auth_vault() — يبني حاوية Auth بنفس الخطوات القياسية، مع خطوتين إضافيتين تُميّزانها:
src/bus_setup.rs
setup_bus_vault() — الأكثر تعقيداً في توزيع الـ Capabilities. يتلقى مؤشرَي fs_ep و auth_ep من init ويُوزّعها داخل CNode الـ Bus:
src/fs_setup.rs
setup_fs_vault() — يُعيد ثلاث قيم: (fs_ep, vspace_cptr, success). إعادة vspace_cptr ضرورية لأن main.rs يحتاجها لاحقاً لربط صفحة الذاكرة المشتركة في VSpace الـ FS.
src/disk_setup.rs
setup_disk_vault() — يُعيد (disk_ep, vspace_cptr, success). يحتوي على الخطوة الأكثر تعقيداً في الإعداد: تفويض صلاحية IOPort.
src/network_setup.rs
setup_tor_router() — يُشغّل حاوية Tor بنفس النمط القياسي مع Scratch address: 0xA00000. ملاحظة: لا توجد Capabilities إضافية تُمرَّر لـ Tor حالياً (الحاوية تُهيئ شبكتها بنفسها عبر smoltcp). نقطة التطوير المستقبلية: تمرير VirtIO-Net endpoint لتفعيل الشبكة الحقيقية.
src/desktop_setup/mod.rs
setup_desktop() — أكثر setup_*() تعقيداً. يُعيد ثلاثة قيم: (init_desktop_ep, launch_ep_cap, success).
