Informazioni su NATALIZIOOS
Documentazione tecnica del progetto β architettura, toolchain, storia di sviluppo.
π Il Progetto
NATALIZIOOS Γ¨ un sistema operativo x86 32-bit scritto da zero in C e NASM assembly. Il progetto nasce come "MyOS" e viene rinominato NATALIZIOOS a partire dalla versione v0.1.1 (Aprile 2026). L'estetica visuale Γ¨ ispirata ai pannelli di gestione HPE iLO/ProLiant.
L'obiettivo Γ¨ imparare i fondamentali dell'architettura dei sistemi operativi: bootloader, Protected Mode, interrupt, gestione memoria, filesystem, multitasking e driver hardware β tutto costruito da zero senza librerie esterne.
βοΈ Architettura Kernel
gfxshell_main.c ha un dispatch comandi e un help screen separati dalla tabella shell_commands[] (usata solo dalla shell testuale). Ogni nuovo comando richiede 3 aggiunte: tabella, dispatch grafico, help grafico.
Array static const con initializer devono essere a livello di file, mai locali a una funzione. In modalitΓ freestanding GCC genera codice di init via .init_array che non viene mai eseguito β crash silenzioso prima di kmain.
π§ Toolchain
| Strumento | Versione | Uso |
|---|---|---|
| GCC | 13.x | -m32 -ffreestanding -fno-stack-protector -nostdlib -nostdinc -O2 |
| NASM | 2.x | Bootloader stage1/stage2, entry points ASM |
| LD (GNU) | 2.x | Linker con script custom (kernel.ld) |
| QEMU | 8.x | Testing β qemu-system-x86_64 + -serial tcp |
| dd / make | β | Creazione immagine disco raw (512 settoriΓ3072) |
π¦ Famiglie di Versioni
| Famiglia | Range | Caratteristica chiave | Stato |
|---|---|---|---|
| MyOS | v0.0.0 β v0.1.0 | Progetto originale: bootloader β kernel C β VFS | Stable |
| NATALIZIOOS v0.1.x | v0.1.1 β v0.1.9.3 | Rebranding, shell avanzata, N.A.T.FS, multi-utente, ELF | Stable |
| NATALIZIOOS v0.2.0.x | v0.2.0 β v0.2.0.3 | Ring3, framebuffer 800Γ600, gconsole, gfxshell | Stable |
| NATALIZIOOS v0.2.1.x | v0.2.1 β v0.2.1.5 | Memory isolation, term_*, boot animation HPE, lab mode | Stable |
| HPE Series CANARY | v0.2.1.5.1 β v0.2.1.5.9b | Feature diagnostiche HPE (NATMemory, SmartStor, SeaOfSens...) | CANARY |
π‘ Serie HPE β v0.2.1.5.x
A partire da v0.2.1.5.1, ogni release aggiunge una feature diagnostica in stile HPE iLO/ProLiant con dati hardware reali β mai placeholder. Il sistema adotta un dual bundle: kernel testuale + kernel grafico (CANARY).
| Versione | Feature | Tecnologia |
|---|---|---|
| v0.2.1.5.1.x | NATMemory (6 step) | PMM, heap, paging, pattern test |
| v0.2.1.5.2 | SmartStor | ATA SMART cmd 0xB0 |
| v0.2.1.5.3 | ServerCfg | PCI, CPUID, menu iLO |
| v0.2.1.5.4 | SmartArray | PCI enumeration + ATA identify |
| v0.2.1.5.5 | SecureStart | IDT/GDT/CR0/PMM/paging 8 check |
| v0.2.1.5.6 | SeaOfSens | CPUID, MSR, PMM, ATA, PCI |
| v0.2.1.5.7 | DynPower | ACPI RSDP/FADT, MSR 0x198/0x1B0, CPUID leaf 6 |
| v0.2.1.5.8 | RestAPI + NATTour | UART COM1 38400 8N1, JSON |
| v0.2.1.5.9 | NATBrowser A | Parser HTML VFS, term_* cross-mode |
| v0.2.1.5.9b | NATBrowser B | Proxy UART β Python host β HTTP |
ποΈ Come buildare
Ambiente di sviluppo: Linux (testato su WSL Ubuntu 24.04), GCC cross, NASM, QEMU.
π Debug con QEMU headless
Per diagnostica senza schermo, si usa QEMU con VNC headless e monitor stdio:
L'intera serie di screenshot della wiki Γ¨ stata acquisita con questo metodo: QEMU headless + VNC + screendump via monitor socket, controllato da Python con subprocess.Popen(stdin=PIPE). Nessuna interazione umana necessaria.
πΊοΈ Roadmap
| Versione | Feature pianificata | Stato |
|---|---|---|
| v0.2.1.5.10 | Fix generale β dispatch grafico unificato, sicurezza | In sviluppo |
| v0.2.1.6 | Strada A β conversione comandi vga_* β term_* (prime 20) | Pianificato |
| v0.2.1.7βv0.2.1.9 | Comandi aggiuntivi + multi-utente grafico | Pianificato |
| v0.2.2.0 | MAJOR RELEASE β architettura text+gfx matura | Futuro |
Il sistema parte sempre in shell testuale. Un comando dedicato (non 'win') lancia la gfxshell. 'labmode' lancia il Lab Mode isolato con comandi sperimentali. Il ritorno alla shell testuale richiede reboot.
π Note tecniche importanti
| Problema | Causa | Soluzione |
|---|---|---|
| Crash prima di kmain | static const array con initializer in funzione locale β .init_array non eseguito | Spostare sempre a livello di file |
| Redefinition errors | Driver ridefiniscono inb/outb giΓ in natalizioos.h | Usare prefissi locali (dp_, sl_, ...) |
| Comando non trovato in gfxshell | dispatch in gfxshell_main.c separato da shell_commands[] | Aggiungere anche in gfxshell dispatch + help hardcoded |
| VFS root NULL in gfxshell | Boot grafico normale non chiamava heap_init()/ramfs_init() | Aggiungere le 3 chiamate nel branch framebuffer-OK |
| Porta 4444 giΓ in uso | QEMU e proxy Python entrambi tentano di fare il server | Usare run-gui-uart (QEMU server) vs run-gui-proxy (QEMU client) |
| KEY_ARROW confronto sbagliato | char con segno β₯ 0x80 confrontato con costante positiva | int c = (unsigned char)keyboard_getchar() |