From 8b9c578e8febd3b26a26f3976457ae025ad214c1 Mon Sep 17 00:00:00 2001 From: "Pierre-Emmanuel Gob." Date: Thu, 17 Sep 2026 20:53:27 +0200 Subject: [PATCH] Initial commit --- .gitignore | 25 +++++++++++++++ README.md | 75 +++++++++++++++++++++++++++++++++++++++++++ boot.asm | 22 +++++++++++++ docs/assets/boot.png | Bin 0 -> 10097 bytes 4 files changed, 122 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 boot.asm create mode 100644 docs/assets/boot.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b795cde --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# Build output +build/ +*.o +*.a +*.elf +*.bin +*.iso +*.img + +# Toolchain / editor +.cache/ +compile_commands.json +.vscode/ +.idea/ +*~ + +# QEMU / debug +*.log +qemu*.log +*.core + +# For contributors using ai agents +AGENTS.md +.omo +.codegraph diff --git a/README.md b/README.md new file mode 100644 index 0000000..78b3d0a --- /dev/null +++ b/README.md @@ -0,0 +1,75 @@ +# Nadir Kernel + +Nadir is an x86-64 kernel written from scratch. +The name Nadir comes from the Arabic word *naẓīr*. In astronomy it means the point of lowest elevation, in opposition to the zenith. The documentation assumes general knowlege about how operating systems work. + +## Status of the project + +The project is in its foundation phase and is not yet usable. Only the bootloader is currently being written. + +## Getting started + +### Prerequisites + +You need two tools: + +- **nasm** to assemble `boot.asm` into a bootable image. +- **qemu-system-x86_64**, the emulator used to run it. + +Install both from your package manager: + +**Debian / Ubuntu** +```bash +sudo apt install nasm qemu-system-x86 +``` + +**Fedora** +```bash +sudo dnf install nasm qemu-system-x86 +``` + +**Arch Linux** +```bash +sudo pacman -S nasm qemu-desktop +``` + +**macOS (Homebrew)** +```bash +brew install nasm qemu +``` + +**Windows** + +I can only recommend using Linux distribution, but the Windows Subsystem for Linux is a valid path if you are exclusively running Windows. Install Ubuntu from the Microsoft Store, then run the Debian command above inside its terminal (QEMU's window renders automatically through WSLg). + +### Running the kernel + +From the repository root: + +```bash +nasm -f bin boot.asm -o boot.bin +qemu-system-x86_64 -fda boot.bin +``` + +A QEMU window opens and you should see this: + +![Nadir booting in QEMU](docs/assets/boot.png) + +Notes: + +- `-fda` boots the image as a BIOS floppy. QEMU's default firmware loads it at address `0x7C00` and executes it in 16-bit real mode. +- `boot.bin` is a generated artifact and is ignored by git, so you need to build it first. `rm boot.bin` cleans up and it will regenerates on the next `nasm` run. +- There is no build script or Makefile yet. Those two commands are the whole toolchain. +- Running over SSH or in a bare terminal? Add `-display curses` to render the boot screen as text instead of a window: + ```bash + qemu-system-x86_64 -fda boot.bin -display curses + ``` + Quit with `Ctrl-A` then `X`. + +### Troubleshooting + +| Symptom | Cause | +|---|---| +| `Boot failed: not a bootable disk` | `boot.bin` is not a valid boot sector: it must be exactly 512 bytes and end with the `0xAA55` boot signature. Re-run the `nasm` step and check it completes without errors. | +| Black screen / blinking cursor | The boot sector only speaks legacy BIOS (`int 0x10` text mode). This works out of the box with QEMU's default SeaBIOS firmware but will not boot under UEFI-only firmware (or UEFI-only real hardware) unless legacy/CSM boot is enabled. | +| No window appears under WSL2 | Use the `-display curses` variant above. It should work in any terminal. | diff --git a/boot.asm b/boot.asm new file mode 100644 index 0000000..47658d4 --- /dev/null +++ b/boot.asm @@ -0,0 +1,22 @@ +bits 16 ; 16 bit mode +org 0x7c00 + +boot: + mov si, message ; Point SI register to message + mov ah, 0x0e ; Set higher bits to the display character command + +.loop: + lodsb ; Load the character within the AL register, and increment SI + cmp al, 0 ; Is the AL register a null byte? + je halt ; Jump to halt + int 0x10 ; Trigger video service interrupt + jmp .loop ; Loop again + +halt: + hlt ; stop + +message: + db "Hello, World ! From Nadir Kernel", 0x0a, 0x0d, 0x00 + +times 510-($-$$) db 0 ; 510 bytes of zeros +dw 0xAA55 ; boot signature \ No newline at end of file diff --git a/docs/assets/boot.png b/docs/assets/boot.png new file mode 100644 index 0000000000000000000000000000000000000000..8a94de6d4f9170cf509834ab8ee9da658d8e6732 GIT binary patch literal 10097 zcmeHtXHZl7*Y3uKiU;I~f>ecbM0ycKX+fnZDjY!w2?mrZB_N#uAy|-34hQKHPz0nU zh7xMPLXjF;LWe^y0YYyf;cm{opZ@oq|DAW{-goYYH#3>p^P9EzudVg0XO)OQj0}D` zEqEFLfM4$2)inWtBb@-i(R}g*I8x}q4GsXOUfhLw0RVUX;h!TxhFb_6Jmalr;qB_~ z=w$oM)dIMwdJ`Kw^Y&lHVSvgt#RQ!@2H^PFLwPSB8v}cHq`kK%>VcD&H*iqZoCW}w zfP1>P9{ayv8bKw0GD9n@SZ^xdr*xcQik}ov`Bkwv+~Lv75Sj15^~T{qiEyR9rj@f# z{&I2q81YErY;T&ss&>T0?I`XuQJ2no>cQ+Dg=NaNOz1pKeu+z;Pnn;`GdaCY5vHwy z`J?&x<=r6BRL81?-kYs7&dmDP$ zf%5)57r%TsYJJwg*qssGe-M&X|28JgW~6E}egpylb5|R>Y+Nr2Mivc`8onQ2&vGgM z{k{#8wDkQN0Q4%Vs|(U;?&0`QF8+qbhiQ`4;47W0kqtH*ZKFzTw$@g?KSjAzpWa9^qUI48*;H-u-y8pUxX(1==iACy7dwNfX!=4 zjvd2u3(IcwR{)@+vC$jg*%Ui&QRk}|dvoUV&fmwCN{6D<5!jW7& zkuiayq76y=Zo-)TRU&gauwIYfn$Lx%Da3VQ>4KIPdCBru0C@g-8M;3+j#+QJMp@pd zpPRc|XsIDkEeAjAn1S|Pq?Rdh?+!o=7@beO-G>CoY32=~YT5z~36L1FgDcidD^P!I zKa|)c8d%TcUirK48J?y>SV>kVRaJ@$)Zn5&R7bSSQC@|XOjlu#dR`^CY$JP{?b0R? zp!6K8e>rxzNPw>97CRzFRyvIxzTkqhI=?=v5PpY8>o*#~TF8>5*@vG7fDqE>8=FyXLvT&zeZco`?6A7Z=2ODM1qO?M zCm}_ggQPfeKG)XPR{Tw&L@})WeDBr~@!GX%g+{c@a>N~;n|8T-#u}UND%=~iJVrCnm&C;{$iW4+iz*}&Wm7B;{`x&? z5`4A32DJ{assV~#EGii^5u1e5Ez#E;JEAGpo*oVASgo14o&DeWn?ReQ(@Z^%1+3@9 z@bW4ttN&`Oy=$$68BYu^t`fayB~XqWQdm}46f!=~-*DGkuT8f8?slyI^UaY*(c!oG zY3DH_x!x9}@vx_^lzB<9&x^)E6 zsV8T3jiE^&S?yH7sIr+qe?}d>zyn#k``&j!YBhyorSc&rJ2zdhZlC%C2^SC9%PO}m zj-8-+9c~0#yWbEVeq(lcyD8moWaKfLmltB`;r?W09NQRrurgoq_YW}2qwyx&>$`7T|XCrTB`_53pDMbPIf{@g|Dgvo5G

r{rBdns~h=dtNpgv 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 Ud@o=HBv8OTJtJNG?WeE)2bbYrY5)KL literal 0 HcmV?d00001