2 pontos por GN⁺ 2024-12-06 | 1 comentários | Compartilhar no WhatsApp

banan-os

Este projeto é um sistema operacional de hobby escrito em C++ e oferece suporte às arquiteturas x86_64 e i686. Ele proporciona uma experiência de aprendizado única em comparação com outros produtos ou projetos open source existentes.

Funcionalidades

  • Geral

    • Espaço de usuário Ring3
    • SMP (multiprocessamento)
    • framebuffer linear (VESA e GOP)
    • pilha de rede
    • carregamento de executáveis ELF
    • interpretador AML (parcial)
    • ambiente gráfico básico
      • emulador de terminal
      • barra de status
      • iniciador de programas
      • alguns aplicativos úteis
    • ligação dinâmica ELF
    • memória copy-on-write
      • mapeamento de arquivos
      • mapeamento anônimo
  • Drivers

    • discos NVMe
    • discos ATA (IDE, SATA)
    • NICs E1000 e E1000E
    • NICs RTL8111/8168/8211/8411
    • teclado PS2 (todos os conjuntos de scancode)
    • mouse PS2
    • USB
      • teclado
      • mouse
      • armazenamento em massa
      • hub
    • dispositivos virtio (rede, armazenamento)
  • Rede

    • ARP
    • ICMP
    • IPv4
    • UDP
    • TCP (parcial e com bugs)
    • sockets de domínio Unix
    • SSL
  • Sistemas de arquivos

    • sistema de arquivos virtual
    • Ext2
    • FAT12/16/32
    • Dev
    • Ram
    • Proc
    • Sys
    • 9P
  • Suporte a bootloader

    • GRUB
    • bootloader BIOS personalizado
    • bootloader UEFI personalizado

Estrutura do código

Cada componente principal e biblioteca tem seu próprio subdiretório. Cada diretório contém um diretório include com todos os arquivos de cabeçalho daquele componente. Todos os cabeçalhos são incluídos por caminho absoluto.

Build

Pacotes necessários

  • apt (testado no Ubuntu 22.04)

    • build-essential, git, ninja-build, texinfo, bison, flex, libgmp-dev, libmpfr-dev, libmpc-dev, parted, qemu-system-x86, cpu-checker
  • pacman

    • base-devel, git, wget, cmake, ninja, parted, qemu-system-x86

Compilação

  • Para compilar a toolchain para este sistema operacional, é possível executar o comando abaixo. Essa etapa só precisa ser feita uma vez e pode demorar bastante.

    • ./bos toolchain
  • Para compilar o próprio sistema operacional, é possível executar um dos comandos abaixo. São necessários privilégios de root para criar/modificar a imagem de disco.

    • ./bos qemu
    • ./bos qemu-nographic
    • ./bos qemu-debug
    • ./bos bochs
  • Também é possível compilar o kernel ou a imagem de disco sem executá-los.

    • ./bos kernel
    • ./bos image
  • Para compilar para outra arquitetura, defina a variável de ambiente BANAN_ARCH=_arch_ (por exemplo, BANAN_ARCH=i686).

  • Para mudar o bootloader, defina a variável de ambiente BANAN_BOOTLOADER. Os valores suportados são BANAN (bootloader personalizado) e GRUB.

  • Para executar em UEFI, defina a variável de ambiente BANAN_UEFI_BOOT=1. Também é necessário definir OVMF_PATH para o OVMF correto (padrão /usr/share/ovmf/x64/OVMF.fd).

  • Se a imagem de disco estiver corrompida ou você quiser recriá-la, é possível excluir manualmente _build/banan-os.img_ ou executar o comando abaixo.

    • ./bos image-full
  • Um script de autocompletar para zsh também é gerado. É possível copiar o arquivo _script/shell-completion/zsh/_bos_ para /usr/share/zsh/site-functions/ ou adicionar _script/shell-completion/zsh_ ao fpath no .zshrc.

Contribuição

  • Como o upstream é hospedado em um servidor pessoal, mesclar contribuições não é tão simples quanto no GitHub. Se você enviar um PR no GitHub, o diff poderá ser baixado e aplicado manualmente. Se quiser, uma conta no servidor git pessoal pode ser fornecida. Nesse caso, entre em contato por e-mail ou Discord.

  • Como isso é principalmente uma experiência de aprendizado, é pedido que você entre em contato primeiro por e-mail, Discord, issue etc. antes de adicionar novas funcionalidades. Se você enviar um PR sem consultar antes sobre algo que já estava planejado, há uma grande chance de o PR ser fechado. Correções de bugs são sempre bem-vindas.

  • As mensagens de commit devem ser formatadas da seguinte forma.

    1. A primeira linha deve estar no formato " Assunto: Descrição ", em que Assunto indica a área afetada (Kernel, Shell, BuildSystem etc.) e Descrição deve ser uma explicação breve da mudança. A primeira linha deve ter no máximo 72 caracteres.
    2. O corpo da mensagem deve explicar em detalhes as mudanças e o motivo delas.
  • Todos os commits devem passar pelos hooks de pre-commit definidos em .pre-commit-config.yaml. Para instruções sobre como configurar o pre-commit, consulte pre-commit.com.

1 comentários

 
GN⁺ 2024-12-06
Comentários do Hacker News
  • Elogia a implementação do driver USB do zero. Menciona que quebrou o sistema ao digitar cat doom1.wad
  • Gostou do nome do projeto. Pergunta qual foi a parte mais difícil entre as implementadas e se houve algum obstáculo sério
  • Menciona que está faltando a frase tradicionalmente incluída em anúncios de novos kernels de OS
  • Acha o projeto muito legal. Pergunta quantas horas por semana são investidas nesse projeto e se o perfil de estudante significa universitário. Se sim, quer saber se o trabalho no OS foi feito como parte dos estudos
  • Tem curiosidade sobre como o processo de desenvolvimento acontece. Pergunta se roda em VM ou em hardware real. Também pergunta o que foi aprendido durante o desenvolvimento e como o registro do progresso é mantido
  • Reconhece que deve ter dado muito trabalho. Quer saber quais foram os desafios mais marcantes
  • Acha que é um projeto com um conjunto de recursos inesperado. Pergunta se há planos de portar mais software
  • Acha o projeto legal. Sugere "PlatanOS" como nome alternativo para um fork
  • Considera uma conquista muito impressionante e também gostou do nome do projeto
  • Parabeniza pelo ótimo projeto paralelo. Pede dicas de ponto de partida ou materiais para quem quiser tentar um projeto parecido