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

الفهم

كيف يترابط النظام

نطاقات الحماية والصلاحيات والقنوات؛ ووصف النظام وملف أذوناته؛ والرسائل محددة النوع؛ والإدخال؛ والأعطال والمشرف وحالة الأمان عند العطل؛ وبناء أنظمتك الخاصة بجانب NoWayOS.

كل جهاز NoWayOS هو نظام: مجموعة ثابتة من الأجزاء، مُعلنة قبل بنائه، كلٌّ منها معزول عن الآخر بواسطة seL4. ولا يُضاف شيء وقت التشغيل. تشرح هذه الصفحة القطع وكيف تتصل ببعضها.

نطاقات الحماية

نطاق الحماية جزء واحد من النظام: برنامج له ذاكرته الخاصة، ولا يحمل إلا الصلاحيات الممنوحة له. والصلاحية في seL4 رمز لا يمكن تزويره يسمّي كائنًا واحدًا في النواة والحقوق الممنوحة عليه، مثل بطاقة دخول لباب واحد. ولا يستطيع نطاق الحماية أن يمسّ شيئًا لا تسمّيه صلاحياته، و seL4 يفرض ذلك.

للنظام النموذجي نطاق حماية لكل وظيفة: برنامج تشغيل للعرض، ومسار الإدخال، ومكدس الشبكة، وواجهة المستخدم، والتطبيق، ومؤقت، ومشرف، ومؤقت مراقبة. وكلٌّ منها برنامج Rust صغير، no_std، لا يحجز أي ذاكرة بعد بدء تشغيله.

وصف النظام

يُعلن وصف نظام Microkit (systems/NAME.system، وهو ملف XML) النظامَ كله: كل نطاق حماية مع أولويته وميزانيته ومكدسه؛ وكل منطقة ذاكرة ومن يعيّنها في ذاكرته؛ وكل قناة؛ وكل مقاطعة.

  • تسمّي الأوصاف الأجهزة، ولا تذكر العناوين أبدًا: phys_addr="@NAME". وتأتي العناوين من ملف اللوحة في platforms/، كلٌّ منها مع مصدره، فيُبنى الوصف نفسه لـ QEMU و Raspberry Pi 5.
  • القنوات تربط بين نطاقَي حماية، للإشعارات (إشارات بلا بيانات، ومنها المقاطعات) ولاستدعاءات الإجراءات المحمية (استدعاءات متزامنة إلى جزء ذي أولوية أعلى).

الوصف هو التصميم الأمني للنظام، ولذلك يُراجَع أي تغيير عليه بوصفه تغييرًا أمنيًا.

ملف الأذونات

بجانب كل وصف، يُدرج systems/NAME.grants كل ما يمنحه النظام، حقيقة واحدة في كل سطر: الأولويات، والميزانيات، والذاكرة، والأجهزة، والمقاطعات، والقنوات. ويفشل البناء إذا اختلف الاثنان في أي اتجاه.

ولكل نطاق حماية أيضًا دور (ui أو input أو broker أو display أو driver أو network أو security أو storage أو update أو app أو supervisor أو watchdog أو clock أو test)، ويرفض البناء أي إذن لا يجوز أبدًا أن يحمله ذلك الدور. فلا يمكن أن تُسلَّم واجهة المستخدم جهاز شبكة عن طريق الخطأ، ولا أن تتسلل أداة اختبار إلى منتج.

الرسائل محددة النوع

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

  • انسخ، ثم تحقق. ينسخ المتلقي كل سجل خارج الذاكرة المشتركة قبل التحقق من صحته، فلا يستطيع المرسل تغييره بين الفحص والاستخدام (الخلل المعروف بالجلب المزدوج).
  • المفككات لا يمكن أن تنهار. يُعيد كل مفكك خطأً محدد النوع لأي مدخل مشوّه، وله براهين Kani محدودة وهدف لاختبار التشويش.
  • لكل طرف منظوره الخاص. يرى المنتج والمستهلك الحلقة عبر منظورين منفصلين للذاكرة، وتستخدم المؤشرات المشتركة ترتيب الاكتساب والتحرير (acquire/release).

الإدخال

ترى التطبيقات أحداث إدخال قياسية، من مفاتيح وحركات مؤشر ولمسات، مفحوصة مقابل الشاشة ومحدودة المعدل. ولا ترى أبدًا USB أو أي بروتوكول أجهزة آخر؛ فمسار الإدخال يحللها في نطاقات حماية خاصة به، معاملًا كل بايت على أنه عدائي.

الأعطال والمشرف وحالة الأمان عند العطل

حين يفعل نطاق حماية شيئًا لا يسمح به seL4، أو ينهار، يوقفه seL4 ويرفع عطلًا إلى النطاق الأب.

  • المشرف هو الأب للأجزاء الأخرى. يتلقى كل عطل، ويبلغ عنه، ويعيد تعيين اللوحة ليبدأ النظام من جديد بداية نظيفة. وهو مبني ومُختبر في أنظمة اختبار QEMU.
  • حالة الأمان عند العطل هي ما يدخله الجهاز حين تتوالى الأعطال: افتراضيًا، عند إعادة التشغيل الرابعة منذ آخر إقلاع بارد، أو عند العطل الثاني في جزء حساس أمنيًا مثل التخزين أو التحديثات. ولا يبقى قيد التشغيل إلا المشرف ومؤقت المراقبة، والعرض حيثما أمكن، ولا يعيد الجهاز إلا إقلاع بارد، من حالة انقطاع الطاقة.
  • نطاق حماية مؤقت المراقبة لا يغذّي مؤقت المراقبة في العتاد إلا ما دام كل جزء آخر يستجيب لنبضاته. وإذا توقف أحدها عن الاستجابة، يعيد العتاد تعيين اللوحة.

الذاكرة والوقت

  • الذاكرة ثابتة منذ بناء الصورة. لا تحجز شيفرة الجهاز أي ذاكرة: لكل مخزن مؤقت وطابور حجم محدد، من nowayos-bounded. والاستثناء الوحيد، عميل TLS، يعمل في ساحة ذاكرة ثابتة خاصة به.
  • نوعان من الوقت لا يختلطان أبدًا. الوقت الرتيب يُعدّ من الإقلاع ولا يعود إلى الوراء أبدًا؛ وكل مهلة تستخدمه. ووقت ساعة الحائط، أي التاريخ والوقت من اليوم، يأتي من مصدر مُصادَق. وهما نوعان مختلفان في Rust، فلا يمكن تمرير أحدهما حيث يُقصد الآخر.

بناء أنظمتك الخاصة

تعيش أنظمة منتجك ونطاقات حمايته في مستودع خاص بها، بجانب nowayos، لا داخله أبدًا. ويضبط ملف Makefile في ذلك المستودع SYSTEM_REPO := $(CURDIR) ويُضمّن أجزاء make الخاصة بـ NoWayOS:

SYSTEM_REPO := $(CURDIR)
include ../nowayos/tools/make/container.mk
include ../nowayos/tools/make/system.mk

ثم تعمل make image و make qemu-test و make qemu-test-all والفحوص على systems/ و pds/ في ذلك المستودع، مع حاوية تطوير NoWayOS وملفات لوحاته وقواعد أذوناته وفحوصه. والمتغيرات موثّقة في أعلى tools/make/system.mk. ويُبنى Showcase بهذه الطريقة تمامًا.