1 puntos por GN⁺ 2025-04-26 | 1 comentarios | Compartir por WhatsApp
  • TacOS es un OS hobby tipo UNIX basado en un kernel propio escrito desde cero en C y ensamblador, y puede ejecutar DOOM y varios programas pequeños de espacio de usuario
  • El kernel incluye VFS, scheduler, TempFS, dispositivos, cambio de contexto, gestión de memoria virtual, asignación de marcos de página físicos y un port de Doom
  • El entorno de ejecución es compatible tanto con hardware real como con el emulador Qemu, y el hardware real fue probado en la laptop del creador
  • La compilación y ejecución comienzan con git clone seguido de make run, y requieren tener instalados Xorriso, Qemu, NASM y Clang
  • TacOS no está terminado para uso real; es un toy OS de hobby con varios bugs conocidos

Resumen de TacOS

  • TacOS es un OS creado desde cero en C y ensamblador, con su propio kernel
  • Está compuesto como un kernel tipo UNIX y puede ejecutar DOOM y varios programas de espacio de usuario pequeños
  • Sus componentes principales son los siguientes
    • VFS
    • scheduler
    • TempFS
    • dispositivos
    • cambio de contexto
    • gestión de memoria virtual
    • asignación de marcos de página físicos
    • port de Doom

Entorno de ejecución y limitaciones

  • TacOS puede ejecutarse en hardware real y en el emulador Qemu
  • Las pruebas en hardware real se realizaron en la laptop del creador
  • El proyecto no es un OS completo listo para uso real, sino un toy OS de hobby
  • Tiene varios bugs conocidos

Inicio rápido

  • La compilación y ejecución pueden hacerse con el siguiente comando
git clone https://github.com/UnmappedStack/TacOS
cd TacOS && make run
  • make run compila TacOS y lo ejecuta automáticamente en el emulador Qemu
  • Las herramientas necesarias son las siguientes
    • Xorriso
    • Qemu
    • NASM
    • Clang

Comandos de compilación

  • make run: compila TacOS y lo ejecuta en Qemu
  • make qemu: ejecuta en Qemu un TacOS ya compilado
  • make disk: compila la imagen completa de disco como tacos.iso
  • make kernel: compila el kernel de TacOS, que es el núcleo del sistema
  • make libc: compila la biblioteca estándar
  • make userspace: compila las aplicaciones de espacio de usuario
  • make initrd: crea el disco RAM inicial desde el que arranca el sistema
  • make lint: ejecuta las reglas del linter para el kernel
  • make qemu-gdb: ejecuta TacOS en Qemu con GDB conectado

Depuración

  • Para adjuntar GDB mientras pruebas TacOS, ejecuta make qemu-gdb y luego conéctate al target remoto de GDB desde otra terminal
$ gdb -q
(gdb) target remote :1234
(gdb) file kernel/bin/tacos
(gdb) continue
  • Al depurar el kernel, especifica kernel/bin/tacos
  • Al depurar programas de espacio de usuario, especifica initrd/usr/bin/<program>

Licencia y reglas de contribución

  • TacOS usa la Mozilla Public License 2.0
  • Las contribuciones están abiertas, pero antes de enviar un pull request debes abrir un issue y recibir la asignación del cambio
  • Los pull requests que solo contengan correcciones simples de typos o gramática no se fusionarán
  • Los mensajes de commit deben seguir el formato [component] change
  • Los pull requests que incluyan miles de líneas de cambios en varios componentes no relacionados dentro de un solo commit gigante no serán revisados

Comunidad

  • Hay un servidor de Discord para actualizaciones relacionadas con TacOS, ayuda con proyectos OSDev y conversación

1 comentarios

 
GN⁺ 2025-04-26
Comentarios de Hacker News
  • ¡Felicidades! Seguro te da orgullo, y también está bueno que hayas elegido DOOM como prueba de concepto.
    Quizá sea un poco aguafiestas que solo haga preguntas de principiante, pero me da curiosidad saber qué pasos harían falta para ejecutarlo en una laptop.
    Después de compilarlo, ¿hay un proceso parecido a configurar arranque dual en una PC con Windows? Me da un poco de risa estar preguntándole a un desconocido de internet cómo ejecutar software peligroso en mi computadora.
    También me gustaría saber qué libros de texto o lecturas recomendarías si alguien quisiera probar un proyecto así. En la universidad tomé sistemas operativos y materias relacionadas, pero como estudié ingeniería eléctrica/electrónica, todo fue muy abstracto y centrado en conceptos. Me gustaría tener materiales más concretos, y no tiene que ser necesariamente x64.

    • ¡Para nada es aguafiestas! La forma en que lo ejecuté en mi laptop fue literalmente formatear un USB con la ISO y arrancar desde el USB.
      Si quieres escribir un kernel, primero te recomiendo ver https://osdev.wiki, y también deberías leer especificaciones relevantes como el Intel Developer Manual y las especificaciones de los drivers que vayas a escribir tú mismo.
      No sé mucho sobre desarrollo de kernels que no sean x86, pero hasta donde sé la mayoría de los conceptos son iguales y solo cambia la implementación técnica. En el README del proyecto hay un enlace al servidor de Discord, donde hay gente realmente muy inteligente que con gusto te ayudará.
    • Yo también escribí un kernel, aunque todavía no está terminado, y documenté todos los pasos que seguí. Mucha gente dijo que le resultó útil: https://0xc0ffee.netlify.app/osdev
  • Está bueno, pero ¿tu taco también puede ejecutar DOOM?
    Fuera de broma, es un esfuerzo realmente digno de elogio; ¡bien hecho! Lo que me da curiosidad es si, al crear TacOS, tomaste DOOM como un objetivo estándar, o si desde el principio la meta era crear un sistema operativo dedicado solo a ejecutar DOOM.
    Lo pregunto por pura curiosidad. Hace casi 30 años hice un sistema operativo extremadamente básico que apenas arrancaba, para aprender y divertirme, y si existiera un sistema operativo dedicado, portable a cualquier lado, que en la práctica solo pudiera ejecutar DOOM, el meme de “¿corre DOOM?” sería mucho más irónico y divertido.
    Excelente trabajo; espero que sigas.

    • No es que solo pueda ejecutar Doom; simplemente fue el hito más reciente que porté.
      Hacer correr Doom en sí tomó alrededor de una semana, incluyendo agregar requisitos de libc, y hubo mucho más trabajo de base preparado antes de eso.
      Usé DoomGeneric, que básicamente es un fork de Doom hecho para ser muy portable. Espero que eso responda tu pregunta; también puede ser que la haya entendido mal.
  • Pasar desde un kernel hecho desde cero directamente hasta DOOM es como una certificación de hacker de primer nivel. Verlo correr en hardware real debe dar mucha satisfacción, y es muy genial.

    • Que corra en hardware real da bastante satisfacción. El kernel no entra exactamente directo a Doom; arranca en una shell y desde ahí puedes ejecutar Doom.
  • Un poco tangencial, pero me he preguntado algo parecido. Me da curiosidad si ha habido muchos intentos de crear juegos que arranquen directamente en hardware de PC moderno.
    Sería una forma de entrar directamente al juego sin cargar todo un sistema operativo, parecido a las consolas de videojuegos de generaciones anteriores. Para mantenerlo simple, cosas como Wi-Fi, Bluetooth y GPU serían difíciles de aprovechar sin drivers modernos, pero el teclado y el mouse parecen bastante viables porque existe algo como acceso básico vía BIOS. Quizá estoy usando mal los términos, pero espero que se entienda la idea.

    • No sé si se ha usado mucho, pero es una técnica conocida y funciona. Hice algo así en experimentos tempranos con ensamblador x86-16, aunque al final terminé usando DOS como lanzador de programas para poder usar dosbox-staging, un emulador más fácil de usar que qemu.
      Si no quieres meterte con E/S de disco, la gran limitación es que debe ser de 512 bytes o menos. Básicamente estás ejecutando el programa como registro maestro de arranque. Si necesitas más espacio, tienes que leer algunos LBA desde el disco; hay interrupciones para eso, y en osdev también hay mejor material.
      Fuera de eso, la diferencia entre un archivo .com, normalmente con la restricción de un único segmento de 64 KB, y un programa arrancable estilo MBR es bastante pequeña.
  • Es un trabajo realmente impresionante. Ojalá yo tuviera la habilidad para hacer algo así, pero para lograrlo seguro tuviste que leer muchas especificaciones, y esa es mi parte más débil.
    Quizá sea una pregunta tonta, pero si uno quisiera usar aceleración por GPU aunque fuera en una forma muy pequeña, me pregunto qué tan difícil sería crear un driver de GPU. ¿Dirías que la documentación al respecto es buena?

    • Eso probablemente sea el extremo más difícil del desarrollo de sistemas operativos, y al menos si se trata de un driver para una GPU que realmente puedas comprar, es muy probable que yo tampoco pueda hacerlo.
      La GPU emulada de Qemu tiene documentación bastante decente, así que podría ser posible, pero cosas como las GPU de Nvidia están mal documentadas y hasta hace poco la documentación era completamente privada. Linux también sufre con este problema, y he visto a algunos desarrolladores de sistemas operativos hobby terminar usando los drivers de GPU de Linux.
      No hay muchas cosas que marque como casi imposibles, pero sinceramente no creo que algún día pueda escribir un driver de GPU realmente bueno para una GPU común.
  • Hola unmapped, en GitHub y Discord uso ThatOSDeveloper, y ese es mi nombre visible. No sabía que habías hecho correr Doom en TacOS; está bastante genial.
    Tengo algunas dudas. Me pregunto si es el Doom original, si está en disco o en initramfs, y si usas Freedoom con el motor que estás usando o el WAD shareware de Doom.

    • Como puedes ver en el artículo, es doomgeneric, y como puedes ver en la parte superior de esta página, las modificaciones son bastante pocas.
    • Uso DoomGeneric, un fork portable de Doom. Está sobre TempFS cargado desde initrd, y uso doom1.wad.
  • Está muy bueno, pero hoy en día existen lenguajes de bajo nivel con seguridad de memoria, así que me da curiosidad por qué elegiste un lenguaje inseguro. Ya todos sabemos que la mayoría de los bugs de seguridad están relacionados con la memoria.
    Entiendo que es un proyecto hobby, pero no entiendo por qué no retiramos los lenguajes inseguros cuando existen alternativas mejores.

    • Principalmente porque C es mucho más simple, y en el desarrollo de kernels la simplicidad lo es todo.
      He usado Rust en otros proyectos, pero en desarrollo de kernels siento que prefiero mucho más un lenguaje simple y fácil de leer que un lenguaje seguro.
  • ¡Bienvenido al club! Hice casi lo mismo, y disfruté mucho la tranquilidad de construir algo que jamás iba a convertirse en un producto.
    https://jakobbr.eu/2024/08/19/writing-my-own-x86_64-operatin...

  • ¡Proyecto realmente genial! Me da curiosidad cómo maneja TacOS el aislamiento de procesos y la planificación.

    • Para la memoria virtual uso paginación, de modo que cada proceso tenga su propio espacio de direcciones.
      Hay un planificador round-robin conectado al driver PIT, así que cada 10 ms el PIT genera una interrupción y se ejecuta el planificador. El planificador elige la siguiente tarea, guarda el estado actual de la tarea anterior, cambia al nuevo espacio de direcciones, cambia la pila, restaura los registros de la tarea y luego, con la instrucción iretq, cambia a modo usuario ring 3 y salta al puntero de instrucción.
  • Quiero saber más sobre TacOS. ¿Cómo gestiona ejecutar varios programas al mismo tiempo de forma segura?