NoWayOS
PT
GitHub
MenuFechar

Plataforma

Construído a partir da tarefa.

Você escreve a sua aplicação em Rust. O NoWayOS a compila, só com os drivers que ela usa, sobre o microkernel seL4. A imagem resultante contém isso, e mais nada.

Da aplicação à imagem

Um dispositivo NoWayOS é construído, não configurado. Quatro passos levam o seu código a um dispositivo que cumpre a sua única tarefa, e cada passo deixa algo que você pode verificar.

  1. Escreva a aplicação

    Em Rust, como um ou mais domínios de proteção. Construa as telas com o pequeno núcleo de UI declarativo do NoWayOS, ou crie-as em React e converta-as em tempo de build com o Screen Compiler.

  2. Descreva o sistema

    Uma descrição de sistema do Microkit declara cada domínio de proteção, região de memória, canal e interrupção. Ao lado dela, um arquivo de concessões lista tudo o que o sistema concede, e um arquivo expect lista o que ele precisa imprimir quando roda.

    systems/hello.system   systems/hello.grants   systems/hello.expect
  3. Faça o build

    No contêiner de desenvolvimento. O build confere as concessões com a descrição e então grava a imagem com a sua lista de materiais de software e um registro da sua configuração do seL4.

    make image SYSTEM=hello
  4. Inicialize, e deixe que ele se verifique

    Primeiro no QEMU: o sistema inicializa em modo headless e precisa imprimir, em ordem, cada linha que o seu arquivo expect lista, e nada do que o arquivo proíbe. Depois no Raspberry Pi 5, conferido com o mesmo arquivo.

    make qemu-test SYSTEM=hello

Compartimentos estanques

Cada parte de um sistema NoWayOS (a tela, a entrada, a rede, a sua aplicação) roda num domínio de proteção próprio sobre o microkernel seL4. Um domínio de proteção tem a sua própria memória e detém apenas as capacidades que a descrição do sistema lhe concede: uma capacidade funciona como um cartão de acesso para uma única porta. O seL4 as impõe, então uma parte só alcança o que recebeu, e tudo é projetado para que um bug numa parte fique nessa parte.

  • Um supervisor recebe as falhas das outras partes, para a parte que falhou e reinicia o sistema do zero. Quando as falhas não param de chegar, o dispositivo entra num estado de falha segura, e só uma inicialização a frio o traz de volta.
  • Um domínio de proteção watchdog alimenta o watchdog de hardware só enquanto todas as outras partes respondem ao seu sinal de vida.
  • Papéis limitam o que cada parte pode receber: o build recusa uma concessão que o papel de uma parte nunca deve ter, como um dispositivo para uma parte que só deveria desenhar.

Mensagens tipadas, copiadas antes de ser verificadas

Os domínios de proteção se comunicam por registros de tamanho fixo e versionados, com layout explícito, passados em anéis de produtor único sobre memória compartilhada. Cada registro é copiado para fora da memória compartilhada antes de ser verificado, então o remetente não consegue alterá-lo entre a verificação e o uso.

Todo parser de entrada externa passa por fuzzing e é construído para nunca entrar em pânico, e todo decodificador de mensagens tem provas limitadas, feitas com o verificador de modelos Kani.

Uma tela nativa, e nenhum navegador

A interface de usuário é um pequeno núcleo declarativo: layout, foco e hit-testing em memória limitada, desenhados com a biblioteca Rust embedded-graphics, redesenhando só o que mudou. O texto vem de atlas de glifos desenhados com antecedência, em tempo de build, então o dispositivo nunca interpreta um arquivo de fonte. As aplicações recebem eventos de tecla, ponteiro e toque, nunca USB ou qualquer outro protocolo de dispositivo.

Os designers podem continuar trabalhando em React. O Screen Compiler converte em Rust, em tempo de build, as telas escritas dentro do subconjunto que ele suporta, e recusa qualquer coisa fora desse subconjunto em vez de aproximá-la.

O que vem dentro

Área O que o NoWayOS oferece
Runtime Padrões de domínio de proteção sobre o Microkit e o rust-sel4; um supervisor que para uma parte com falha e reinicia o sistema do zero, com um estado de falha segura após falhas repetidas; um watchdog
Mensagens Registros tipados com layout de transmissão explícito, e anéis de produtor único sobre memória compartilhada
Drivers Tela (o ramfb do QEMU, o framebuffer do Raspberry Pi 5); entrada (virtio, teclados, mouses e mesas digitalizadoras USB); rede (virtio-net, a Ethernet do Pi 5); host USB (xHCI); UART; temporizadores; a ventoinha do Pi 5
Rede Uma pilha IP sobre o smoltcp com DHCP e TCP, que se conecta só aos destinos que o sistema permite; um cliente TLS 1.3 sobre rustls e RustCrypto
Tempo e confiança Tempo monotônico e tempo de relógio de parede como tipos que nunca se misturam; verificação de assinaturas ECDSA P-256; os registros de atualizações assinadas; sementes de uma fonte de aleatoriedade em hardware com testes de integridade
Interface de usuário Um núcleo de UI declarativo e limitado, com layout, foco e hit-testing; um renderizador sobre embedded-graphics; atlas de glifos e ícones desenhados com antecedência
Ferramentas O contêiner de desenvolvimento; fragmentos de make com que os repositórios de produto fazem o build; as verificações de concessões, de unsafe, de licenças e de segredos; ferramentas de SBOM e de evidências de release; executores para QEMU e Raspberry Pi

Hardware

Onde Seu papel
QEMU (AArch64) Todo sistema inicializa aqui primeiro, dentro do contêiner de desenvolvimento, e verifica a própria saída
Raspberry Pi 5 A placa de referência de baixo custo que qualquer pessoa pode comprar. A interface de usuário, a entrada USB, os temporizadores e o watchdog já rodam nela hoje
NXP i.MX8 O hardware de produção pretendido, com uma raiz de confiança em hardware. Ainda não suportado

O NoWayOS é desenvolvido em máquinas Apple silicon (arm64). Em x86-64, os pacotes da imagem de desenvolvimento também são fixados e revisados, mas a imagem ainda não foi compilada e testada de ponta a ponta nessa arquitetura.

Construído sobre

O NoWayOS se apoia no trabalho de outras pessoas, e diz isso: seL4, Microkit, rust-sel4, as filas de rede do seL4 Device Driver Framework, smoltcp, rustls, RustCrypto e embedded-graphics.