Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
qrv — نظام التشغيل QRV | Kitploit
أدوات/GitHubGitHub/r-tty/qrv
أمان الأنظمة المدمجةأمن الأجهزةالأوراق والأبحاثالتعلم والتعليمموارد منسقة
GitHubr-tty/qrv

qrv

نظام التشغيل QRV

عرض المستودع
24منذ 2 أشهرتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

QRV — نظام تشغيل قائم على QNX Neutrino، مُعاد تصوره لمعمارية RISC-V 64-bit

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 هذا) تم كجهد برمجة زوجي بين الإنسان والذكاء الاصطناعي، بالعمل جنبًا إلى جنب مع المؤلف.


المحتويات

  1. ما هو QRV
  2. الترخيص
  3. الحصول على المصادر: obtain_proj.sh وشجرة os/
  4. معمارية النظام
  5. Taskman واستدعاء النظام المميز TM_PRIV
  6. Big Kernel Lock — وإزالته
  7. التخزين: devb-nvme و fs-qrv
  8. مساحة المستخدم
  9. البناء والتشغيل
  10. التشغيل على أجهزة حقيقية
  11. ملاحظات ختامية: لماذا يهم النسخة المجانية

1. ما هو QRV

QNX هو نظام تشغيل زمن حقيقي نواة صغرية (microkernel) فكرته الأساسية هي تمرير الرسائل المتزامن. في QNX، النواة نفسها صغيرة جدًا — فهي تعرف كيفية جدولة الخيوط، تمرير الرسائل، تسليم الإشارات، التعامل مع المؤقتات والمقاطعات، وقليل جدًا غير ذلك. كل شيء كان نظام التشغيل المتجانس (monolithic) ليضعه داخل النواة — مدير العمليات، مدير الذاكرة، نظام الملفات، برامج تشغيل الأجهزة، مكدس الشبكة — يعمل كعمليات مستخدم عادية تسمى مديري الموارد (resource managers)، ويتواصلون مع بعضهم البعض ومع عملائهم من خلال نفس أساسية IPC إرسال / استقبال / رد (send / receive / reply).

هذه المعمارية هي ما يجعل QNX أنيقًا، وهو بالضبط ما يحافظ عليه QRV. برنامج يريد فتح ملف يرسل رسالة؛ خادم نظام الملفات يستلمها، يقوم بالعمل، ويرد. النواة فقط تتوسط في rendezvous. النتيجة هي نظام حيث يمكن لبرنامج تشغيل أن يتعطل ويتم إعادة تشغيله دون إسقاط النواة، حيث يتم قياس قاعدة الحوسبة الموثوقة بعشرات الكيلوبايتات، وحيث الحدود بين "النواة" و"التطبيق" هي رسالة، وليس جدار صلاحيات مليء باستدعاءات النظام.

QRV يأخذ مصادر مجتمع QNX Neutrino 6.4 من حقبة 2009 ويحمل ذلك التصميم إلى الأمام:

  • نظيف 64 بت (LP64). كل مؤشر ونوع حجم هو 64 بت؛ النقل يتتبع ويصلح حالات اقتطاع int/uint32_t/pid_t على المؤشرات التي تملأ الكود 32 بت.
  • RISC-V أولاً. الهدف الأساسي هو qemu-system-riscv64 (جهاز virt) ولوحة التطوير SiFive Unmatched (FU740). يتم الاحتفاظ ببناء x86-64 كفحص لقابلية النقل.
  • لا حدود مملوكة. لا يوجد IFS ولا 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.


2. الترخيص

QRV محكوم بـ ترخيصين في نفس الوقت، وفهم أيهما هو أمر ضروري قبل بناء أو إعادة توزيع أي شيء.

  • كود QRV الخاص هو رخصة Apache 2.0. كل شيء كتب من الصفر لهذا المشروع — نقل RISC-V، نظام البناء الجديد، فصل taskman في وضع المستخدم، إعادة صياغة النواة بدون أقفال، برامج التشغيل والأدوات التي ألفناها — هو Apache 2.0. النص الكامل موجود في LICENSE.txt.
  • الكود المشتق من QNX هو رخصة مجتمع BlackBerry QNX (QCL) 2.0. الأجزاء من QRV التي تنحدر من مصادر مجتمع QNX Neutrino 2009 تبقى تحت رخصة QCL، والتي تسمح بالاستخدام غير التجاري والأكاديمي للمصادر المشتقة. QRV لا يمكنه، ولن يعيد ترخيص كود QNX.

هذه الحقيقة المزدوجة الترخيص هي بالضبط لماذا لا يحتوي هذا المستودع على شجرة مصادر قابلة للبناء مباشرة. لا يُسمح لنا بإعادة توزيع المصادر المشتقة من 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. إذا كنت ترغب في أن تكون أسس هذا العمل حرة بالكامل يومًا ما، فذلك المستند هو المكان لإضافة اسمك.


3. الحصول على المصادر: obtain_proj.sh وشجرة os/

نظرًا لعدم إمكانية إعادة توزيع المصادر المشتقة من QNX هنا، فإن هذا المستودع هو توزيع إعادة بناء المصادر. يحتوي على:

ماذا يفعل البرنامج النصي```

$ ./obtain_proj.sh

root@kitploit:~
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`)؛ يتحقق البرنامج النصي من وجودها مقدمًا ويخبرك بكيفية تثبيت أي منها مفقود.

المنتج النهائي هو **`os/`** — شجرة كاملة وقابلة للبناء لمصدر QRV:```
os/
├── kernel/          Everything linked into the qrv-kernel binary
│   ├── arch/riscv/     RISC-V port: vectors, traps, SBI, context switch,
│   │   ├── startup/        arch-specific startup (head.S, mmu.c, …)
│   │   ├── platform/       qemu_virt/, unmatched/
│   │   └── include/        context.h, cpu_paging.h, sbi.h, …
│   ├── startup/         arch-independent startup (hardware_init, smp, …)
│   ├── nano/            core nanokernel: messaging, scheduling, sync, xfer
│   ├── kext/            kernel extensions (kerexts)
│   └── include/         kernel-internal headers
├── taskman/         The Task Manager (QNX's "procnto"), a user-mode server
│   ├── sys/            system manager: main, ELF loader, support
│   ├── proc/           process manager: spawn, wait, …
│   ├── mem/            memory manager: page tables, physical allocator
│   │   └── pageman/        page-granularity virtual-memory operations
│   └── path/           path manager: namespace, /dev/*, /proc/*
├── lib/             C library and runtime
├── include/         User-space-visible headers (the public ABI)
├── userland/        Shell, utilities, drivers, servers (resource managers)
├── servers/         pci, slogger
├── dev/             Device drivers (virtio block, 8250 UART, …)
├── boot/            Boot artifacts and deploy helpers
├── host_tools/      Host-side tooling (mkgpt.py, …)
├── doc/             Documentation, incl. The QRV Porting Story (LaTeX)
├── Kconfig, Makefile, def.mk, common.mk, emu.sh

من هناك، يقوم cd os && make ببناء النظام (انظر §9).


4. بنية النظام

QRV هو نظام ميكروكيرنل حقيقي. تظهر سلسلة الامتيازات، من العتاد إلى الأعلى، على RISC-V كما يلي:``` ┌───────────────────────────────────────────────────────────────────────┐ │ User space (U-mode) │ │ │ │ sh pidin lspci sloginfo login ... │ │ │ │ │ │ │ │ │ devb-nvme fs-qrv devc-ser* pci slogger ← resource managers │ │ │ │ │ │ │ │ │ │ └──────┴───────┴────────┴─────────┴───────┘ │ │ │ libc (send / receive / reply stubs) │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ taskman — process · memory · path manager │ │ │ │ a U-mode server, privileged via TM_PRIV │ │ │ └─────────────────────────────────────────────────────────────────┘ │ └────────────────────────────────────│──────────────────────────────────┘ │ ecall (syscall / message) ┌───────────────────────────────────────────────────────────────────────┐ │ QRV microkernel (S-mode) │ │ │ │ message passing · channels & connections · scheduling · │ │ threads · synchronization · signals · timers & clocks · │ │ interrupts · syscall dispatch · TM_PRIV kernel extensions │ └───────────────────────────────────────│───────────────────────────────┘ │ SBI ecall ┌───────────────────────────────────────────────────────────────────────┐ │ OpenSBI firmware (M-mode) │ └───────────────────────────────────────│───────────────────────────────┘ │ ┌───────────────────────────────────────────────────────────────────────┐ │ RISC-V 64-bit hardware — QEMU virt · SiFive Unmatched U740 │ └───────────────────────────────────────────────────────────────────────┘

root@kitploit:~
**النواة (وضع S)** هي المكون الوحيد الذي يعمل بامتياز بالمعنى الكلاسيكي. أنظمتها الفرعية صغيرة ومركزة:

- **تمرير الرسائل** — `ker_message.c`, `ker_fastmsg.c`, `nano_message.c`
- **القنوات والاتصالات** — `ker_channel.c`, `ker_connect.c`
- **الخيوط والجدولة** — `ker_thread.c`, `ker_sched.c`, `nano_sched.c`
- **التزامن** — `ker_sync.c`, `nano_sync.c`
- **الإشارات** — `ker_signal.c`
- **المؤقتات والساعات** — `ker_timer.c`, `ker_clock.c`
- **المقاطعات** — `ker_interrupt.c`
- **توزيع استدعاءات النظام** — `ker_call_table.c`
- **نقل البيانات** — عائلة `nano_xfer*.c` (محرك النسخ عبر مساحات العناوين الذي ينقل حمولات الرسائل بأمان بين العمليات)

الواجهة بين المُشغّل (bootstrapper) والنواة هي **syspage** (`include/sys/syspage.h`)؛ حالة كل معالج (CPU) موجودة في **cpupage**؛ سياق السجلات الكامل هو `RISCV_CPU_REGISTERS`. على RISC-V، يتم تعريف كل "معالج" بواسطة **معرف hart (hart ID)** في كل مكان — هناك مساحة أسماء واحدة لتسمية المعالجات، من البداية إلى النهاية.

**كل شيء آخر هو عملية مستخدم.** مدير العمليات/الذاكرة/المسار، مشغلات الكتلة والتسلسل، نظام الملفات، خادم PCI، مسجل النظام — جميعها مديرو موارد يتم الوصول إليها بإرسال رسالة. النواة لا تحتوي على نظام ملفات؛ بل تحتوي على القدرة لعملية ما أن تطلب من أخرى *أن تكون* نظام ملفات.

---

## 5. Taskman واستدعاء النظام المميز `TM_PRIV`

**`taskman`** هو اسم QRV لما أطلقت عليه QNX اسم `procnto`: مدير العمليات ومدير الذاكرة ومدير المسار (مساحة الأسماء) المجمع. في نظام QNX الكلاسيكي، هذا الكود مدمج في صورة النواة. أحد الإنجازات الهيكلية الكبرى لـ QRV هو أن **taskman يعمل الآن في وضع المستخدم** — إنها عملية عادية في وضع U، وليست جزءًا من النواة المميزة.

وهذا يثير سؤالاً واضحًا: إذا كان taskman يعيش في مساحة المستخدم، فكيف يقوم بالأشياء شديدة الامتياز التي يجب على مدير العمليات والذاكرة القيام بها — التلاعب بجداول الصفحات، تخصيص الذاكرة الفعلية، إنشاء وتدمير مساحات العناوين، تسليم الإشارات والنبضات، إنهاء العمليات؟

الجواب هو بوابة واحدة محكمة التحكم: **`__KER_TM_PRIV`**, فتحة استدعاء النظام 2. إنه الباب *الوحيد* الذي من خلاله يصل taskman إلى العمليات ذات الامتياز النووي، وخلف تلك الفتحة الواحدة يوجد جدول توزيع يحتوي على **~98 عملية فرعية** — **إضافات نواة** صغيرة ("kerexts") كل منها يؤدي إجراءً مميزًا محددًا جيدًا ويعود. بعض الفئات التمثيلية:

- **دورة حياة العملية** — `PROCESS_CREATE`, `PROCESS_EXEC`, `PROCESS_DESTROY`, `PROCESS_STARTUP`, `PROCESS_SHUTDOWN`, `REPARENT`
- **الذاكرة الفعلية والافتراضية** — `PA_ALLOC`, `PA_FREE`, `PA_QUANTUM_TO_PADDR`, `PAGE_CONT`, `STACK_CONT`, `ASPACE_MEMCPY`
- **بيانات الاعتماد والحدود** — `CRED_GET`, `CRED_SET`, `LIMITS_GET/SET`
- **التسليم والكائنات** — `PULSE_DELIVER`, `SIGNAL_DELIVER`, `QUERY_OBJECT`, `CHANNEL_DESTROY`, `CONNECT_DETACH`
- **SMP والمنصة** — `SMP_BRINGUP`, `LEGAL_CPU_MASK`, `GET_KERN_PGDIR`, `ICACHE_SYNC` (عملية تناسق ذاكرة تعليمات RISC-V الجديدة في v0.43)

هذا التصميم يحافظ على **قاعدة الحوسبة الموثوقة صغيرة** — النواة الفعلية تبقى في الحد الأدنى — مع إعطاء taskman بالضبط الأدوات البدائية المميزة التي يحتاجها و**لا شيء أكثر**. والأهم من ذلك، أن كومة النواة والأجزاء الداخلية الأخرى للنواة تظل غير قابلة للوصول من وضع U (صفحات النواة تحتفظ بـ `PTE_U=0`)؛ يقوم taskman بعمله من خلال kerexts النسخ من/إلى المستخدم، ولا يتم تسليمه مؤشر نواة خام أبدًا. العداد موجود في `kernel/include/ker+tm/tm_kercalls.h`؛ جدول التوزيع موجود في `kernel/ker_tm_priv.c`.

---

## 6. قفل النواة الكبير (Big Kernel Lock) — وإزالته

QRV المبكرة — مثل جيل QNX الذي جاءت منه على الأنظمة متعددة المعالجات — كانت تحمي النواة بقفل واحد كبير **Big Kernel Lock (BKL)**: كلمة `inkernel` عالمية تسمح بدخول hart واحد فقط إلى النواة في كل مرة. بغض النظر عن عدد وحدات المعالجة المركزية التي تعمل، كل استدعاء نظام وكل رسالة taskman كانت تتسلسل من خلال ذلك القفل الواحد. صحيح، بسيط — وسقف صلب لقابلية التوسع SMP.

**اعتبارًا من v0.42، تمت إزالة BKL.** كان هذا عنوان سلسلة طويلة من الإصدارات المرشحة وموضوع الفصول 9–14 من *قصة نقل QRV*. استدعاءات النظام ورسائل taskman تعمل الآن **بالتزامن عبر harts** تحت أقفال دقيقة لكل كائن:

- **القفل لكل كائن.** قفل لكل `tChannel` وقفل لكل `tConnect` يحرسان قوائم الرسائل؛ `vec_slock` لكل عملية يحرس متجه الخيوط؛ `sched_slock` لكل توزيع يحرس قوائم التشغيل؛ `alloc_slock` يحرس كومة النواة.
- **تمرير الرسائل بدون قفل.** `MsgSend` / `MsgReceive` / `MsgReply` وعائلة `Sync*` لا تأخذ **أي قفل عالمي على الإطلاق**. يتم تنسيق الالتقاء عبر harts بواسطة bits جسر لكل خيط وحواجز ذاكرة الأجهزة بدلاً من الاستبعاد المتبادل.
- **إعادة تدوير SMR (المكافئ لـ RCU).** يتم تقاعد الخيوط والاتصالات والقنوات من خلال استصلاح الذاكرة الآمن بحيث لا تقوم عمليات البحث بدون قفل بإلغاء الإشارة إلى كائن محرر.

على QEMU `virt` مع `-smp 8`، يتم تشغيل النواة بشكل موثوق إلى موجه `login:` وتتحمل حلقة ضغط `pidin` ذات 300 تكرار دون توقف.

---

## 7. التخزين: `devb-nvme` و `fs-qrv`

وفقةً لنموذج النواة الصغيرة، التخزين في QRV هو **عمليتا مستخدم متعاونتان**، وليس نظامًا فرعيًا للنواة:

- **`devb-nvme`** — مشغل أجهزة الكتلة. يتحدث NVMe عبر PCIe (مع تحليل أقسام GPT مدمج)، ويكتشف المتحكم من خلال خادم PCI، ويقدم أجهزة كتلة مثل `/dev/nvme0n1` وأقسامه. (أخ `devb-virtio` يقود جهاز QEMU virtio-blk للهدف المحاكى.)
- **`fs-qrv`** — مدير موارد نظام الملفات. يقوم بتحميل قسم ويخدم مساحة أسماء نظام الملفات POSIX عبر تمرير الرسائل: `open`/`read`/`write`/`close` للتطبيق تصبح رسائل يجيب عليها `fs-qrv`.

الإقلاع النموذجي يقوم بتحميل قسم NVMe حقيقي وتشغيل البرامج منه:```
mount -t qrv /dev/nvme0n1p5 /disk2

هذا المسار — مشغل القطاعات، التقسيم، خادم نظام الملفات، والنواة التي تتوسط كل رسالة بينها — يعمل من البداية إلى النهاية على كل من QEMU ومحرك NVMe الخاص بـ SiFive Unmatched.


8. فضاء المستخدم

يقلع QRV من خلال sysinit/init، ويُشغِّل مشغل وحدة التحكم التسلسلية (devc-ser8250 على QEMU، devc-sersifive على FU740)، وخادم PCI، ومكدس التخزين، وgetty/login، ويوصلك إلى طرفية الصدفة. أبرز برامج فضاء المستخدم:

  • sh — mksh، صدفة MirBSD Korn. صدفة POSIX حقيقية قابلة للبرمجة هي صدفة النظام؛ نصوص الإقلاع (level1.sh، …) هي نصوص صدفة عادية.
  • pidin — أداة "معلومات العمليات" الكلاسيكية من QNX: تعرض العمليات، المسارات، حالاتها، الذاكرة، والمزيد. هي الأداة الأساسية في QRV لفحص "هل النظام حي وسليم؟" وعبء العمل القياسي لاختبار الإجهاد.
  • lspci — يُعدِّد ناقل PCI/PCIe من خلال خادم PCI.
  • sloginfo — يُفرغ سجل النظام الذي جمعه خادم slogger.

إلى جانب هذه، توجد اللبنات الأساسية لنظام متعدد المستخدمين قابل للاستخدام: getty و login (مع دعم بيانات الاعتماد/المصادقة)، mount، shutdown، pipe، والأدوات الأساسية (ls, cat, …). كل برنامج في QRV هو متعدد المسارات — على الأقل مسار رئيسي ومسار نظام — وهذا هو بالضبط سبب أهمية مزامنة SMP الصحيحة (انظر §6).


9. البناء والتشغيل

سلسلة الأدوات```

Cross-compiler : riscv64-linux-gnu-gcc CPU flags : -march=rv64g -mcmodel=medany -mno-relax Build style : -nostdinc -nostdlib -ffreestanding

root@kitploit:~
### الأوامر الشائعة (تُشغَّل داخل `os/`)```bash
make                 # Build everything: startup + kernel + module package
make -Bj             # Force a full parallel rebuild (do this after header changes)
make startup         # Build startup only
make kernel          # Build kernel only
make modpkg          # Create the module package (CPIO)
make qemu            # Build and run in QEMU
./emu.sh             # Run in QEMU (4 CPUs, 256M RAM, virt machine)
./emu.sh -P 1        # Run with a single hart
./emu.sh -gdb        # Run with the GDB remote stub (port 1234)

10. التشغيل على أجهزة حقيقية

الهدف الثانوي ولكن الجاد لـ QRV هو لوحة SiFive Unmatched (FU740) — لوحة حقيقية لعمل RISC-V. إن تشغيل نواة مصغرة (ميكروكيرنل) تبدأ بسلاسة على QEMU لتنجح أيضًا في البدء بشكل نظيف على السيليكون المادي كشف عن فئة من الأخطاء التي لا تظهرها المحاكاة، ومطاردتها تشكل جزءًا كبيرًا مما تدور حوله الإصدارات الأخيرة.

المثال المحدد، الذي تم إصلاحه في الإصدار v0.43: لمدة شهرين، عملت QRV بشكل لا تشوبه شائبة على QEMU ولكنها تعطلت على المعدن الحقيقي. على FU740، أي برنامج — pidin، lspci، أي شيء — يتعطل بعد بضع عمليات إنشاء، كل عطل مختلف عن السابق، ومؤشر البرنامج يتجول في بيانات غير صالحة. تبين أن السبب ليس تلف الذاكرة على الإطلاق، بل عدم اتساق ذاكرة التخزين المؤقت للتعليمات: تضمن RISC-V عدم وجود اتساق بين مخازن البيانات وجلب التعليمات، لذا فإن كود البرنامج المُحمّل حديثًا يكون غير مرئي لوحدة الجلب للنواة حتى تنفذ تلك النواة fence.i — والكود الذي سيعمل على نواة مختلفة عن تلك التي حملته يحتاج إلى fence.i عن بعد هناك. لم يقم محمل QRV بأي من ذلك (حتى أنه احسب علامة "إبطال ذاكرة التخزين المؤقت للتعليمات" ثم تخلص منها). لا يقوم QEMU بنمذجة ذاكرة تخزين مؤقت للتعليمات، لذا كان الخطأ غير مرئي هناك وحتميًا على U74.

الإصلاح — استخدام fence.i محليًا بالإضافة إلى بث عبر SBI (cpu_icache_sync_all()) عند كل نقطة تصبح فيها الصفحة قابلة للتنفيذ — حوّل حلقة إنشاء كانت تتعطل كل بضع عمليات تشغيل إلى حلقة تعمل لأكثر من 600 عملية إنشاء متتالية على FU740 دون تعطل. التحقيق الكامل، بما في ذلك الفرضية الخاطئة التي أنتجها في البداية والتشخيص الذي قلبها، هو القسم الختامي من الفصل 14 من قصة نقل QRV.

تشمل الإنجازات المعمارية التي تم تحقيقها حتى الآن بدء تشغيل وصولاً إلى موجه login: في مدير المهام في وضع المستخدم على FU740، وتثبيت وتشغيل برامج اختبار من قسم NVMe حقيقي.


11. ملاحظات ختامية: لماذا تعتبر النسخة المطابقة المجانية مهمة

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

لهذا السبب يوجد هذا العمل. QRV هي، بصراحة، وسيلة انتقالية — وسيلة لتعلم العمارة بعمق من خلال نقلها، وتفكيكها وإعادة تركيبها على أجهزة جديدة، وإزالة قفل النواة ورفع مدير العمليات إلى مساحة المستخدم، واكتشاف أي الافتراضات كانت حاملة للثقل. كل خطأ تمت مطاردته على السيليكون الحقيقي، كل نظام فرعي تمت إعادة كتابته ليكون نظيفًا لـ 64 بت، كل حدود مملوكة تم تفكيكها، هي معرفة ستحتاجها أي تطبيقة حرة حقًا.

لأن الهدف طويل المدى ليس الحفاظ على نسخة معدلة من مصادر شخص آخر إلى الأبد. إنه نظام تشغيل حر بالكامل، مبني من الصفر، ومتوافق مع واجهات QNX، ومخلص لفلسفة النواة المصغرة، ولا يدين بأي شيء لكود مملوك — نظام يمكن استخدامه، وتدريسه، وشحنه، وتحسينه دون طلب إذن من أحد. QRV هي كيف نثبت أن مثل هذا النظام ليس ممكنًا فحسب، بل عمليًا أيضًا، وكيف نكتسب الخبرة لبنائه بشكل صحيح.

إذا كنت ترغب في أن تصبح الأسس التاريخية نفسها حرة، أضف اسمك إلى PETITION.md. وإذا كنت ترغب في رؤية كيف تبدو النواة المصغرة الحديثة والمهندسة بنزاهة من الداخل — انسخ الوصفة، وقم بتشغيل obtain_proj.sh، واقرأ الكود.


QRV — تطييع وإعادة تنفيذ QNX Neutrino 6.4 لأجهزة 64 بت. بدأ في ليلة عيد الميلاد 2020. Apache 2.0 (كود QRV الخاص) + BlackBerry QCL 2.0 (المصادر المشتقة من QNX). راجع WHAT_IS_WHAT.md للتفصيل مكونًا بمكون.

تنزيل الأداة
الملف / الدليلالغرض
obtain_proj.shبرنامج إعادة البناء — قم بتشغيله.
placement.txtيربط كل مسار QNX أصلي بمسار QRV الخاص به (≈680 إدخال).
patches/سلسلة تصحيحات QRV، مضغوطة بـ LZ4، بالإضافة إلى ملف ترتيب series.
LICENSE.txtرخصة Apache 2.0.
WHAT_IS_WHAT.mdالترخيص والمصدر لكل مكون على حدة.
PETITION.mdعريضة إعادة الترخيص.