Por que estou construindo um micronúcleo baseado em capacidades do zero
Os sistemas operacionais estão entre os programas mais complexos já construídos. Eles gerenciam memória, escalonam computação, controlam hardware e impõem os limites de segurança que protegem cada aplicação em execução em uma máquina.
Ainda assim, muitos dos sistemas operacionais dos quais dependemos hoje foram construídos sobre ideias arquitetônicas que remontam a várias décadas. Embora esses sistemas sejam extraordinariamente poderosos e bem testados, eles também carregam décadas de complexidade acumulada.
Este projeto explora uma direção diferente: construir um sistema operacional moderno de micronúcleo baseado em capacidades do zero, com forte foco em autoridade explícita, base de computação confiável (TCB) mínima e separação estrita entre núcleo e espaço de usuário.
Este sistema operacional se chama EriX.
Por que construir outro sistema operacional?⌗
À primeira vista, construir um novo sistema operacional parece desnecessário. Sistemas maduros como Linux, Windows e BSD já existem e alimentam bilhões de dispositivos.
No entanto, esses sistemas evoluíram sob restrições históricas. Com o tempo, acumularam camadas de abstrações, mecanismos de compatibilidade e interfaces legadas. Embora esses recursos sejam frequentemente necessários em software do mundo real, eles também dificultam experimentar ideias arquitetônicas fundamentalmente diferentes.
Sistemas operacionais de pesquisa há muito tempo exploram abordagens alternativas para o projeto de sistemas operacionais. Micronúcleos, sistemas de capacidades e núcleos formalmente verificados demonstraram que é possível construir sistemas menores, mais seguros e mais fáceis de raciocinar.
O objetivo do EriX não é substituir os sistemas operacionais existentes. Em vez disso, é uma exploração de como um sistema operacional moderno poderia ser projetado se começarmos de primeiros princípios.
Micronúcleos e a base de computação confiável⌗
Uma das ideias centrais por trás do EriX é a arquitetura de micronúcleo.
Kernels monolíticos tradicionais incluem muitos serviços diretamente dentro do próprio núcleo. Isso frequentemente inclui:
- controladores de dispositivos
- sistemas de arquivos
- pilhas de rede
- subsistemas de gerenciamento de processos
Embora essa abordagem possa ser eficiente, ela também aumenta o tamanho da base de computação confiável (TCB). A TCB inclui cada parte de código que precisa se comportar corretamente para que o sistema permaneça seguro e confiável.
Micronúcleos adotam uma abordagem diferente.
Um micronúcleo mantém dentro do núcleo apenas os mecanismos mais fundamentais, tipicamente incluindo:
- escalonamento de threads de execução
- gerenciamento de espaço de endereçamento
- comunicação entre processos (IPC)
- gerenciamento de capacidades
- tratamento de interrupções e exceções
Todo o resto roda em espaço de usuário, incluindo controladores, sistemas de arquivos e serviços de nível mais alto.
Esse projeto reduz drasticamente a quantidade de código em que é necessário confiar. Falhas em componentes de espaço de usuário têm menor probabilidade de comprometer todo o sistema, e componentes individuais podem ser reiniciados ou substituídos sem derrubar o núcleo.
Segurança baseada em capacidades⌗
Outro princípio central de projeto do EriX é a segurança baseada em capacidades.
A maioria dos sistemas operacionais depende fortemente de autoridade ambiente. Nesses sistemas, processos frequentemente têm acesso implícito a recursos com base em espaços de nomes globais, identidades de usuário ou privilégios herdados.
Por exemplo, um processo pode abrir um arquivo simplesmente porque conhece o caminho do arquivo e o sistema operacional decide que o processo tem permissão para acessá-lo.
Sistemas de capacidades adotam uma abordagem diferente.
Uma capacidade é um token infalsificável que concede acesso a um objeto específico com direitos específicos. Um processo só pode acessar um objeto se possuir uma capacidade que autorize esse acesso.
Capacidades têm várias propriedades importantes:
- Elas representam autoridade explicitamente.
- Elas podem ser transferidas entre processos.
- Elas podem restringir operações a um conjunto preciso de direitos.
Em um sistema baseado em capacidades, a autoridade flui por transferências explícitas em vez de espaços de nomes globais. Isso torna o sistema mais fácil de raciocinar e ajuda a eliminar classes inteiras de vulnerabilidades de segurança.
Por que Rust?⌗
Sistemas operacionais são tradicionalmente escritos em C ou assembly. Essas linguagens fornecem controle preciso sobre hardware e memória, mas também tornam fácil introduzir bugs sutis.
Bugs de segurança de memória, como uso após liberação, estouros de buffer e corridas de dados, têm sido historicamente uma das maiores fontes de vulnerabilidades em software de sistemas.
EriX é escrito principalmente em Rust.
Rust fornece fortes garantias de segurança de memória enquanto ainda permite
controle de baixo nível sobre hardware. O modelo de propriedade da linguagem
ajuda a evitar muitas classes de bugs em tempo de compilação, enquanto seus
blocos unsafe explícitos tornam operações potencialmente perigosas visíveis
e auditáveis.
Usar Rust não elimina todos os erros possíveis, mas eleva significativamente a linha de base de segurança na programação de sistemas.
Um sistema operacional de sala limpa⌗
Um aspecto incomum do projeto EriX é sua abordagem de desenvolvimento em sala limpa.
Todos os componentes do sistema são implementados dentro do próprio projeto. Nenhum código-fonte externo é copiado ou incorporado, e nenhuma biblioteca de terceiros é usada.
Essa restrição serve a vários propósitos:
- Ela garante que todo o sistema possa ser compreendido e auditado.
- Ela evita dependências ocultas e comportamentos inesperados.
- Ela força decisões arquitetônicas a serem explícitas, em vez de herdadas.
O desenvolvimento em sala limpa também transforma o projeto em um exercício educacional. Cada subsistema, do carregador de inicialização ao gerenciador de memória, precisa ser projetado e implementado deliberadamente.
Um objetivo de longo prazo: auto-hospedagem⌗
Um dos objetivos de longo prazo do EriX é a auto-hospedagem.
Um sistema é considerado auto-hospedado quando consegue compilar seu próprio código-fonte usando ferramentas que rodam no próprio sistema.
Para o EriX, isso significa que, eventualmente:
- o compilador Rust roda no EriX
- as ferramentas de compilação rodam no EriX
- todo o sistema operacional pode ser compilado nativamente dentro do EriX
Alcançar esse marco exige implementar muitas camadas de infraestrutura, incluindo sistemas de arquivos, gerenciamento de processos e um ambiente de espaço de usuário compatível com POSIX.
Por que documentar a jornada?⌗
Construir um sistema operacional é um processo longo e complexo. Muitas das percepções mais interessantes não aparecem no sistema final, mas nas decisões, compromissos e erros encontrados ao longo do caminho.
Este blog documenta o desenvolvimento do EriX à medida que ele evolui. Posts futuros abordarão tópicos como:
- projetar um formato de imagem de inicialização
- implementar espaços de capacidades
- construir um sistema de IPC
- gerenciar autoridade de memória
- construir servidores em espaço de usuário
O objetivo é tornar o processo de desenvolvimento transparente e educativo.
Olhando adiante⌗
O EriX ainda está em seus estágios iniciais. Grande parte do sistema ainda precisa ser construída, e muitas decisões de projeto certamente evoluirão ao longo do tempo.
Mas os princípios orientadores já estão claros:
- núcleo mínimo
- autoridade explícita
- segurança baseada em capacidades
- modularidade estrita
- implementação em sala limpa
No próximo post, exploraremos uma das ideias centrais por trás do sistema:
o que são sistemas operacionais baseados em capacidades e por que eles importam.