
QRV Operating System
QRV — это комплексная адаптация и переосмысление операционной системы QNX Neutrino 6.4 для современного 64-разрядного оборудования, с RISC-V (rv64g) в качестве основной архитектуры и x86-64 в качестве вторичной целевой платформы. Проект начался в канун Рождества 2020 года. Название QRV намеренно избегает каких-либо ассоциаций с товарным знаком QNX.
QRV — это целая операционная система, а не просто ядро. Микроядро является её сердцем, но большая часть работы была вложена во всё, что его окружает. Наиболее заметен taskman — менеджер процессов/памяти/путей в пользовательском режиме (аналог QNX procnto), который был глубоко переработан и вынесен из ядра в пользовательское пространство; вместе с ним были портированы, приведены к 64-разрядному виду и во многих местах существенно переписаны библиотека C, драйверы устройств, файловая система, динамический загрузчик и системные серверы. Микроядро по замыслу невелико; операционная система вокруг него — вот где сосредоточена основная часть 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 — агентивным инструментом программирования от Anthropic; большая часть портирования, отладки SMP и документации (включая этот README) выполнялась как совместная работа человека и ИИ, бок о бок с автором.
obtain_proj.sh и дерево os/TM_PRIVdevb-nvme и fs-qrvQNX — это микроядерная операционная система реального времени, основная идея которой — синхронная передача сообщений. В QNX ядро само по себе крошечное: оно умеет планировать потоки, передавать сообщения, доставлять сигналы, обрабатывать таймеры и прерывания — и очень мало что ещё. Всё, что монолитная ОС поместила бы внутрь ядра — менеджер процессов, менеджер памяти, файловая система, драйверы устройств, сетевой стек, — работает в обычных пользовательских процессах, называемых менеджерами ресурсов, и они общаются друг с другом и со своими клиентами через тот же примитив IPC передать / принять / ответить.
Именно эта архитектура делает 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/ядро (startup слинкован напрямую с ядром); нет callout-ов и мини-драйверов.Kconfig, инкрементальная линковка ядра (модули добавляются и тестируются по одному, а не скармливаются линковщику как монолит 32→64), и кросс-компиляторная цепочка (riscv64-linux-gnu-gcc).procnto всюду называется taskman (Task Manager); все упоминания "Neutrino" удалены.QRV не реализует fork() (программы запускаются через posix_spawn()) и не имеет подкачки по требованию и 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. Части QRV, происходящие из общедоступных исходников QNX Neutrino 2009 года, остаются под QCL, которая разрешает некоммерческое и академическое использование производных исходников. QRV не имеет права и не может перелицензировать код QNX.
Эта реальность с двумя лицензиями как раз и является причиной, по которой этот репозиторий не содержит готового к сборке дерева исходников. Нам не разрешено распространять исходники, производные от QNX. Поэтому вместо поставки кода этот репозиторий поставляет рецепт (см. следующий раздел): карту того, куда помещается каждый файл QNX, плюс патчи QRV, которые его преобразуют. Вы самостоятельно получаете вышестоящие общедоступные исходники QNX с их публичного зеркала, и рецепт восстанавливает дерево QRV на вашей машине. Ваша копия принадлежит вам; мы распространяем только наши собственные патчи и метаданные под лицензией Apache.
QRV также включает код под другими разрешительными лицензиями — например, компоненты под лицензией BSD, заимствованные из FreeBSD (заменяющие устаревшие модули QNX), блочный драйвер virtio под лицензией MIT родом из xv6, и оболочку системы MirBSD Korn shell (mksh). WHAT_IS_WHAT.md — это авторитетная, покомпонентная разбивка того, что под какой лицензией и откуда взялось; обращайтесь к ней всякий раз, когда не уверены в конкретном файле или подсистеме.
Наконец, в репозитории содержится PETITION.md: открытое обращение к QNX Software Systems и BlackBerry с просьбой перелицензировать исторические исходники Neutrino 2007–2009 годов под разрешительной лицензией, одобренной OSI. Если вы хотели бы, чтобы основы этой работы когда-нибудь стали полностью свободными, в этом документе можно добавить своё имя.
obtain_proj.sh и дерево os/Поскольку производные от QNX исходники не могут быть распространены здесь, этот репозиторий представляет собой дистрибутив для реконструкции исходников. Он содержит: