HN expone: Banan-OS, un sistema operativo tipo Unix escrito desde cero
(github.com/Bananymous)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 sonBANAN(bootloader personalizado) yGRUB. -
Para ejecutar con UEFI, configura la variable de entorno
BANAN_UEFI_BOOT=1. También debes configurarOVMF_PATHal 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_afpathen.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.
- 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.
- 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
Comentarios de Hacker News
cat doom1.wadPlatanOScomo nombre alternativo para un fork