NoWayOS
AR
GitHub
القائمةإغلاق

ابدأ من هنا

نظامك الأول في QEMU

أقلِع seL4 في QEMU مع نطاق حماية واحد بلغة Rust، واقرأ الملفات الثلاثة التي تعرّف النظام، وشاهد seL4 يوقف جزءًا يتجاوز حدوده، وتنقّل بالنقر في واجهة المستخدم.

النظام في NoWayOS مجموعة من نطاقات الحماية، أي أجزاء الجهاز، تُقلع معًا على seL4. يُقلع كل نظام في QEMU أولًا، داخل حاوية التطوير، ويتحقق من مخرجاته. تُقلع هذه الصفحة أصغرها، ثم بضعة أنظمة تُظهر المزيد.

أقلِع hello

make qemu-test SYSTEM=hello

يبني هذا النظام hello، ويفحص أذوناته، ويُقلع seL4 بلا شاشة في QEMU، ويراقب ما يطبعه. وينجح حين يظهر كل سطر يجب أن يطبعه النظام، بالترتيب، دون أن يظهر شيء محظور.

ولتُقلعه بنفسك وتشاهده، شغّل make qemu SYSTEM=hello. واخرج من QEMU بالضغط على Ctrl-A، ثم x.

الملفات الثلاثة التي تعرّف النظام

كل نظام عبارة عن ثلاثة ملفات في systems/، بجانب شيفرة Rust في pds/.

hello.system هو وصف نظام Microkit: كل نطاق حماية ومنطقة ذاكرة وقناة ومقاطعة في النظام. وللنظام hello نطاق حماية واحد ولا شيء غيره:

<system>
 <protection_domain name="hello" priority="1" stack_size="0x10000">
 <program_image path="nowayos-hello.elf" />
 </protection_domain>
</system>

hello.grants يُدرج كل ما يمنحه النظام، حقيقة واحدة في كل سطر. ويفشل البناء إذا منح الوصف شيئًا غير مُدرج هنا، أو أُدرج هنا شيء لا يمنحه الوصف، فيبقى أي تغيير على ما يُسمح للنظام بفعله ظاهرًا دائمًا في المراجعة:

system demo
role hello app

pd hello priority=1 budget=1000 period=1000

hello.expect يُدرج الأسطر التي يجب أن يطبعها النظام، بالترتيب، ثم، بعد علامة !، نصًّا يُفشل الاختبار فورًا أينما ظهر:

NOWAYOS: rust pd starting
NOWAYOS: hello from rust

!MON|ERROR
!seL4(CPU
!panicked

وملف التوقعات نفسه يفحص النظام على Raspberry Pi 5، من السجل التسلسلي للوحة.

نطاق الحماية نفسه

الملف pds/hello/src/main.rs هو البرنامج كله. ويتبع الشكل الأدنى لمثال Microkit في rust-sel4: تعمل init مرة واحدة عند البدء، وكان المعالج سيتلقى الإشعارات لو منحه النظام أي قنوات.

#![no_std]
#![no_main]

use sel4_microkit::{Handler, Infallible, debug_println, protection_domain};

#[protection_domain]
fn init() -> HelloPd {
 debug_println!("NOWAYOS: rust pd starting");
 debug_println!("NOWAYOS: hello from rust");
 HelloPd
}

struct HelloPd;

impl Handler for HelloPd {
 type Error = Infallible;
}

لا كومة (أي محاولة لحجز الذاكرة ستفشل عند الربط)، ولا unsafe، ولا جهاز. والطباعة لا تعمل إلا لأن هذه نسخة تصحيح: فنواة الإصدار ليس فيها وحدة تحكم للتصحيح.

شاهد seL4 يوقف جزءًا

make qemu-test SYSTEM=isolation-test

يحاول كل من نطاقَي الحماية المِجسّين فعل شيء لم يُمنح له: أحدهما يقرأ ذاكرة غير مُعيَّنة له، والآخر يكتب إلى صفحة لا يحق له إلا قراءتها. فيوقف seL4 كلًّا منهما بعطل، ويواصل نطاق ثالث متفرّج العمل دون أن يُمسّ. ويقول السطر الأخير من الاختبار ذلك:

NOWAYOS: isolation-test: 2 of 2 forbidden accesses faulted and were contained; bystander still running

أنظمة أخرى لتجربتها

النظام ما يُظهره
ipc-demo نطاقا حماية يتبادلان سجلات محددة النوع عبر حلقة مشتركة؛ ويُرفض السجل المشوّه
timer-demo يستجيب نطاق حماية المؤقت لعميلين ويسلّم مهلتيهما بترتيب المواعيد النهائية
supervisor-test يتلقى المشرف عطلًا ويعيد تعيين اللوحة، فيجد الإقلاع التالي ذاكرته جديدة
ui-demo الجلسة المُعدّة مسبقًا لواجهة المستخدم، مع فحص قيمة التجزئة لكل إطار

شغّل أيًّا منها بالأمر make qemu-test SYSTEM=NAME، أو كل الأنظمة بالأمر make qemu-test-all.

تنقّل بالنقر في واجهة المستخدم

make qemu SYSTEM=ui-interactive VNC=1

تُنشر شاشة QEMU عبر VNC على localhost:5900 في جهازك، مع كلمة مرور تُطبع لذلك التشغيل وحده. على macOS، افتح vnc://localhost:5900 (في Finder: Go، ثم Connect to Server) وتنقّل بالنقر بين شاشات العرض التوضيحي.

ما يتركه البناء بجانب كل صورة

في build/BOARD/SYSTEM/ (وهنا build/qemu_virt_aarch64/hello/ وهكذا)، بجانب loader.img:

  • sel4-config.txt: إعداد seL4 للصورة، وما إذا كان يقع ضمن براهين seL4. ونسخة التصحيح تقول صراحةً إنها لا تقع ضمنها. انظر الأمان.
  • sbom.cdx.json: قائمة مكونات برمجيات بصيغة CycloneDX للصورة: النواة، والمُحمِّل، وكل نطاق حماية والحزم التي فيه، مع قيمة التجزئة لكل منها.
  • ملفات تراخيص ما تحويه الصورة، مثل تراخيص الخط والأيقونات.