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.

Primo kernel C β€” v0.0.3 Primo framebuffer 800x600 β€” v0.2.0.3

βš™οΈ Architettura Kernel

boot/ stage1.asm ← MBR 512B: carica stage2 stage2.asm ← Carica kernel (256KB max, 4 chunkΓ—128) kernel/ natalizioos.h ← Header centrale: NATALIZIOOS_VERSION, inb/outb natalizioos_graphic.c ← Entry point build grafica natalizioos_text.c ← Entry point build testuale idt.c / gdt.c ← Interrupt + segmentazione pmm.c ← Physical Memory Manager bitmap paging.c ← Paginazione x86 4KB heap.c ← kmalloc/kfree task.c ← Multitasking preemptivo shell.c ← Shell testuale (dispatch via tabella) commands.c ← 100+ comandi registrati gfxshell_main.c ← Shell grafica (dispatch SEPARATO!) drivers/ vga.c / fb.c ← VGA text mode + Framebuffer VESA term.c ← Layer cross-mode (β†’vga o β†’gconsole) keyboard.c ← PS/2 scancode set 1 timer.c ← PIT 100Hz, timer_get_ticks() ata.c ← ATA PIO lettura/scrittura settori uart.c ← COM1 polling 38400 8N1 (v0.2.1.5.8) seaof.c ← Sea of Sensors (HPE iLO) dynpower.c ← ACPI + CPU power (HPE Power) fs/ vfs.c ← Virtual File System layer ramfs.c ← RAM filesystem in-memory natfs.c ← N.A.T.FS persistente su disco ATA
⚠️ Attenzione architetturale

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.

βœ“ Regola freestanding

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

StrumentoVersioneUso
GCC13.x-m32 -ffreestanding -fno-stack-protector -nostdlib -nostdinc -O2
NASM2.xBootloader stage1/stage2, entry points ASM
LD (GNU)2.xLinker con script custom (kernel.ld)
QEMU8.xTesting β€” qemu-system-x86_64 + -serial tcp
dd / makeβ€”Creazione immagine disco raw (512 settoriΓ—3072)
# Compilazione tipo (da Makefile) gcc -m32 -ffreestanding -fno-stack-protector -nostdlib -nostdinc -O2 -Wall -Wextra -fno-pic -fno-pie -Ikernel -Idrivers -Ifs -Iuserspace -DNATALIZIOOS_GRAPHIC -c kernel/commands.c -o build-graphic/commands.o

πŸ“¦ Famiglie di Versioni

FamigliaRangeCaratteristica chiaveStato
MyOSv0.0.0 β†’ v0.1.0Progetto originale: bootloader β†’ kernel C β†’ VFSStable
NATALIZIOOS v0.1.xv0.1.1 β†’ v0.1.9.3Rebranding, shell avanzata, N.A.T.FS, multi-utente, ELFStable
NATALIZIOOS v0.2.0.xv0.2.0 β†’ v0.2.0.3Ring3, framebuffer 800Γ—600, gconsole, gfxshellStable
NATALIZIOOS v0.2.1.xv0.2.1 β†’ v0.2.1.5Memory isolation, term_*, boot animation HPE, lab modeStable
HPE Series CANARYv0.2.1.5.1 β†’ v0.2.1.5.9bFeature 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).

SeaOfSens HPE GUI DynPower HPE GUI
VersioneFeatureTecnologia
v0.2.1.5.1.xNATMemory (6 step)PMM, heap, paging, pattern test
v0.2.1.5.2SmartStorATA SMART cmd 0xB0
v0.2.1.5.3ServerCfgPCI, CPUID, menu iLO
v0.2.1.5.4SmartArrayPCI enumeration + ATA identify
v0.2.1.5.5SecureStartIDT/GDT/CR0/PMM/paging 8 check
v0.2.1.5.6SeaOfSensCPUID, MSR, PMM, ATA, PCI
v0.2.1.5.7DynPowerACPI RSDP/FADT, MSR 0x198/0x1B0, CPUID leaf 6
v0.2.1.5.8RestAPI + NATTourUART COM1 38400 8N1, JSON
v0.2.1.5.9NATBrowser AParser HTML VFS, term_* cross-mode
v0.2.1.5.9bNATBrowser BProxy UART β†’ Python host β†’ HTTP

πŸ—οΈ Come buildare

Ambiente di sviluppo: Linux (testato su WSL Ubuntu 24.04), GCC cross, NASM, QEMU.

# Clone + build grafica (default) cd v0.2.1.5.9b-CANARY make # β†’ build-graphic/kernel.bin make text # β†’ build-text/kernel.bin # Avvio QEMU make run-gui # Finestra grafica, nessuna porta seriale make run-gui-uart # + UART server su localhost:4444 (per restapi) make run-gui-proxy # + UART client (si connette al proxy Python) # Testing RestAPI make run-gui-uart # Terminale 1 nc localhost 4444 # Terminale 2 β†’ ping / version / uptime / exit # Testing NATBrowser HTTP python3 tools/natbrowser_proxy.py # Terminale 1 make run-gui-proxy # Terminale 2 # Nel kernel: browser http://example.com

πŸ› Debug con QEMU headless

Per diagnostica senza schermo, si usa QEMU con VNC headless e monitor stdio:

# Screenshot automatico via monitor QEMU qemu-system-x86_64 -drive format=raw,file=natalizioos.img,snapshot=on -m 64M -display none -vnc 127.0.0.1:5 -monitor stdio # Poi nel monitor: screendump /tmp/screen.ppm sendkey h # Invia keypress al kernel sendkey e sendkey l sendkey p sendkey ret
πŸ’‘ Tecnica usata

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

VersioneFeature pianificataStato
v0.2.1.5.10Fix generale β€” dispatch grafico unificato, sicurezzaIn sviluppo
v0.2.1.6Strada A β€” conversione comandi vga_* β†’ term_* (prime 20)Pianificato
v0.2.1.7–v0.2.1.9Comandi aggiuntivi + multi-utente graficoPianificato
v0.2.2.0MAJOR RELEASE β€” architettura text+gfx maturaFuturo
βœ“ Architettura v0.2.2.0 pianificata

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

ProblemaCausaSoluzione
Crash prima di kmainstatic const array con initializer in funzione locale β†’ .init_array non eseguitoSpostare sempre a livello di file
Redefinition errorsDriver ridefiniscono inb/outb giΓ  in natalizioos.hUsare prefissi locali (dp_, sl_, ...)
Comando non trovato in gfxshelldispatch in gfxshell_main.c separato da shell_commands[]Aggiungere anche in gfxshell dispatch + help hardcoded
VFS root NULL in gfxshellBoot grafico normale non chiamava heap_init()/ramfs_init()Aggiungere le 3 chiamate nel branch framebuffer-OK
Porta 4444 giΓ  in usoQEMU e proxy Python entrambi tentano di fare il serverUsare run-gui-uart (QEMU server) vs run-gui-proxy (QEMU client)
KEY_ARROW confronto sbagliatochar con segno β‰₯ 0x80 confrontato con costante positivaint c = (unsigned char)keyboard_getchar()
Γ—