
QRVは、現代の64ビットハードウェア向けに、QNX Neutrino 6.4オペレーティングシステムを根本から適応・再実装したものです。主要アーキテクチャはRISC-V(rv64g)、セカンダリターゲットはx86-64です。プロジェクトは2020年のクリスマスイブに始まりました。QRVという名称は、QNXの商標との関連を意図的に避けています。
QRVは、カーネルだけでなく完全なオペレーティングシステムです。マイクロカーネルがその心臓部ですが、作業の大部分はそれを取り巻くすべてのものに費やされています。最も注目すべきは、ユーザーモードのプロセス/メモリ/パスマネージャ(QNXのprocnto)であるtaskmanです。これは大幅に再加工され、カーネルからユーザースペースに引き上げられました。それに加えて、Cライブラリ、デバイスドライバ、ファイルシステム、動的ローダー、システムサーバーがすべて移植され、64ビット対応になり、多くの場所で大幅に書き直されています。マイクロカーネルは設計上小さいままですが、その周りのオペレーティングシステムがQRVの大部分を占めています。
これは、古いコードを新しいコンパイラで単にコンパイルするフォークではありません。これは、モジュールごとに慎重に真のLP64モデルに移植したものであり、独自のprocnto境界を解体し、IFS/スタートアップ機構を置き換え、最新リリースではカーネルのBig Kernel Lockを完全に削除し、プロセス/メモリ/パスマネージャをカーネルからユーザーモードサーバーに移動させています。
このREADMEはQRV v0.43について説明しています。
開発ブログ(移植の全容)は https://r-tty.blogspot.com にあります。本格的な文書『QRV移植物語』は、ソースツリーの doc/tex/PortingStory/ にあります。
QRVはClaude Code(Anthropicのエージェント型コーディングツール)と密接に協力して開発されました。移植作業、SMPデバッグ、ドキュメント(このREADMEを含む)の多くは、人間とAIのペアプログラミングの取り組みとして、著者とともに行われました。
obtain_proj.sh と os/ ツリーTM_PRIV特権システムコールdevb-nvme と fs-qrvQNXはマイクロカーネルリアルタイムオペレーティングシステムであり、その中心的な考え方は同期メッセージパッシングです。QNXでは、カーネル自体は小さく、スレッドのスケジューリング、メッセージの受け渡し、シグナルの配信、タイマーと割り込みの処理、そしてそれ以外はほとんど行いません。モノリシックOSがカーネル内部に入れるものすべて—プロセスマネージャ、メモリマネージャ、ファイルシステム、デバイスドライバ、ネットワークスタック—は、リソースマネージャと呼ばれる通常のユーザープロセスとして実行され、同じsend / receive / reply IPCプリミティブを通じて互いに、そしてクライアントと通信します。
このアーキテクチャこそがQNXをエレガントにしており、QRVがまさに保存しているものです。ファイルを開きたいプログラムはメッセージを送信し、ファイルシステムサーバーがそれを受信し、処理を行い、応答します。カーネルはランデブーを仲介するだけです。その結果、ドライバがクラッシュしてもカーネルをダウンさせることなく再起動でき、信頼できるコンピューティングベースは数十キロバイトで測定され、「カーネル」と「アプリケーション」の境界は、システムコールだらけの特権壁ではなく、メッセージであるシステムが実現します。
QRVは2009年当時のQNX Neutrino 6.4コミュニティソースを基に、その設計を未来に引き継ぎます:
int/uint32_t/pid_tのポインタ上の切り捨てを追跡し修正します。qemu-system-riscv64(virtマシン)とSiFive Unmatched (FU740) 開発ボードです。x86-64は移植性確認用にビルドを維持しています。mkifsはありません(QRVは代わりに標準のCPIO形式を使用)。スタートアップ/カーネルの分離もなく(スタートアップはカーネルに直接リンク)、コールアウトやミニドライバもありません。Kconfig設定、インクリメンタルカーネルリンク(モジュールは32→64のモノリスとしてリンカに投げられるのではなく、一度に1つずつ追加・テスト)、クロスコンパイラツールチェーン(riscv64-linux-gnu-gcc)。procntoは全体で**taskman**(Task Manager)に変更。「Neutrino」への参照はすべて除去されています。QRVはfork()を実装しておらず(プログラムはposix_spawn()で起動)、デマンドページングやスワップもありません—これらはQNX自身が8.0世代で行ったのと同じ選択です。
QRVは同時に2つのライセンスが適用されます。どちらがどれかを理解することは、何かをビルドしたり再配布したりする前に不可欠です。
QRV独自のコードはApache License 2.0です。 このプロジェクトのためにゼロから書かれたものすべて—RISC-V移植、新しいビルドシステム、ユーザーモードtaskman分割、ロックフリーカーネル再加工、私たちが作成したドライバやツール—はApache 2.0です。全文は**LICENSE.txt**にあります。
QNX由来のコードはBlackBerry QNX Community License (QCL) 2.0です。 2009年のQNX Neutrinoコミュニティソースから派生したQRVの部分は引き続きQCLのもとで、派生ソースの非商用および学術目的での使用を許可します。QRVはQNXのコードのライセンスを変更することはできません。
このデュアルライセンスの現実こそが、このリポジトリにビルド可能なソースツリーが含まれていない理由です。 QNX由来のソースを再配布することは許可されていません。そのため、コードを提供する代わりに、このリポジトリはレシピ(次のセクション参照)を提供します。各QNXファイルの配置先と、それを変換するQRVパッチのマップです。あなた自身でアップストリームのQNXコミュニティソースを公開ミラーから入手し、レシピがあなたのマシン上でQRVツリーを再構築します。あなたのコピーはあなたのものです。私たちは、Apacheライセンスのパッチとメタデータのみを再配布します。
QRVはまた、他のパーミッシブライセンスのコードも取り入れています。例えば、FreeBSDから採用したBSDライセンスのコンポーネント(古いQNXモジュールを置き換え)、xv6由来のMITライセンスvirtioブロックドライバ、システムシェルとしてのMirBSD Kornシェル(mksh)などです。WHAT_IS_WHAT.mdが、何がどのライセンスでどこから来たのかの信頼できるコンポーネントごとの内訳です—特定のファイルやサブシステムについて不明な場合は、それを参照してください。
最後に、リポジトリには**PETITION.md**が含まれています。これは、QNX Software SystemsおよびBlackBerryに対して、歴史的な2007〜2009年のNeutrinoソースをパーミッシブなOSI承認ライセンスで再ライセンスするよう求める公開要請です。この作業の基盤がいつか完全に自由になることを望むなら、その文書にあなたの名前を追加してください。
obtain_proj.sh と os/ ツリーQNX由来のソースはここで再配布できないため、このリポジトリはソース再構築配布です。以下が含まれます:
| ファイル/ディレクトリ | 目的 |
|---|---|
obtain_proj.sh | 再構築スクリプト — これを実行します。 |
placement.txt | 各アップストリームQNXパスをQRVパスにマッピング(約680エントリ)。 |
patches/ | QRVパッチシリーズ(LZ4圧縮)、およびseries順序ファイル。 |
LICENSE.txt | Apache License 2.0。 |
WHAT_IS_WHAT.md | コンポーネントごとのライセンスと出所。 |
PETITION.md | 再ライセンス請願。 |
$ ./obtain_proj.sh
1. **上流のQNXコミュニティミラーをクローンします** (`github.com/vocho/openqnx`、浅いクローン)。
2. `placement.txt`に従って**ファイルを配置**し、各上流ファイルを`os/`以下の適切なQRVの場所にコピーします。配置されたファイル、既に存在するファイル、不足しているファイルの数を報告します。
3. 配置が完了したら**クローンを削除**します。
4. `patches/series`から順に**QRVパッチシリーズを適用**します。各パッチは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 を参照)。