IR0 - Kernel - Overview

El propósito de esta "wiki", documentación web, guía, como le digas, es usarla como ayuda-memoria personal para el desarrollo del kernel. No tiene que ser una página ultra estética, pero me estoy esforzando para que no se note que la hice con html, css y js vanilla como la de algún proyecto aficionado que anda por ahí.

Un kernel de sistema operativo mínimamente funcional (todo el Kernel Space más un user space mínimo) puede andar fácilmente en las 15.000 líneas de código por lo que, como verás; es humanamente imposible memorizar y comprender todo el flujo del kernel por mí mismo. Además son muchos subsistemas complejos trabajando a bajo nivel juntos para intermediar entre hardware y software.

¿Qué es IR0?

IR0 es un kernel de sistema operativo multipropósito desarrollado desde cero para arquitectura x86-64 escrito principalmente en C y ASM (Aunque no tengo ningún problema en incluir código de otros lenguajes especializados en performance como Cpp o Rust).
Lo estoy creando para aprender más sobre sistemas operativos y poder usarlo como materia prima para otro proyecto que replica a WSL2 pero con mi propio kernel. No descarto escalarlo lo suficiente como para hacerlo usable en servidores mínimos o incluso IoT, pero entiendo que eso es al largo (larguísimo) plazo.

Repo de GtiHub
Discord community

Características Principales Implementadas

  • ✅ Kernel monolítico modular para arquitectura x86-64
  • ✅ Gestión completa de memoria virtual con paginación (MMU)
  • ✅ Sistema completo de interrupciones y excepciones (64 vectores IDT)
  • ✅ Planificador CFS (Completely Fair Scheduler) con Red-Black Tree
  • ✅ Sistema de procesos completo con fork(), exit(), waitpid()
  • ✅ 23 syscalls implementadas (desde básicas hasta gestión de memoria)
  • ✅ Filesystem MINIX completo con VFS (Virtual File System)
  • ✅ Drivers de hardware: PS/2 (teclado/mouse), ATA/IDE, Sound Blaster 16, VGA
  • ✅ Shell interactivo en Ring 3 con comandos integrados
  • ✅ LibC freestanding con printf(), malloc(), free()
  • ✅ Sistema de compilación multi-objetivo (Desktop/Server/IoT/Embedded)
  • 🔄 Pila de red TCP/IP básica (en desarrollo - usando librería IoT)
  • 🔄 Soporte para contenedores (en desarrollo)

Estado del Proyecto

Versión: v0.0.1 pre-release candidate 1
Arquitectura: x86-64 (primaria), x86-32 (experimental), ARM (en desarrollo)
Bootloader: GRUB
Licencia: GNU GPL v3.0
Tipo: Kernel Monolítico Modular
Sintaxis ASM: Intel (NASM)

Arquitectura del Sistema

Diagrama de Arquitectura del Kernel IR0

User Space (Ring 3)
Shell Interactivo
LibC (IR0)
Programas Usuario
ELF Loader
Kernel Space (Ring 0) - IR0
Interfaz del Sistema
23 Syscalls (IR0)
INT 0x80 Handler
Init System (PID 1)
Procesos y Memoria
CFS Scheduler
Virtual Memory (MMU)
Heap Allocator
Process Manager
Sistema de Archivos
VFS Layer
MINIX Filesystem
File Operations
Drivers de Hardware
PS/2 (Teclado/Mouse)
ATA/IDE Storage
Sound Blaster 16
VGA/VBE Video
Interrupciones y Timers
IDT (64 vectores)
PIC Remapping
Timer Cascade
DMA Controller
Red (En Desarrollo)
TCP/IP Básico (IoT)
Socket Interface
Ethernet Drivers
Hardware
CPU x86-64
RAM (MMU)
ATA/IDE Disks
PS/2 Devices
Sound Blaster
VGA/VBE
User Space (Ring 3) - Shell, LibC y programas de usuario
Kernel Space (Ring 0) - Núcleo IR0 monolítico modular
Hardware - Componentes físicos soportados

Arquitectura y "Filosofía" del proyecto

A diferencia de kernels como kernel NT (Híbrido) de Microsoft, Redox-OS (Microkernel), o el mismo MINIX kernel (microkernel), IR0 se basa en una arquitectura más similar a la que tiene Linux, que es monolítico.
Sin embargo, mi argumento principal es el del rendimiento. Entiendo que alguien podría venir y señalar que, como todo monolito, si un subcomponente se rompe, se cae todo el sistema (y tendría razón) pero lo que respondo a eso es que "¿De qué me sirve a mí que el kernel soporte seguir sin filesystem si no puedo hacer nada práctico sin él?", es decir, no tiene sentido que el kernel continúe funcionando sin uno de sus componentes clave corriendo.

Por eso no veo mejor alternativa (por ahora) que el patrón monolítico. Y además me ahorra el tener que interconectar subsistemas clave entre sí con IPC, lo que impacta de una en el rendimiento del Sistema Operativo. No es perfecto, pero es estable. No es del todo trazable y requiere escalar de a poco, pero si escala bien rinde mucho.

Sin embargo yo también tengo desacuerdos con la filosofía UNIX. Ellos (entre otras cosas y de forma resumidísima) consideran que si algo falla, que falle bien. Lo que en términos kernelísticos sería: Si se rompe el scheduler, Panic() directo. Si tenés corrupción en memoria (en espacio de kernel), Panic.
Y no es que lo cuestiono por que sí, simplemente pregunto (aunque sin soluciones todavía) "¿Por qué no rescatar el sistema en tiempo de Panic()?, o por lo menos hacer el intento".
Mas allá del punto filosófico y para resumir, el kernel es monolítico porque es más performante y siento que las piezas clave del núcleo deben trabajar sin overhead.
Sin embargo, si en el futuro necesitara integrar algún subsistema específico de forma híbrida, seguramente sería pragmático.

El Kernel Space es sagrado

Yo sé que hablo como si IR0 fuera usado por miles de personas y toda la historia, pero me voy a dar el lujo de opinar al respecto.
Entonces, el punto es que el kernel space tiene que ser sólo habitable por subsistemas que trabajen en ese Entorno, nada mas.
Entiendo que hayan ciertos fabricantes preocupados por la seguridad de sus clientes que, casualmente, tienen acceso a toda interrupción que el usuario haga (saben qué teclas presionás, el tiempo de tu sesión cada vez que prendés la compu, etc.) Y todo eso porque tienen software funcionando en el kernel space con todos los privilegios que eso implica.
RING 0 es únicamente para el kernel. Todo lo que venga del RING 3 se comunica con syscalls(), fin del comunicado.

Enfoque de Red: Básico pero Funcional

Para que IR0 funcione como soporte para servidores básicos y aplicaciones IoT, necesito soporte de red fundamental pero sin la complejidad masiva del stack completo de Linux.

En el Kernel Linux son mas o menos 1.500.000 de líneas de código SÓLO LA PILA DE RED COMPLETA. En lugar de intentar portar todo eso, he decidido usar un enfoque más pragmático:

Implementación básica con librería IoT:

  • Stack TCP/IP ligero y funcional
  • Soporte para conectividad básica de red
  • Interfaz de sockets simplificada
  • Drivers Ethernet esenciales
  • Enfoque minimalista que mantiene el kernel manejable
Esto me permite tener funcionalidad de red sin agregar millones de líneas de código al kernel.

Ventajas del Enfoque Básico

Este enfoque con librería IoT tiene varias ventajas:
  • Mantiene el kernel ligero y manejable
  • Reduce significativamente la complejidad del código
  • Permite funcionalidad de red sin millones de líneas adicionales
  • Es más fácil de debuggear y mantener
  • Suficiente para casos de uso básicos y IoT

Estructura de Directorios

Cómo la estructura de archivos puede cambiar constantemente, prefiero que la consultes en el Repositorio de GitHub.

Gestión de Ramas

Flujo de Trabajo con Git

Como es la primera vez que escribo un proyecto de este calibre, lo que busco es que el Workflow para el desarrollo del kernel sea lo mas limpio, predecible y escalable posible.

Para eso uso 3 ramas de git principales en el proceso: mainline, dev y feature (que aunque feature no está en el repositorio, es la que se usa como convención para integrar código nuevo). Donde sólo mainline y dev son las únicas 2 ramas upstream.

experimental es una rama divergente a dev, y feature es la rama que se crea para enviar contribuciones.
mainline
STABLE

- Rama principal con código estable y testeado.

Características

  • Solo código probado y funcional
  • Documentación completa
  • Mi base para rc's.
  • mainline es sagrada, ya que este rama tiene que compilar y bootear siempre. Es la mas estable de las dos ramas upstream.
dev
STAGING

- Rama de desarrollo activo donde se implementan y testean nuevas features.

Características:

  • Es el espejo de mainline.
  • Lo que se mergee acá no tiene por qué pasar a mainline.
  • Nuevas features en desarrollo que me convencieron de feature
  • Parches de código, refactors y optimizaciones
  • Puede contener bugs temporales que se resuelven sí o sí en esta rama.
feature
DEVELOPMENT

- La agrego porque es la rama donde se crean feats que despues pasan al upstream mergeando a dev . Es la más inestable de todas porque es donde se integra código nuevo que también debe ser testeado y revisado antes de llegar a merge.

Características:

  • Acá es donde yo empiezo a implementar nuevas funcionalidades o parches
  • Es la primera que se debuggea.
  • Es la que crearías cuando forkeás el repo.
  • Se espera que compile antes de pasar a dev.
experimental
MISC

- En esta rama, se integran features lo suficientemente inestables como para terminar en mainline pero que pueden tener potencial a futuro.

Características:

  • Es una rama de pruebas puras, no tiene nada que ver con las ramas upstream estables
  • Acá caen las features y experimentos que no llegan al mainline
  • Cosas que no se prueban en sistemas operativos o ideas nuevas
  • No es tan importante la estabilidad en esta rama
  • Si se testean lo suficiente sin romper nada, pueden o no mergear a mainline primero pasando por dev de nuevo.

Cómo es el merging desde feature hasta mainline?

Básicamente, vos creás tu mejora/optmización desde un fork del repo con una rama nueva que va a ser algo como "feature/fix-scheduler" por ejemplo.
Después, hacés PR a la rama dev del upstream (no al mainline) y se hace la revisión y el merge en dado caso.
El merge a mainline depende de cuán alineado con el proyecto considere que es la feature.
Ni siquiera algunas de mis propias implementaciones las mergearía directo al mainline por esta misma razón.

Subsistemas del Kernel IR0

Estado del Proyecto

Versión: v0.0.01 pre-release candidate 1
Arquitectura: x86-64 (primaria), x86-32 (experimental), ARM (en desarrollo)
Licencia: GNU GPL v3.0
Tipo: Kernel Monolítico Modular

🏗️ Arquitectura Central

✅ Arquitectura del Kernel

  • Diseño monolítico modular con abstracción HAL
  • Sistema de compilación multi-objetivo (Desktop/Server/IoT/Embedded)
  • Separación Ring 0 (kernel) / Ring 3 (usuario)
  • Soporte primario x86-64 con framework multi-arquitectura
  • Entorno C freestanding con libc personalizada

✅ Sistema de Arranque

  • Cumplimiento de especificación multiboot de GRUB
  • Inicialización de modo largo x86-64
  • Configuración GDT (Global Descriptor Table)
  • Configuración TSS (Task State Segment)
  • IDT (Interrupt Descriptor Table) con 64 entradas

✅ Gestión de Memoria

  • Memoria virtual con paginación (MMU)
  • Asignador de heap del kernel (simple + avanzado en desarrollo)
  • Protección de memoria (aislamiento Ring 0/3)
  • Layout de memoria: Kernel (1MB-8MB), Heap (8MB-32MB), Usuario (1GB+)
  • Manejo de fallos de página con lectura de dirección CR2

⚙️ Gestión de Procesos

✅ Sistema de Procesos

  • Gestión completa del ciclo de vida de procesos
  • Estados de proceso: READY, RUNNING, BLOCKED, ZOMBIE
  • Asignación de PID comenzando desde PID 1
  • Creación de procesos con syscall fork()
  • Terminación de procesos con syscall exit()
  • Relaciones padre-hijo con waitpid()

✅ Planificador

  • Implementación CFS (Completely Fair Scheduler)
  • Cola de ejecución Red-Black Tree para operaciones O(log n)
  • Seguimiento de tiempo virtual (vruntime) para equidad
  • Soporte de valores nice (-20 a +19)
  • Multitarea preemptiva con integración de timer
  • Cambio de contexto en ensamblador x86-64 optimizado

✅ Sistema Init

  • Proceso init PID 1 (mini-systemd)
  • Gestión de servicios y respawn
  • Cambio a modo usuario desde kernel
  • Gestión de servicios shell

🔧 Llamadas al Sistema

✅ Interfaz de Syscalls (23 syscalls implementadas)

SYS_EXIT(0)         - Terminación de proceso
SYS_WRITE(1)        - Escribir a descriptor de archivo
SYS_READ(2)         - Leer de descriptor de archivo
SYS_GETPID(3)       - Obtener ID de proceso
SYS_GETPPID(4)      - Obtener ID de proceso padre
SYS_LS(5)           - Listar contenidos de directorio
SYS_MKDIR(6)        - Crear directorio
SYS_PS(7)           - Mostrar lista de procesos
SYS_WRITE_FILE(8)   - Escribir archivo al filesystem
SYS_CAT(9)          - Mostrar contenidos de archivo
SYS_TOUCH(10)       - Crear archivo vacío
SYS_RM(11)          - Eliminar archivo
SYS_FORK(12)        - Crear proceso hijo
SYS_WAITPID(13)     - Esperar proceso hijo
SYS_RMDIR(40)       - Eliminar directorio
SYS_MALLOC_TEST(50) - Test de asignación de memoria
SYS_BRK(51)         - Cambiar break del heap
SYS_SBRK(52)        - Incrementar break del heap
SYS_MMAP(53)        - Mapeo de memoria
SYS_MUNMAP(54)      - Desmapear memoria
SYS_MPROTECT(55)    - Cambiar protección de memoria
SYS_EXEC(56)        - Ejecutar programa

✅ Mecanismo de Syscalls

  • Interfaz de interrupción de software INT 0x80
  • Paso de parámetros basado en registros
  • Transición modo kernel/usuario
  • Manejo de errores y valores de retorno

⚡ Sistema de Interrupciones

✅ Manejo de Interrupciones

  • Configuración completa IDT con 64 vectores de interrupción
  • Remapeo PIC (Programmable Interrupt Controller)
  • ISR (Interrupt Service Routines) en ensamblador
  • Manejo IRQ para dispositivos de hardware
  • Integración de interrupción de timer
  • Interrupción de teclado (IRQ 1)
  • Interrupción de mouse (IRQ 12)
  • Interrupción de audio (IRQ 5)

✅ Manejo de Excepciones

  • Manejador de fallos de página con lectura de dirección CR2
  • Manejo de fallo de protección general
  • Excepción de división por cero
  • Excepción de código de operación inválido
  • Manejo de fallo de pila

🖥️ Controladores de Hardware

✅ Dispositivos de Entrada

  • Driver de teclado PS/2 con buffer circular
  • Driver de mouse PS/2 con soporte 3/5 botones + rueda de desplazamiento
  • Detección de tipo de mouse (estándar/rueda/5 botones)
  • Tasas de muestreo y resolución configurables

✅ Dispositivos de Almacenamiento

  • Driver de disco duro ATA/IDE
  • Soporte CD-ROM
  • Operaciones básicas de E/S de disco
  • Lectura/escritura basada en sectores

✅ Sistema de Audio

  • Driver Sound Blaster 16
  • Soporte de audio 8-bit/16-bit
  • Reproducción Mono/Estéreo
  • Transferencia de audio basada en DMA (canales 1 y 5)
  • Control de volumen (master y PCM)
  • Configuración de tasa de muestreo
  • Detección de formato de audio

✅ Sistema de Video

  • Modo texto VGA (80x25)
  • Soporte gráfico VBE (VESA BIOS Extensions)
  • Acceso a framebuffer
  • Primitivas gráficas básicas

✅ Comunicación Serie

  • Drivers de puerto serie COM1/COM2
  • Salida de debug vía serie
  • Tasas de baudios configurables
  • Manejo de interrupciones serie

✅ Sistemas de Timer

  • PIT (Programmable Interval Timer)
  • RTC (Real Time Clock)
  • HPET (High Precision Event Timer)
  • LAPIC (Local APIC Timer)
  • Abstracción de sistema de reloj unificado
  • Cascada de timer con selección del mejor timer disponible

✅ Controlador DMA

  • Soporte DMA de 8 canales (0-7)
  • Modos de transferencia 8-bit y 16-bit
  • Integración DMA de audio
  • Control de habilitación/deshabilitación de canales

📁 Sistema de Archivos

✅ Sistema de Archivos Virtual (VFS)

  • Capa de abstracción de filesystem unificada
  • Framework de soporte para múltiples filesystems
  • Operaciones estándar de archivo (open, read, write, close)
  • Operaciones de directorio (mkdir, rmdir, ls)
  • Manejo de metadatos de archivo

✅ Filesystem MINIX

  • Implementación completa de filesystem MINIX
  • Almacenamiento de archivos basado en inodos
  • Soporte de estructura de directorios
  • Creación, eliminación y modificación de archivos
  • Integrado con capa VFS

✅ Operaciones de Archivo

  • Creación de archivos (touch)
  • Eliminación de archivos (rm)
  • Creación de directorios (mkdir)
  • Eliminación de directorios (rmdir)
  • Visualización de contenido de archivos (cat)
  • Listado de directorios (ls)
  • Capacidades de escritura de archivos

👤 Espacio de Usuario

✅ Biblioteca C (LibC)

  • Implementación de biblioteca C freestanding
  • Headers estándar: stdio.h, stdlib.h, unistd.h, stdint.h, stddef.h
  • Funciones de E/S: printf(), puts(), putchar()
  • Funciones de memoria: malloc(), free()
  • Funciones de proceso: exit(), getpid()
  • Wrappers de llamadas al sistema

✅ Implementación de Printf

  • Especificadores de formato: %d (enteros), %s (strings), %c (caracteres)
  • Soporte de argumentos variables
  • Salida a stdout

✅ Programas de Usuario

  • Implementación del comando echo
  • Integración shell para programas de usuario
  • Cargador ELF (implementación básica)

🐚 Sistema Shell

✅ Shell Interactivo

  • Interfaz de línea de comandos en Ring 3 (modo usuario)
  • Comandos integrados: ls, ps, cat, mkdir, rmdir, touch, rm, fork, clear, help, exit, malloc, sbrk, exec

✅ Características del Shell

  • Análisis y ejecución de comandos
  • Integración de gestión de procesos
  • Soporte de operaciones de filesystem
  • Testing de gestión de memoria
  • Manejo de errores y retroalimentación

🌐 Sistema de Red

🔄 Stack TCP/IP Básico (En Desarrollo)

  • Implementación básica usando librería IoT ligera
  • Soporte TCP/IP fundamental para conectividad
  • Interfaz de sockets simplificada
  • Framework de drivers Ethernet básico
  • Utilidad ping planificada
  • Enfoque minimalista para reducir complejidad

Nota: Se optó por una implementación básica con librería IoT en lugar de portar el stack completo de Linux (1.5M líneas) para mantener el kernel ligero y manejable.

🔧 Sistema de Compilación

✅ Compilación Multi-Objetivo

  • Objetivo Desktop (características completas, heap 256MB, 1024 procesos)
  • Objetivo Server (networking optimizado, heap 1GB, 4096 procesos)
  • Objetivo IoT (gestión de energía, heap 16MB, 64 procesos)
  • Objetivo Embedded (características mínimas, heap 4MB, 16 procesos)

✅ Multi-Arquitectura

  • Soporte de producción x86-64
  • Soporte experimental x86-32
  • Framework de desarrollo ARM
  • Capa de abstracción de arquitectura (HAL)

⚠️ Limitaciones Actuales

❌ No Implementado Aún

  • Soporte SMP (Symmetric Multiprocessing)
  • Módulos dinámicos del kernel
  • IPC avanzado (pipes, colas de mensajes)
  • Stack de red (TCP/IP)
  • Soporte USB
  • GUI/Gestor de ventanas avanzado
  • Manejo de señales
  • Memoria copy-on-write
  • Soporte de memoria swap
  • Características avanzadas de filesystem (ext2/3/4)

⚠️ Problemas Conocidos

  • El cambio de contexto de fork() necesita refinamiento
  • Funcionalidad limitada del cargador ELF
  • No hay recolección de procesos zombie en init
  • Asignador de memoria básico (versiones avanzadas en desarrollo)
  • Soporte de una sola CPU únicamente

📊 Especificaciones Técnicas

Layout de Memoria

Espacio Kernel: 0x100000 - 0x800000 (1MB-8MB)
Espacio Heap:   0x800000 - 0x2000000 (8MB-32MB, 24MB total)
Espacio Usuario: 0x40000000+ (1GB+)

Métricas de Rendimiento

  • Tiempo de cambio de contexto: ~microsegundos (optimizado en ensamblador)
  • Complejidad del planificador: O(log n) con Red-Black Tree
  • Asignación de memoria: O(1) para asignador simple
  • Latencia de interrupción: Mínima con ISRs optimizados

Límites de Recursos (Objetivo Desktop)

  • Procesos máximos: 1024
  • Threads máximos: 4096
  • Tamaño de heap: 256MB
  • Quantum del planificador: 10ms
  • Tamaño de buffer E/S: 64KB

🎯 Hoja de Ruta

Corto Plazo (Próximo Release)

  • Arreglar problemas de cambio de contexto de fork()
  • Implementar recolección adecuada de zombies
  • Integrar stack TCP/IP básico con librería IoT
  • Mejorar cargador ELF
  • Agregar framework USB

Mediano Plazo

  • Soporte SMP
  • Sistema GUI avanzado
  • Expansión del networking básico (más protocolos, optimizaciones)
  • Módulos dinámicos del kernel
  • Mecanismos IPC avanzados

Largo Plazo

  • Soporte de aplicaciones nativas (Doom, GCC, Bash)
  • Compatibilidad POSIX completa
  • Soporte avanzado de filesystem
  • Mejoras de abstracción de hardware
  • Optimizaciones de rendimiento

Guía de Desarrollo

- Esta sección es por si alguien se interesa en contribuir al proyecto. No son reglas estrictas, son simplemente recomendaciones para que sea mas llevadero.

¿Qué hay que saber para contribuir?

Más que nada lo siguiente:
  • Saber programación estructurada/funcional/orientada a objetos según sea necesario por el lenguaje.
  • Conocer C o C++ o Rust.
  • Assembly si contribuís en subsistemas muy pegados al hard, pero recomiendo conocer los básicos para saber cómo funcionan panic(), boot.asm, etc.
  • Conocer cómo funciona un makefile, como compilar los subsistemas por partes, por qué hay que compilar los subsistemas por separado con su propio makefile
  • Herramientas de desarrollo general: GIT/GitHub, como crear, cambiar, pullear y lanzar PR's entre ramas
  • QEMU básico. Cómo funciona la VM, como se le carga la imagen generada al compilar el kernel.
  • Conocer Bash es un plus para los testeos rápidos, ya que podés iniciar QEMU con un script sin repetir el comando completo.
  • Comunicación. Argumentar decisiones sobre las PR's, debatir sanamente al respecto.
  • Saber utilizar IA's en general para optimizar el debug y adaptarlo a las convenciones de código.
  • Saber que, al contribuir, podés ser manteiner del subsistema al que aportaste. Y si no podés dar mantenimiento recurrente al subsistema, dejarlo bien documentado.

  • De igual forma, no hay que ser un experto para contribuir al kernel. Simplemente con tener ganas de aprender/estudiar sobre lo que vayas a contribuir es más que suficiente.

    Configuración del Entorno

    Dependencias Requeridas:

  • Básicamente tener instalado: el compilador de C/Cpp (gcc/g++), el compilador de asm (nasm), make para la compilación y QEMU como vm de prueba.
  • Te daría los comandos o las webs para instalar, pero chatgpt te lo puede resolver mejor.

    NOTA: Como este proyecto es un kernel, es Freestanding. Eso quiere decir que vos no podés incluir librerías como stdio.h para hacer un print(), write(), etc. por que no hay sistema operativo que responda a esas funciones . Vos sos el sistema operativo. por eso, en el repo tengo la carpeta de dependencias "includes".

    Cómo escribo código?

    Convenciones de Nombres:

    • Funciones: snake_case()
    • Macros: UPPER_CASE
    • Structs: struct_name_t
    • Variables globales: g_variable_name
    • Constantes: CONSTANT_NAME
    • includes: #INCLUDE -ir0/Lib.h - (se estan migrando a ese formato)

    Comentarios:

    • archivos de encabezado .h de funciones documentadas
    • Archivos de código fuente con comentarios en algunas funciones, pero mas acotados
    • Explicación de algoritmos complejos
    • TO DO's claramente marcados
    • Referencias a documentación técnica
    Esto es aproximado. Por lo general trato de respetar esas convenciones lo máximo que puedo.

  • Algo así sería en este ejemplo una archivo promedio de código fuente:


  • Fijate en cómo uso las llaves por debajo del nombre de la funcion y los mismo en condicionales, bucles, etc. También como directamente no las uso cuando el condicional tiene una sola línea o hay cierto nesting.

  • Así manejo los encabezados (o la mayoría):



  • Los comentarios grandes van por lo general en éstos .h y en los fuente hacemos acotaciones.

    Cómo compilar (por ahora)

  • Tiene que haber un makefile en todos los subsistemas, por lo que se debería poder hacer make "subsistema"

  • Después, el kernel tiene un makefile general para generar el binario, con su clean respectivo. Por ahora se usa así: make all

  • A futuro, seguramente hayan estrategias de compilación que permitan compilar el kernel entero para sus distintos usos.
  • Subsistemas del Kernel

    - En esta sección se detallan los principales subsistemas que componen el kernel IR0, su estado actual de desarrollo y las características técnicas de cada uno.

    La mejor forma de entender el funcionamiento interno es revisando el código fuente en el Repositorio de GitHub.

    🔄 Scheduler (Planificador)

    El scheduler es el corazón del sistema de multiprocesamiento. Actualmente implementa un algoritmo Round-Robin simple como fallback, pero el objetivo es migrar a un scheduler preemptivo con esquema de prioridades similar al CFS (Completely Fair Scheduler) de Linux.

    Características Actuales:

    • Algoritmo Round-Robin con quantum fijo
    • Soporte para múltiples niveles de prioridad
    • Manejo básico de estados de proceso (Ready, Running, Blocked)
    • Context switching optimizado en ensamblador

    Próximas Mejoras:

    • Implementación de scheduler preemptivo
    • Algoritmo CFS para distribución equitativa de CPU
    • Soporte para real-time scheduling
    • Load balancing entre núcleos

    Archivos: scheduler/scheduler.c, scheduler/task.h, scheduler/switch/switch.asm

    💾 Filesystem (Sistema de Archivos)

    Sistema de archivos propio basado en EXT2 pero con innovaciones modernas. La característica distintiva es la integración de una base de datos vectorial para optimizar las operaciones de búsqueda y indexación de archivos.

    Características Técnicas:

    • Estructura de directorios jerárquica
    • Soporte para archivos de hasta 2TB
    • Journaling para recuperación ante fallos
    • Compresión transparente de archivos
    • Indexación vectorial para búsquedas rápidas

    Innovaciones:

    • Integración con libvictor para búsquedas semánticas
    • Cache inteligente basado en patrones de acceso
    • Soporte para metadata extendida
    • Encriptación a nivel de archivo

    Estado: En desarrollo activo

    Archivos: fs/ext2.c, fs/victor_index.c, fs/journal.c

    ⚡ Sistema de Interrupciones

    Sistema robusto de manejo de interrupciones y excepciones que garantiza la estabilidad del kernel y proporciona una interfaz limpia para el manejo de eventos de hardware y software.

    Componentes Principales:

    • IDT (Interrupt Descriptor Table): Tabla de 256 entradas para mapear interrupciones
    • ISR (Interrupt Service Routines): Handlers optimizados en ensamblador
    • Exception Handler: Manejo de excepciones del procesador
    • IRQ Manager: Gestión de interrupciones de hardware

    Características:

    • Manejo completo de page faults con recovery automático
    • Interrupciones anidadas con prioridades
    • Deferred interrupt processing
    • Interrupt coalescing para optimización

    Archivos: interrupt/idt.c, interrupt/interrupt.asm, interrupt/isr_handlers.c, interrupt/irq.c

    🚀 Subsistema de Arranque

    Sistema de inicialización que prepara el entorno para la ejecución del kernel, manejando la transición desde el bootloader hasta el espacio de usuario.

    Fases de Arranque:

    • Fase 1: Inicialización del procesador y modo protegido
    • Fase 2: Configuración de paginación y memoria virtual
    • Fase 3: Inicialización de subsistemas críticos
    • Fase 4: Carga del primer proceso (init)

    Características:

    • Soporte para múltiples arquitecturas (x86-64, ARM64)
    • Bootloader independiente con soporte para UEFI
    • Recuperación automática ante fallos de arranque
    • Modo de recuperación integrado
    Diagrama de arranque

    Archivos: boot/boot.asm, boot/kmain.c, boot/arch.c, boot/kernel_start.c

    🛡️ Gestión de Memoria

    Sistema avanzado de gestión de memoria que proporciona aislamiento entre procesos, optimización de rendimiento y protección contra accesos no autorizados.

    Componentes:

    • Memory Manager: Gestión de páginas físicas y virtuales
    • Page Allocator: Asignación eficiente de memoria
    • Slab Allocator: Optimización para objetos pequeños
    • Memory Protection: Control de acceso y permisos

    Características:

    • Paginación de 4 niveles (48-bit addressing)
    • Memory compression transparente
    • NUMA awareness para sistemas multi-socket
    • Memory deduplication

    Archivos: mm/page_alloc.c, mm/slab.c, mm/vmalloc.c, mm/protection.c

    🌐 Subsistema de Red

    Pila de red completa basada en Linux pero optimizada para el kernel IR0, proporcionando soporte para protocolos modernos y optimizaciones específicas.

    Protocolos Soportados:

    • TCP/IP stack completo
    • UDP con optimizaciones de latencia
    • HTTP/2 y HTTP/3
    • QUIC para conexiones rápidas
    • IPv6 con transición automática

    Optimizaciones:

    • Zero-copy networking
    • Kernel bypass para aplicaciones de alto rendimiento
    • Network function virtualization (NFV)
    • Load balancing inteligente

    Estado: Integración con Linux networking stack

    Archivos: net/tcp.c, net/udp.c, net/socket.c, net/protocols/

    🔧 Subsistema de Drivers

    Framework modular para el desarrollo y gestión de drivers de hardware, con soporte para hot-plugging y gestión automática de dispositivos.

    Tipos de Drivers:

    • Block Devices: Discos, SSDs, dispositivos de almacenamiento
    • Character Devices: Terminales, dispositivos de entrada
    • Network Devices: Tarjetas de red, WiFi, Bluetooth
    • Graphics: GPUs, framebuffers, aceleración por hardware

    Características:

    • Driver framework unificado
    • Auto-detection de hardware
    • Power management integrado
    • Driver signing y verificación

    Archivos: drivers/core.c, drivers/block/, drivers/char/, drivers/net/

    🔐 Sistema de Seguridad

    Framework integral de seguridad que protege el kernel y los procesos de usuarios, implementando múltiples capas de protección y auditoría de seguridad.

    Componentes de Seguridad:

    • Access Control: Control de acceso basado en roles (RBAC)
    • Capability System: Sistema de capacidades granular
    • Seccomp: Filtrado de syscalls para sandboxing
    • LSM (Linux Security Modules): Módulos de seguridad intercambiables

    Características:

    • ASLR (Address Space Layout Randomization)
    • Stack canaries y protección contra buffer overflows
    • Kernel hardening automático
    • Auditoría de eventos de seguridad
    • Integración con TPM para medición de integridad

    Archivos: security/capability.c, security/seccomp.c, security/lsm/, security/audit.c

    ⚡ Power Management

    Sistema avanzado de gestión de energía que optimiza el consumo de batería en dispositivos móviles y reduce el consumo energético en servidores, manteniendo el rendimiento.

    Estados de Energía:

    • Suspend to RAM: Suspensión rápida con recuperación instantánea
    • Suspend to Disk: Hibernación completa
    • Standby: Modo de espera de bajo consumo
    • Dynamic Frequency Scaling: Ajuste dinámico de frecuencia CPU

    Optimizaciones:

    • CPU idle management inteligente
    • Wake-on-LAN y wake-on-timer
    • Power capping para servidores
    • Thermal management automático
    • Battery health monitoring

    Archivos: power/suspend.c, power/cpuidle.c, power/thermal.c, power/battery.c

    🎯 Virtualización

    Subsistema de virtualización que permite ejecutar múltiples sistemas operativos simultáneamente, con soporte para contenedores y máquinas virtuales completas.

    Tipos de Virtualización:

    • Containers: Aislamiento ligero con namespaces y cgroups
    • KVM: Kernel-based Virtual Machine para VMs completas
    • Xen: Hypervisor tipo 1 para virtualización bare-metal
    • Docker/OCI: Soporte para estándares de contenedores

    Características:

    • Hardware-assisted virtualization (Intel VT-x, AMD-V)
    • Nested virtualization
    • Live migration de VMs
    • GPU passthrough para aceleración gráfica
    • Memory ballooning y overcommit

    Archivos: virt/kvm/, virt/xen/, kernel/nsproxy.c, kernel/cgroup.c

    📊 Monitoring y Debugging

    Sistema completo de monitoreo y debugging que proporciona visibilidad profunda del funcionamiento del kernel y permite el diagnóstico de problemas en tiempo real.

    Herramientas de Debugging:

    • Kprobes: Puntos de inserción dinámicos en el kernel
    • ftrace: Tracer de funciones y eventos
    • perf: Profiler de rendimiento avanzado
    • eBPF: Programación dinámica del kernel

    Métricas y Monitoreo:

    • CPU, memoria y I/O profiling
    • Network packet tracing
    • System call monitoring
    • Kernel panic analysis
    • Performance counters

    Archivos: kernel/trace/, kernel/debug/, kernel/profiling/, kernel/bpf/

    🔧 Device Tree

    Sistema de descripción de hardware que permite al kernel descubrir y configurar automáticamente dispositivos de hardware sin necesidad de drivers específicos hardcodeados.

    Características:

    • Descripción declarativa del hardware
    • Soporte para múltiples arquitecturas
    • Overlays dinámicos para configuración
    • Compatibilidad con firmware UEFI/ACPI

    Beneficios:

    • Boot más rápido en sistemas embebidos
    • Configuración automática de dispositivos
    • Portabilidad entre plataformas
    • Reducción de código específico de plataforma

    Archivos: drivers/of/, drivers/acpi/, drivers/firmware/

    🎮 Graphics y Multimedia

    Subsistema gráfico que proporciona aceleración por hardware, soporte para múltiples monitores y capacidades multimedia avanzadas.

    Componentes Gráficos:

    • DRM (Direct Rendering Manager): Gestión de gráficos modernos
    • KMS (Kernel Mode Setting): Configuración de modo de pantalla
    • GEM (Graphics Execution Manager): Gestión de memoria gráfica
    • V4L2: Video4Linux para captura de video

    Características:

    • Soporte para GPUs modernas (NVIDIA, AMD, Intel)
    • Hardware acceleration para video
    • Multi-head display
    • HDR y color management
    • VR/AR support

    Archivos: drivers/gpu/drm/, drivers/media/, drivers/video/

    🔊 Audio Subsystem

    Sistema de audio avanzado que proporciona soporte para múltiples formatos, procesamiento de audio en tiempo real y gestión de dispositivos de audio complejos.

    Componentes de Audio:

    • ALSA (Advanced Linux Sound Architecture): Framework de audio principal
    • PulseAudio: Servidor de sonido para usuarios
    • JACK: Audio profesional de baja latencia
    • ASoC (ALSA System on Chip): Audio para sistemas embebidos

    Características:

    • Soporte para formatos HD (24-bit, 192kHz)
    • Audio surround 7.1
    • Noise cancellation
    • Bluetooth audio (A2DP, aptX)
    • MIDI y síntesis de audio

    Archivos: sound/core/, sound/soc/, sound/pci/, sound/usb/

    📱 Input/Output Subsystem

    Sistema unificado de entrada y salida que maneja todos los dispositivos de interfaz de usuario, desde teclados y ratones hasta pantallas táctiles y sensores.

    Tipos de Dispositivos:

    • HID (Human Interface Devices): Teclados, ratones, gamepads
    • Touchscreens: Pantallas táctiles capacitivas y resistivas
    • Sensors: Acelerómetros, giroscopios, magnetómetros
    • Haptic Feedback: Vibración y feedback táctil

    Características:

    • Multi-touch support
    • Gesture recognition
    • Accessibility features
    • Hot-plugging automático
    • Power management para dispositivos

    Archivos: drivers/input/, drivers/hid/, drivers/iio/

    Descargas

  • La descarga del binario del kernel se expondrá en esta sección cuando salga la primer versión estable de la rama mainline.