
Système d'exploitation QRV
QRV est une adaptation et une réimplémentation complète du système d'exploitation QNX Neutrino
6.4 pour du matériel 64 bits moderne, avec RISC-V (rv64g)
comme architecture principale et x86-64 comme cible secondaire. Le
projet a débuté la veille de Noël 2020. Le nom QRV évite délibérément
toute association avec la marque QNX.
QRV est un système d'exploitation complet, pas seulement un noyau. Le micro-noyau en est
le cœur — mais la plus grande partie du travail a porté sur tout ce qui
l'entoure. Le plus notable est taskman, le gestionnaire de processus / mémoire / chemins en mode utilisateur (le procnto de QNX), qui a été profondément retravaillé et sorti
du noyau dans l'espace utilisateur ; à côté de cela, la bibliothèque C, les pilotes
de périphériques, le système de fichiers, le chargeur dynamique et les serveurs système ont
tous été portés, rendus compatibles 64 bits et, à de nombreux endroits, considérablement
réécrits. Le micro-noyau est petit par conception ; le système d'exploitation qui l'entoure
est là où vit la majeure partie de QRV.
Ce n'est pas un fork qui se contente de compiler du code ancien sur un nouveau compilateur. C'est un
portage minutieux, module par module, vers un vrai modèle LP64, avec la
frontière propriétaire procnto démantelée, les mécanismes IFS/startup
remplacés, et — depuis les versions les plus récentes — le verrou global du noyau
supprimé entièrement et le gestionnaire de processus/mémoire/chemins sorti du
noyau dans un serveur en mode utilisateur.
Ce README décrit QRV v0.43.
Le blog de développement, avec l'histoire complète du portage, se trouve à
https://r-tty.blogspot.com. Un récit de la longueur d'un livre, The QRV Porting
Story, se trouve dans l'arborescence source sous doc/tex/PortingStory/.
QRV a été développé en étroite collaboration avec Claude Code, l'outil de codage agentique d'Anthropic — une grande partie du portage, du débogage SMP et de la documentation (y compris ce README) a été réalisée dans le cadre d'un effort de programmation en binôme humain-IA, aux côtés de l'auteur.
obtain_proj.sh et l'arborescence os/TM_PRIVdevb-nvme et fs-qrvQNX est un système d'exploitation temps réel à micro-noyau dont l'idée fondatrice est le passage de messages synchrone. Dans QNX, le noyau lui-même est minuscule — il sait comment ordonnancer les threads, passer des messages, délivrer des signaux, gérer les temporisateurs et les interruptions, et très peu d'autres choses. Tout ce qu'un système d'exploitation monolithique mettrait à l'intérieur du noyau — le gestionnaire de processus, le gestionnaire de mémoire, le système de fichiers, les pilotes de périphériques, la pile réseau — s'exécute dans des processus utilisateur ordinaires appelés gestionnaires de ressources, et ils communiquent entre eux et avec leurs clients via la même primitive IPC envoyer / recevoir / répondre.
Cette architecture est ce qui rend QNX élégant, et c'est exactement ce que QRV préserve. Un programme qui veut ouvrir un fichier envoie un message ; le serveur de système de fichiers le reçoit, fait le travail et répond. Le noyau ne fait que négocier le rendez-vous. Le résultat est un système où un pilote peut planter et être redémarré sans faire tomber le noyau, où la base de confiance de calcul est mesurée en dizaines de kilo-octets, et où la frontière entre « noyau » et « application » est un message, pas un mur de privilèges rempli d'appels système.
QRV prend les sources communautaires de QNX Neutrino 6.4 de l'ère 2009 et fait évoluer cette conception :
int/uint32_t/pid_t-sur-pointeur
dont le code 32 bits est truffé.qemu-system-riscv64 (la machine
virt) et la carte de développement SiFive Unmatched (FU740). x86-64 est
maintenue en compilation comme vérification de portabilité.mkifs (QRV utilise
le format standard CPIO à la place) ; il n'y a pas de séparation startup/noyau
(startup est lié directement avec le noyau) ; il n'y a pas
de callouts et pas de mini-pilotes.Kconfig de style Linux, une
édition de liens incrémentale du noyau (les modules sont ajoutés et testés un par un, pas jetés au
lieur comme un monolithe 32→64), et une chaîne d'outils de compilation croisée
(riscv64-linux-gnu-gcc).procnto est taskman (le
gestionnaire de tâches) partout ; toutes les références à « Neutrino » sont supprimées.QRV n'implémente pas fork() (les programmes démarrent via posix_spawn()),
et il n'y a pas de pagination à la demande et pas de swap — les mêmes choix que QNX
a faits dans sa génération 8.0.
QRV est régi par deux licences à la fois, et comprendre laquelle est laquelle est essentiel avant de construire ou de redistribuer quoi que ce soit.
Le code propre de QRV est sous licence Apache 2.0. Tout ce qui est écrit à partir de zéro
pour ce projet — le portage RISC-V, le nouveau système de construction, la séparation de taskman en espace utilisateur,
la refonte du noyau sans verrou, les pilotes et les outils que nous avons
créés — est sous Apache 2.0. Le texte complet se trouve dans LICENSE.txt.
Le code dérivé de QNX est sous BlackBerry QNX Community License (QCL) 2.0. Les parties de QRV qui descendent des sources communautaires de QNX Neutrino de 2009 restent sous la QCL, qui permet l'utilisation non commerciale et académique des sources dérivées. QRV ne peut pas, et ne peut pas, re-licencier le code de QNX.
Cette réalité de double licence est précisément la raison pour laquelle ce dépôt ne contient pas d'arborescence source prête à construire. Nous n'avons pas la permission de redistribuer les sources dérivées de QNX. Ainsi, au lieu de distribuer le code, ce dépôt fournit une recette (voir la section suivante) : une carte de l'endroit où chaque fichier QNX va, plus les correctifs QRV qui le transforment. Vous obtenez les sources communautaires QNX amont vous-même, depuis leur miroir public, et la recette reconstruit l'arbre QRV sur votre machine. Votre copie est la vôtre ; nous redistribuons uniquement nos propres correctifs et métadonnées sous licence Apache.
QRV intègre également du code sous d'autres licences permissives — par exemple
des composants sous licence BSD adoptés depuis FreeBSD (remplaçant des modules QNX vieillissants),
un pilote de bloc virtio sous licence MIT d'ascendance xv6, et le shell Korn
MirBSD (mksh) comme shell système. WHAT_IS_WHAT.md est la référence
composant par composant de ce qui est sous quelle licence et d'où cela
vient — consultez-le chaque fois que vous avez un doute sur un fichier ou un sous-système
particulier.