
نظام التشغيل QRV
QRV هو اقتباس وإعادة تنفيذ من الصفر لنظام التشغيل QNX Neutrino 6.4 للأجهزة الحديثة ذات 64 بت، مع RISC-V (rv64g) كمعمارية رئيسية وx86-64 كهدف ثانوي. بدأ المشروع في ليلة عيد الميلاد 2020. يتجنب اسم QRV عمدًا أي ارتباط بالعلامة التجارية QNX.
QRV هو نظام تشغيل كامل، وليس مجرد نواة. النواة الصغرية هي قلبه — لكن الجزء الأكبر من العمل ذهب إلى كل ما يحيط بها. الأبرز هو taskman، مدير العمليات/الذاكرة/المسارات في وضع المستخدم (procnto الخاص بـ QNX)، والذي تمت إعادة صياغته بعمق ورفعه خارج النواة إلى مساحة المستخدم؛ إلى جانب ذلك، تم نقل مكتبة C، وبرامج تشغيل الأجهزة، ونظام الملفات، والمُحمل الديناميكي، وخوادم النظام، وجعلها نظيفة 64 بت، وفي العديد من الأماكن تمت إعادة كتابتها بشكل كبير. النواة الصغرية صغيرة حسب التصميم؛ نظام التشغيل حولها هو حيث يقع معظم QRV.
هذه ليست شوكة تقوم فقط بتجميع كود قديم على مترجم جديد. إنها نقل دقيق، وحدة بوحدة، إلى نموذج LP64 حقيقي، مع تفكيك الحدود الملكية لـ procnto، واستبدال آلية IFS/startup، ومع إزالة Big Kernel Lock بالكامل — اعتبارًا من الإصدارات الأخيرة — ونقل مدير العمليات/الذاكرة/المسارات خارج النواة إلى خادم في وضع المستخدم.
يصف ملف README هذا الإصدار QRV v0.43.
المدونة التطويرية، مع القصة الكاملة للنقل، موجودة على https://r-tty.blogspot.com. سردية بطول كتاب، The QRV Porting Story، موجودة في شجرة المصدر تحت doc/tex/PortingStory/.
تم تطوير QRV بالتعاون الوثيق مع Claude Code، أداة الترميز النشطة (agentic coding tool) من Anthropic — الكثير من النقل، وتصحيح أخطاء SMP، والتوثيق (بما في ذلك ملف README هذا) تم كجهد برمجة زوجي بين الإنسان والذكاء الاصطناعي، بالعمل جنبًا إلى جنب مع المؤلف.
obtain_proj.sh وشجرة os/TM_PRIVdevb-nvme و fs-qrvQNX هو نظام تشغيل زمن حقيقي نواة صغرية (microkernel) فكرته الأساسية هي تمرير الرسائل المتزامن. في QNX، النواة نفسها صغيرة جدًا — فهي تعرف كيفية جدولة الخيوط، تمرير الرسائل، تسليم الإشارات، التعامل مع المؤقتات والمقاطعات، وقليل جدًا غير ذلك. كل شيء كان نظام التشغيل المتجانس (monolithic) ليضعه داخل النواة — مدير العمليات، مدير الذاكرة، نظام الملفات، برامج تشغيل الأجهزة، مكدس الشبكة — يعمل كعمليات مستخدم عادية تسمى مديري الموارد (resource managers)، ويتواصلون مع بعضهم البعض ومع عملائهم من خلال نفس أساسية IPC إرسال / استقبال / رد (send / receive / reply).
هذه المعمارية هي ما يجعل QNX أنيقًا، وهو بالضبط ما يحافظ عليه QRV. برنامج يريد فتح ملف يرسل رسالة؛ خادم نظام الملفات يستلمها، يقوم بالعمل، ويرد. النواة فقط تتوسط في rendezvous. النتيجة هي نظام حيث يمكن لبرنامج تشغيل أن يتعطل ويتم إعادة تشغيله دون إسقاط النواة، حيث يتم قياس قاعدة الحوسبة الموثوقة بعشرات الكيلوبايتات، وحيث الحدود بين "النواة" و"التطبيق" هي رسالة، وليس جدار صلاحيات مليء باستدعاءات النظام.
QRV يأخذ مصادر مجتمع QNX Neutrino 6.4 من حقبة 2009 ويحمل ذلك التصميم إلى الأمام:
int/uint32_t/pid_t على المؤشرات التي تملأ الكود 32 بت.qemu-system-riscv64 (جهاز virt) ولوحة التطوير SiFive Unmatched (FU740). يتم الاحتفاظ ببناء x86-64 كفحص لقابلية النقل.mkifs (QRV يستخدم تنسيق CPIO القياسي بدلاً من ذلك)؛ لا يوجد فصل منفصل بين startup/kernel (يتم ربط startup مباشرة مع النواة)؛ لا يوجد callouts ولا برامج تشغيل صغيرة.Kconfig في Linux، ربط نواة تدريجي (تتم إضافة الوحدات واختبارها واحدة تلو الأخرى، وليس رميها في الرابط ككتلة واحدة 32→64)، ومجموعة أدوات مترجم متقاطع (riscv64-linux-gnu-gcc).procnto أصبح taskman (مدير المهام) في كل مكان؛ تمت إزالة جميع إشارات "Neutrino".لا يقوم QRV بتنفيذ fork() (تبدأ البرامج عبر posix_spawn())، ولا يحتوي على ترحيل حسب الطلب ولا مبادلة (swap) — نفس الخيارات التي اتخذتها QNX نفسها في جيل 8.0.
QRV محكوم بـ ترخيصين في نفس الوقت، وفهم أيهما هو أمر ضروري قبل بناء أو إعادة توزيع أي شيء.
LICENSE.txt.هذه الحقيقة المزدوجة الترخيص هي بالضبط لماذا لا يحتوي هذا المستودع على شجرة مصادر قابلة للبناء مباشرة. لا يُسمح لنا بإعادة توزيع المصادر المشتقة من QNX. لذا بدلاً من شحن الكود، يشحن هذا المستودع وصفة (انظر القسم التالي): خريطة توضح أين يذهب كل ملف QNX، بالإضافة إلى تصحيحات QRV التي تحوله. تحصل أنت على مصادر مجتمع QNX الأصلية بنفسك، من مرآتها العامة، وتقوم الوصفة بإعادة بناء شجرة QRV على جهازك. نسختك هي ملكك؛ نحن نعيد توزيع فقط تصحيحاتنا وبياناتنا الوصفية المرخصة تحت Apache.
QRV يدمج أيضًا كودًا تحت تراخيص سماحية أخرى — على سبيل المثال مكونات مرخصة BSD مأخوذة من FreeBSD (تحل محل وحدات QNX القديمة)، وبرنامج تشغيل قرص virtio مرخص MIT من أصل xv6، وصدفة Korn من MirBSD (mksh) كصدفة النظام. WHAT_IS_WHAT.md هو التحليل التفصيلي الموثوق لكل مكون حول ما هو تحت أي ترخيص ومن أين أتى — استشرها كلما كنت غير متأكد من ملف أو نظام فرعي معين.
أخيرًا، يحتوي المستودع على PETITION.md: طلب مفتوح لأنظمة برمجيات QNX و BlackBerry لإعادة ترخيص مصادر Neutrino التاريخية من 2007–2009 تحت رخصة سماحية معتمدة من OSI. إذا كنت ترغب في أن تكون أسس هذا العمل حرة بالكامل يومًا ما، فذلك المستند هو المكان لإضافة اسمك.
obtain_proj.sh وشجرة os/نظرًا لعدم إمكانية إعادة توزيع المصادر المشتقة من QNX هنا، فإن هذا المستودع هو توزيع إعادة بناء المصادر. يحتوي على:
| الملف / الدليل | الغرض |
|---|---|
obtain_proj.sh | برنامج إعادة البناء — قم بتشغيله. |
placement.txt | يربط كل مسار QNX أصلي بمسار QRV الخاص به (≈680 إدخال). |
patches/ | سلسلة تصحيحات QRV، مضغوطة بـ LZ4، بالإضافة إلى ملف ترتيب series. |
LICENSE.txt | رخصة Apache 2.0. |
WHAT_IS_WHAT.md | الترخيص والمصدر لكل مكون على حدة. |
PETITION.md | عريضة إعادة الترخيص. |
$ ./obtain_proj.sh
1. **يستنسخ المرآة المجتمعية لـ QNX من المنبع** (`github.com/vocho/openqnx`، استنساخ ضحل).
2. **يضع الملفات** وفقًا لـ `placement.txt`، بنسخ كل ملف من المنبع إلى موقعه في QRV تحت `os/`. يبلغ عن عدد الملفات التي تم وضعها، الموجودة مسبقًا، أو المفقودة.
3. **يزيل الاستنساخ** بمجرد الانتهاء من التنسيب.
4. **يطبق سلسلة تصحيحات QRV** من `patches/series`، بالترتيب. كل تصحيح مضغوط بصيغة LZ4 (`*.patch.lz4`) ويتم تطبيقه باستخدام `lz4cat … | patch -p1`. تحمل التصحيحات إصدار الإصدار الحالي.
5. **يضبط صلاحيات التنفيذ** على عدد قليل من البرامج النصية التي تحتاجها (مثل `emu.sh`، `host_tools/mkgpt.py`).
الأدوات المطلوبة هي `git`، `patch`، و `lz4cat` (من حزمة `lz4`)؛ يتحقق البرنامج النصي من وجودها مقدمًا ويخبرك بكيفية تثبيت أي منها مفقود.