Skip to content
HEROBAN-SEL4 HARDWARE LAYER
💽Bare-Metal User Space Driver
🖲️

حاوية disk

التعامل المباشر مع القرص الصلب. لا تعتمد على النواة لإدارة العتاد، بل تكتب وتقرأ قطاعات القرص يدوياً عبر بروتوكول ATA PIO باستخدام منافذ الإدخال والإخراج المباشرة.

💾LBA28Addressing
🔄512 BytesSector Size
x86 IOPortSyscalls
🧩No Alloc0 Heap
🛠️

معمارية التخاطب مع العتاد (Hardware Architecture)

💡
نواة صامتة (Microkernel Philosophy): النواة (seL4) لا تفهم معنى "قرص صلب" ولا تعرف كيف تتواصل معه. كل ما تفعله النواة هو منح الحاوية Capability (رقم 1) يسمح لها بإرسال أوامر عبر Assembly Syscall لمنافذ 0x1F0. هذه هي قمة الأمان (Zero-Trust) على مستوى العتاد!
📁FS VaultFilesystem
1IPC Read/Write
IPC Ok4
💽Disk VaultATA PIO Driver
2inb() / outb()
🖥️seL4 KernelSyscall Auth
Shared Memory (0x600000)512 Bytes Data Transfer
Physical Hard DrivePort 0x1F0 (Data) - 0x1F7 (Cmd)
⇣ Data ⇣
⇣ I/O Ports ⇣
💻

مخرجات الحاوية الحية

root@heroban:~/disk_vault_tty
bash
[Disk_Vault] =============================================
[Disk_Vault] seL4-Vault Block Storage Container v0.1
[Disk_Vault] =============================================
[Disk_Vault] Initializing ATA PIO Device...
[Disk_Vault] Drive Found. ATA PIO Ready.
[Disk_Vault] Ready. Entering IPC event loop...
----------------------------------------------------------
> [Disk_Vault] Received ReadSector (LBA: 12)
> [Disk_Vault] Issuing ATA command 0x20 to 0x1F7...
> [Disk_Vault] Data ready. Reading 256 words (512 bytes).
> [Disk_Vault] Sector copied to Shared Memory. Sending Ok.
_
⚙️

كيفية التخاطب مع العتاد في Rust

نظرة على دالة inb التي تستخدم Inline Assembly لاستدعاء النظام وطلب تمرير البيانات من الـ I/O Port.

🦀 Rust & Assemblycontainers/disk/src/main.rs
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)

ReadSector (mr[1] = LBA)
يقرأ قطاع (512 بايت) من القرص الصلب ويضعه في الذاكرة المشتركة (Shared Memory) عند العنوان 0x600000.
WriteSector (mr[1] = LBA)
ينسخ البيانات من الذاكرة المشتركة (Shared Memory) عند 0x600000 ويكتبها في القرص الصلب.
Ping
يرد بـ Pong لفحص حالة الحاوية (Health Check).
_ (Unknown)
يلتقط الأوامر المجهولة ويرد بـ Err.
⚙️

الوظائف والمهام الأساسية

# 01
💽

تعريف قرص صلب مباشر (ATA PIO Driver)

تتخاطب هذه الحاوية مباشرة مع العتاد (Hardware) عبر بروتوكول ATA PIO (Programmed I/O)، مستخدمة نظام LBA28 للقراءة والكتابة.

# 02
🔌

نداءات I/O Port مباشرة (seL4 Syscalls)

بدلاً من استخدام تعريفات نواة (Kernel Drivers)، تستخدم الحاوية نداءات النظام الخاصة بمعمارية x86 مثل (inb, outb, inw, outw) عبر تمرير IO_PORT_CAP للنواة.

# 03
🧠

صفر تخصيص ذاكرة (Zero Allocations)

تماماً مثل حاوية FS_Vault، بُنيت هذه الحاوية باستخدام no_alloc (بدون heap) وتعمل بكفاءة تامة باستخدام الذاكرة الثابتة (Stack) والذاكرة المشتركة فقط.

# 04

تزامن البيانات عبر الذاكرة المشتركة (Shared Memory)

يتم نقل بيانات القطاعات (512 بايت) عبر الذاكرة المشتركة في العنوان 0x600000، مما يمنع الحاجة لنقل البيانات الكبيرة عبر رسائل IPC المحدودة.

# 05
🔒

عزل العتاد (Hardware Isolation)

نواة seL4 لا تملك تعريفاً للقرص! هي فقط تمنح حاوية Disk_Vault صلاحية (Capability) للوصول لمنافذ I/O محددة (مثل 0x1F0 إلى 0x1F7). هذا يحمي النواة من أي خطأ في تعريف القرص.

# 06
⏱️

الانتظار النشط (Polling/Wait DRQ)

لضمان نقل البيانات بدقة، تستخدم الحاوية استراتيجية Polling لمراقبة حالة البت BSY (Busy) والبت DRQ (Data Request) قبل كل عملية قراءة أو كتابة.

📁

توثيق الملفات البرمجية

🦀

src/main.rs

Hardware Driver
containers/disk/src/main.rs
~200 سطر

القلب النابض للتعامل مع القرص. يحتوي على دوال (inb, outb)، ومنطق الانتظار (ata_wait_ready)، وعمليات (read_sector, write_sector)، بالإضافة لحلقة IPC التي تخدم الطلبات.

🔍 أهم العناصر
Inline Assemblyاستخدام asm!("syscall") لنداءات IO Port.
IO_PORT_CAPاستخدام Capability رقم 1 للتحدث مع العتاد.
Shared Memory0x600000 (بحجم 4096 بايت)
📦

Cargo.toml

Package Config
containers/disk/Cargo.toml
~17 سطر

ملف إعداد حزمة disk. بسيط جداً ولا يعتمد سوى على واجهات seL4 الأساسية ومكتبة IPC. (لا يوجد allocator).

🔍 أهم العناصر
الاعتماديات (Dependencies)sel4-sys و ipc-sync فقط.
Profile Releaseopt-level = 3 | lto = true | panic = "abort"
📚

المكتبات والاعتمادات (Dependencies)

# 01
مكتبتنا

sel4-sys

libs/sel4-sys

يوفر هياكل البيانات (seL4_MessageInfo) ودوال الاستدعاء (seL4_Call) بالإضافة للأرقام السحرية لنداءات x86 IO (مثل 48, 49, 51, 52).

# 02
مكتبتنا

ipc-sync

libs/ipc-sync

تجريد عمليات الرسائل وبناء حلقة الخادم (Receiver.serve) وأنواع الرسائل (MessageTag).

جميع الحقوق محفوظة © 2026 Qtoom