
Sistema Operacional QRV
QRV é uma adaptação e reimplementação completa do sistema operacional QNX Neutrino
6.4 para hardware moderno de 64 bits, com RISC-V (rv64g)
como arquitetura primária e x86-64 como alvo secundário. O
projeto começou na véspera de Natal de 2020. O nome QRV evita deliberadamente
qualquer associação com a marca QNX.
QRV é um sistema operacional completo, não apenas um kernel. O microkernel é
seu coração — mas a maior parte do trabalho foi investida em tudo que o
cerca. O mais notável é o taskman, o gerenciador de processos / memória / caminhos
em modo de usuário (o procnto do QNX), que foi profundamente reformulado e
retirado do kernel para o espaço do usuário; junto com ele, a biblioteca C, os drivers
de dispositivo, o sistema de arquivos, o carregador dinâmico e os servidores do
sistema foram todos portados, adaptados para 64 bits e, em muitos lugares, substancialmente
reescritos. O microkernel é pequeno por design; o sistema operacional ao redor
dele é onde a maior parte do QRV reside.
Isto não é um fork que meramente compila código antigo em um novo compilador. É um
port cuidadoso, módulo por módulo, para um modelo verdadeiro LP64, com a
fronteira proprietária do procnto desmontada, a maquinaria IFS/startup
substituída e — a partir das versões mais recentes — a trava Big Kernel Lock
do kernel completamente removida e o gerenciador de processos/memória/caminhos movido
para fora do kernel para um servidor em modo de usuário.
Este README descreve o QRV v0.43.
O blog de desenvolvimento, com a história completa do port, está em
https://r-tty.blogspot.com. Uma narrativa em formato de livro, The QRV Porting
Story, reside na árvore de fontes em doc/tex/PortingStory/.
O QRV foi desenvolvido em estreita colaboração com o Claude Code, a ferramenta de codificação agente da Anthropic — grande parte do port, da depuração SMP e da documentação (incluindo este README) foi realizada como um esforço de programação em parceria humano–IA, trabalhando junto com o autor.
obtain_proj.sh e a árvore os/TM_PRIVdevb-nvme e fs-qrvQNX é um sistema operacional de tempo real microkernel cuja ideia definidora é a passagem síncrona de mensagens. No QNX, o próprio kernel é minúsculo — ele sabe como agendar threads, passar mensagens, entregar sinais, lidar com temporizadores e interrupções, e pouco mais. Tudo que um SO monolítico colocaria dentro do kernel — o gerenciador de processos, o gerenciador de memória, o sistema de arquivos, os drivers de dispositivo, a pilha de rede — é executado em processos comuns de usuário chamados gerenciadores de recursos, e eles se comunicam entre si e com seus clientes através da mesma primitiva IPC enviar / receber / responder.
Essa arquitetura é o que torna o QNX elegante, e é exatamente o que o QRV preserva. Um programa que deseja abrir um arquivo envia uma mensagem; o servidor de sistema de arquivos a recebe, realiza o trabalho e responde. O kernel apenas intermedia o encontro. O resultado é um sistema onde um driver pode falhar e ser reiniciado sem derrubar o kernel, onde a base de computação confiável é medida em dezenas de kilobytes, e onde a fronteira entre "kernel" e "aplicação" é uma mensagem, não uma muralha de privilégios cheia de chamadas de sistema.
O QRV pega as fontes comunitárias do QNX Neutrino 6.4 da era 2009 e traz esse design adiante:
int/uint32_t/pid_t em ponteiros
que o código de 32 bits está repleto.qemu-system-riscv64 (a máquina
virt) e a placa de desenvolvimento SiFive Unmatched (FU740). x86-64 é
mantida em compilação como verificação de portabilidade.mkifs (QRV usa
o formato padrão CPIO); não há separação startup/kernel
(startup é vinculado diretamente com o kernel); não
há callouts e nem mini-drivers.Kconfig estilo Linux, um
link incremental do kernel (módulos são adicionados e testados um de cada vez, não jogados
no linker como um monólito 32→64), e uma cadeia de ferramentas de cross-compilação
(riscv64-linux-gnu-gcc).procnto é taskman (o
Gerenciador de Tarefas) em toda parte; todas as referências a "Neutrino" são eliminadas.QRV não implementa fork() (programas iniciam via posix_spawn()),
e não possui paginagem sob demanda e nem swap — as mesmas escolhas que o QNX
fez em sua geração 8.0.
QRV é regido por duas licenças ao mesmo tempo, e entender qual é qual é essencial antes de compilar ou redistribuir qualquer coisa.
O código próprio do QRV é Apache License 2.0. Tudo escrito do zero
para este projeto — o port RISC-V, o novo sistema de compilação, a separação do taskman
em modo de usuário, a reformulação livre de trava do kernel, os drivers e ferramentas que
criamos — é Apache 2.0. O texto completo está em LICENSE.txt.
O código derivado do QNX é a BlackBerry QNX Community License (QCL) 2.0. As partes do QRV que descendem das fontes comunitárias do QNX Neutrino de 2009 permanecem sob a QCL, que permite o uso não comercial e acadêmico das fontes derivadas. QRV não pode, e não irá, relicenciar o código do QNX.
Esta realidade de licenciamento duplo é precisamente a razão pela qual este repositório não contém uma árvore de fontes pronta para compilação. Não temos permissão para redistribuir as fontes derivadas do QNX. Então, em vez de enviar o código, este repositório envia uma receita (veja a próxima seção): um mapa de onde cada arquivo QNX vai, mais os patches QRV que o transformam. Você obtém as fontes comunitárias upstream do QNX por conta própria, a partir de seu espelho público, e a receita reconstrói a árvore QRV em sua máquina. Sua cópia é sua; redistribuímos apenas nossos próprios patches e metadados licenciados sob Apache.
QRV também incorpora código sob outras licenças permissivas — por exemplo
componentes licenciados sob BSD adotados do FreeBSD (substituindo módulos QNX antigos),
um driver de bloco virtio licenciado sob MIT de ascendência xv6, e o shell Korn
MirBSD (mksh) como shell do sistema. **WHAT_IS_WHAT.md é a referência
autorizada, quebra por componente, do que está sob qual licença e de onde
veio — consulte-o sempre que estiver em dúvida sobre um arquivo ou subsistema específico.
Finalmente, o repositório contém PETITION.md: um pedido aberto
à QNX Software Systems e à BlackBerry para relicenciar as fontes históricas
do Neutrino de 2007–2009 sob uma licença permissiva aprovada pela OSI. Se você gostaria
que os fundamentos deste trabalho se tornem um dia totalmente livres, esse documento
é onde adicionar seu nome.
obtain_proj.sh e a árvore os/