
QRV는 최신 64비트 하드웨어를 위해 QNX Neutrino 6.4 운영체제를 처음부터 다시 적응시키고 재구현한 것입니다. 주요 아키텍처는 **RISC-V(rv64g)**이며, x86-64는 보조 대상입니다. 이 프로젝트는 2020년 크리스마스 이브에 시작되었습니다. QRV라는 이름은 QNX 상표와의 연관성을 의도적으로 피한 것입니다.
QRV는 단순한 커널이 아니라 전체 운영체제입니다. 마이크로커널은 그 핵심이지만, 작업의 더 큰 부분은 그 주변을 둘러싼 모든 것에 투입되었습니다. 가장 주목할 만한 것은 taskman으로, QNX의 procnto에 해당하는 사용자 모드 프로세스/메모리/경로 관리자입니다. taskman은 깊이 재작업되어 커널 밖으로 끌어내져 사용자 공간으로 옮겨졌습니다. 그와 함께 C 라이브러리, 장치 드라이버, 파일시스템, 동적 로더, 시스템 서버도 모두 포팅되고 64비트에 맞게 정리되었으며, 많은 부분이 실질적으로 다시 작성되었습니다. 마이크로커널은 의도적으로 작게 유지되며, QRV의 대부분은 그 주변의 운영체제에 존재합니다.
이것은 새 컴파일러에서 옛 코드를 컴파일하는 단순한 포크가 아닙니다. 독점적인 procnto 경계를 해체하고, IFS/startup 메커니즘을 교체하며, 가장 최근 릴리스부터는 커널의 Big Kernel Lock을 완전히 제거하고 프로세스/메모리/경로 관리자를 커널 밖의 사용자 모드 서버로 옮긴, 진정한 LP64 모델로의 신중한 모듈별 포팅입니다.
이 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 형식을 사용합니다). 분리된 startup/커널 분할도 없습니다(startup은 커널에 직접 링크됩니다). callout도 미니 드라이버도 없습니다.Kconfig 구성, 증분 커널 링크(모듈을 32→64 모놀리스로 링커에 한꺼번에 던지는 것이 아니라 하나씩 추가하고 테스트), 크로스 컴파일러 툴체인(riscv64-linux-gnu-gcc).procnto는 전체에서 taskman(태스크 관리자)으로 불립니다. "Neutrino" 참조는 모두 제거되었습니다.QRV는 fork()를 구현하지 않습니다(프로그램은 posix_spawn()으로 시작합니다). 또한 demand paging과 swap이 없습니다 — 이는 QNX 자체가 8.0 세대에서 선택한 것과 같은 결정입니다.
QRV는 동시에 두 가지 라이선스의 적용을 받습니다. 무엇을 빌드하거나 재배포하기 전에 둘 사이의 관계를 이해하는 것이 필수적입니다.
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 아래에 남아 있으며, QCL은 파생 소스의 비상업적 및 학술적 사용을 허용합니다. QRV는 QNX의 코드를 재라이선스하지 않으며, 할 수도 없습니다.
이 이중 라이선스 현실이 바로 이 저장소에 바로 빌드 가능한 소스 트리가 포함되지 않은 이유입니다. 우리는 QNX 파생 소스를 재배포할 수 없습니다. 따라서 코드를 제공하는 대신, 이 저장소는 레시피(다음 절 참조)를 제공합니다. 즉, 각 QNX 파일이 어디로 가야 하는지에 대한 지도와, 그 파일을 변환하는 QRV 패치입니다. 업스트림 QNX 커뮤니티 소스는 공개 미러에서 직접 구해야 하며, 레시피가 사용자 머신에서 QRV 트리를 재구성합니다. 여러분의 사본은 여러분의 것입니다. 우리는 우리 자신의 Apache 라이선스 패치와 메타데이터만 재배포합니다.
QRV는 또한 다른 허용적 라이선스의 코드도 포함합니다. 예를 들어 FreeBSD에서 채택한 BSD 라이선스 구성 요소(노후화된 QNX 모듈을 대체), xv6 계열의 MIT 라이선스 virtio 블록 드라이버, 시스템 셸로 사용되는 MirBSD Korn shell(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/ | LZ4로 압축된 QRV 패치 시리즈와 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. **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 참조).