معمارية التخاطب مع العتاد (Hardware Architecture)
Capability (رقم 1) يسمح لها بإرسال أوامر عبر Assembly Syscall لمنافذ 0x1F0. هذه هي قمة الأمان (Zero-Trust) على مستوى العتاد! مخرجات الحاوية الحية
كيفية التخاطب مع العتاد في Rust
نظرة على دالة inb التي تستخدم Inline Assembly لاستدعاء النظام وطلب تمرير البيانات من الـ I/O Port.
fn inb(port: u16) -> u8 {
let msg = seL4_MessageInfo::new(X86_IOPORT_IN8, 0, 1, 1);
unsafe {
let mut out_mr0: seL4_Word = 0;
core::arch::asm!(
"xchg r12, rbx",
"mov rbx, rsp",
"syscall",
"mov rsp, rbx",
"xchg r12, rbx",
in("rdx") -1isize,
inout("rdi") IO_PORT_CAP => _,
inout("rsi") msg.words[0] => _,
inout("r10") port as usize => out_mr0,
options(nostack)
);
out_mr0 as u8
}
}أوامر الاستدعاء (Message Tags)
الوظائف والمهام الأساسية
تعريف قرص صلب مباشر (ATA PIO Driver)
تتخاطب هذه الحاوية مباشرة مع العتاد (Hardware) عبر بروتوكول ATA PIO (Programmed I/O)، مستخدمة نظام LBA28 للقراءة والكتابة.
نداءات I/O Port مباشرة (seL4 Syscalls)
بدلاً من استخدام تعريفات نواة (Kernel Drivers)، تستخدم الحاوية نداءات النظام الخاصة بمعمارية x86 مثل (inb, outb, inw, outw) عبر تمرير IO_PORT_CAP للنواة.
صفر تخصيص ذاكرة (Zero Allocations)
تماماً مثل حاوية FS_Vault، بُنيت هذه الحاوية باستخدام no_alloc (بدون heap) وتعمل بكفاءة تامة باستخدام الذاكرة الثابتة (Stack) والذاكرة المشتركة فقط.
تزامن البيانات عبر الذاكرة المشتركة (Shared Memory)
يتم نقل بيانات القطاعات (512 بايت) عبر الذاكرة المشتركة في العنوان 0x600000، مما يمنع الحاجة لنقل البيانات الكبيرة عبر رسائل IPC المحدودة.
عزل العتاد (Hardware Isolation)
نواة seL4 لا تملك تعريفاً للقرص! هي فقط تمنح حاوية Disk_Vault صلاحية (Capability) للوصول لمنافذ I/O محددة (مثل 0x1F0 إلى 0x1F7). هذا يحمي النواة من أي خطأ في تعريف القرص.
الانتظار النشط (Polling/Wait DRQ)
لضمان نقل البيانات بدقة، تستخدم الحاوية استراتيجية Polling لمراقبة حالة البت BSY (Busy) والبت DRQ (Data Request) قبل كل عملية قراءة أو كتابة.
توثيق الملفات البرمجية
القلب النابض للتعامل مع القرص. يحتوي على دوال (inb, outb)، ومنطق الانتظار (ata_wait_ready)، وعمليات (read_sector, write_sector)، بالإضافة لحلقة IPC التي تخدم الطلبات.
استخدام asm!("syscall") لنداءات IO Port.استخدام Capability رقم 1 للتحدث مع العتاد.0x600000 (بحجم 4096 بايت)ملف إعداد حزمة disk. بسيط جداً ولا يعتمد سوى على واجهات seL4 الأساسية ومكتبة IPC. (لا يوجد allocator).
sel4-sys و ipc-sync فقط.opt-level = 3 | lto = true | panic = "abort"المكتبات والاعتمادات (Dependencies)
sel4-sys
يوفر هياكل البيانات (seL4_MessageInfo) ودوال الاستدعاء (seL4_Call) بالإضافة للأرقام السحرية لنداءات x86 IO (مثل 48, 49, 51, 52).
ipc-sync
تجريد عمليات الرسائل وبناء حلقة الخادم (Receiver.serve) وأنواع الرسائل (MessageTag).
