2 puntos por GN⁺ 2024-12-06 | 1 comentarios | Compartir por WhatsApp

banan-os

Este proyecto es un sistema operativo de hobby escrito en C++ y compatible con las arquitecturas x86_64 e i686. Ofrece una experiencia de aprendizaje única en comparación con otros productos o proyectos de código abierto existentes.

Funciones

  • General

    • Espacio de usuario Ring3
    • SMP (multiprocesamiento)
    • Framebuffer lineal (VESA y GOP)
    • Pila de red
    • Carga de ejecutables ELF
    • Intérprete AML (parcial)
    • Entorno gráfico básico
      • Emulador de terminal
      • Barra de estado
      • Lanzador de programas
      • Algunas apps útiles
    • Enlace dinámico ELF
    • Memoria copy-on-write
      • Mapeo de archivos
      • Mapeo anónimo
  • Controladores

    • Discos NVMe
    • Discos ATA (IDE, SATA)
    • NIC E1000 y E1000E
    • NIC RTL8111/8168/8211/8411
    • Teclado PS2 (todos los conjuntos de códigos de escaneo)
    • Mouse PS2
    • USB
      • Teclado
      • Mouse
      • Almacenamiento masivo
      • Hub
    • Dispositivos virtio (red, almacenamiento)
  • Red

    • ARP
    • ICMP
    • IPv4
    • UDP
    • TCP (parcial y con bugs)
    • Sockets de dominio Unix
    • SSL
  • Sistemas de archivos

    • Sistema de archivos virtual
    • Ext2
    • FAT12/16/32
    • Dev
    • Ram
    • Proc
    • Sys
    • 9P
  • Compatibilidad con bootloaders

    • GRUB
    • Bootloader BIOS personalizado
    • Bootloader UEFI personalizado

Estructura del código

Cada componente principal y biblioteca tiene su propio subdirectorio. Cada directorio incluye un directorio include que contiene todos los archivos de encabezado de ese componente. Todos los encabezados se incluyen mediante rutas absolutas.

Compilación

Paquetes necesarios

  • apt (probado en 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

Compilar

  • Para compilar la toolchain de este sistema operativo, puedes ejecutar el siguiente comando. Este paso solo se hace una vez y puede tardar bastante.

    • ./bos toolchain
  • Para compilar el sistema operativo en sí, puedes ejecutar uno de los siguientes comandos. Se requieren permisos de root para crear/modificar la imagen de disco.

    • ./bos qemu
    • ./bos qemu-nographic
    • ./bos qemu-debug
    • ./bos bochs
  • También puedes compilar el kernel o la imagen de disco sin ejecutarlos.

    • ./bos kernel
    • ./bos image
  • Para compilar para otra arquitectura, configura la variable de entorno BANAN_ARCH=_arch_ (por ejemplo, BANAN_ARCH=i686).

  • Para cambiar el bootloader, configura la variable de entorno BANAN_BOOTLOADER. Los valores compatibles son BANAN (bootloader personalizado) y GRUB.

  • Para ejecutar con UEFI, configura la variable de entorno BANAN_UEFI_BOOT=1. También debes configurar OVMF_PATH al OVMF correcto (valor predeterminado /usr/share/ovmf/x64/OVMF.fd).

  • Si la imagen de disco se dañó o quieres crear una nueva, puedes eliminar manualmente _build/banan-os.img_ o ejecutar el siguiente comando.

    • ./bos image-full
  • También se genera un script de autocompletado para zsh. Puedes copiar el archivo _script/shell-completion/zsh/_bos_ a /usr/share/zsh/site-functions/ o agregar _script/shell-completion/zsh_ a fpath en .zshrc.

Contribución

  • Como el upstream está alojado en un servidor personal, fusionar contribuciones no es tan simple como en GitHub. Si envías un PR en GitHub, se puede descargar el diff y aplicarlo manualmente. Si quieres, se te puede proporcionar una cuenta en el servidor git personal. En ese caso, ponte en contacto por correo electrónico o Discord.

  • Como esto es principalmente una experiencia de aprendizaje, se agradece que primero te pongas en contacto por correo, Discord, issues, etc., antes de agregar nuevas funciones. Si envías un PR sin consultar sobre algo que ya estaba planeando hacer, es muy probable que cierre el PR. Las correcciones de errores siempre son bienvenidas.

  • Los mensajes de commit deben tener el siguiente formato.

    1. La primera línea debe seguir el formato " Subject: Description ", donde Subject indica el área afectada (Kernel, Shell, BuildSystem, etc.) y Description debe ser una explicación breve del cambio. La primera línea debe tener 72 caracteres o menos.
    2. El cuerpo del mensaje debe explicar en detalle qué cambió y por qué.
  • Todos los commits deben pasar los hooks de pre-commit definidos en .pre-commit-config.yaml. Para instrucciones sobre cómo configurar pre-commit, consulta pre-commit.com.

1 comentarios

 
GN⁺ 2024-12-06
Comentarios de Hacker News
  • Elogia que haya implementado el controlador USB desde cero. Menciona que rompió el sistema al escribir cat doom1.wad
  • Le gusta el nombre del proyecto. Pregunta cuál fue la parte más difícil de implementar y si hubo algún obstáculo serio
  • Menciona que falta la frase que tradicionalmente se incluye en los anuncios de nuevos kernels de SO
  • Cree que el proyecto es muy genial. Pregunta cuántas horas por semana le dedica a este proyecto y si el perfil de estudiante significa que es universitario. De ser así, le da curiosidad saber si trabajó en el SO como parte de sus estudios
  • Le da curiosidad cómo avanza el proceso de desarrollo. Pregunta si lo ejecuta en una VM o en hardware real. También pregunta qué aprendió durante el desarrollo y cómo lleva el registro del proceso
  • Reconoce que debió requerir mucho trabajo. Le interesa saber cuál fue el desafío más destacado
  • Cree que es un proyecto con un conjunto de funciones inesperado. Pregunta si planea portar más software
  • Cree que el proyecto está genial. Propone PlatanOS como nombre alternativo para un fork
  • Le parece un logro muy impresionante y también le gusta el nombre del proyecto
  • Lo felicita por ser un proyecto paralelo genial. Pide consejos sobre puntos de partida o recursos para quienes quieran intentar un proyecto similar