HN apresenta: Banan-OS, um sistema operacional semelhante ao Unix escrito do zero
(github.com/Bananymous)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ãoBANAN(bootloader personalizado) eGRUB. -
Para executar em UEFI, defina a variável de ambiente
BANAN_UEFI_BOOT=1. Também é necessário definirOVMF_PATHpara 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_aofpathno.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.
- 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.
- 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
Comentários do Hacker News
cat doom1.wad