Selbst bauen
Wie aus dem Quelltext Bootloader, Kernel, Compiler und Werkzeuge werden.
Bootloader nb
Eine Datei, boot/nb.c, ohne libc. clang übersetzt sie für das Windows-Ziel (UEFI-Programme
sind Windows-PE-Dateien), lld-link macht daraus eine EFI-Anwendung:
clang --target=x86_64-unknown-windows -ffreestanding … -c boot/nb.c
lld-link -subsystem:efi_application -entry:efi_main -out:build/nb.efi
Für Vorführungen: make clean os NBFLAGS=-DNB_PAUSE=2000 lässt den Bootloader-Bildschirm 2 Sekunden stehen.
Kernel nk
Alle kernel/*.c und arch/x86_64/*.c plus Startcode start.S. clang für
x86_64-unknown-elf, freistehend (keine Standardbibliothek, keine SSE, kein Red-Zone), dann
ld.lld mit arch/x86_64/kernel.ld. Der Kernel läuft oben im Adressraum
(0xffffffff80200000); die Seitentabellen dafür baut schon nb.
Dazu kommt init.img: ein ustar-Archiv mit allem, was beim Start in / liegt –
Testprogramme aus kernel/user/ und alle Werkzeuge aus make nullos-tools in /bin.
make os # build/nb.efi + build/nk.elf → build/esp/
Oder ganz ohne clang, nur mit eigener Werkzeugkette:
make -C cc kernel # cc + eigener Assembler + eigener Linker, dann Boot-Test in QEMU
libc
make -C libc # für den Mac: build/libc/host/
make -C libc TARGET=nullos # für nullos: build/libc/nullos/{libc.a,crt0.o}
make nullos-tools # alle cmd/* gegen die nullos-libc → /bin
sh libc/test/vergleich.sh # Byte für Byte gegen die macOS-libc
Vertrag mit dem Kernel: docs/syscalls.md und include/nullos/sys.h – beide binden
dieselbe Datei ein; wäre eine Konstante verschieden, bräche die Übersetzung.
Compiler cc
make -C cc # baut build/cc/cc (mit Apple clang)
make -C cc test # alle Tests (x86_64-Programme laufen per Rosetta 2)
make -C cc stage3 # Selbstübersetzung: cc → cc2 → cc3, Ausgabe muss gleich sein
make -C cc check # alles: Tests, Gegenprobe mit clang, alle Werkzeuge, Assembler-Vergleich,
# Selbstübersetzung, Kernel-Boot, ARM64
make -C cc test-qemu-arm64 # Tests als ARM64-Programme in QEMU
make -C cc test-qemu-riscv64 # Tests als RISC-V-64-Programme in QEMU
make -C cc kernel # ganz nullos mit cc bauen (Kernel, libc, Werkzeuge) und booten
make -C cc nullos # cc auf nullos: übersetzt sich dort selbst
Benutzen wie gewohnt: build/cc/cc -o hallo hallo.c, -S, -c,
-E, für nullos --target=x86_64-elf.
Werkzeuge
make host # alle cmd/* für den Mac → build/host/
make test # jeden test.sh laufen lassen, Ergebnis pro Werkzeug
Ein Werkzeug = cmd/NAME/main.c + lib/n.c, streng übersetzt
(-std=c11 -Wall -Wextra -Werror -pedantic). Den ganzen Stand prüft
python3 tools/abgleich.py und schreibt ihn nach docs/stand.md.
Download-Abbilder
sh tools/release/mkrelease.sh # .img, .iso, SHA256SUMS → build/release/<version>/
sh tools/release/check-release.sh # alle sechs Startarten in QEMU prüfen
Geprüft wird: .img als SATA-Platte, NVMe-SSD und USB-Stick, .iso als CD, USB-Stick und
SATA-Platte. Mehr in Installieren.
Diese Doku
sh tools/doku/build.sh
Übersetzt tools/doku/gen.c und schreibt doku/ neu. Ein make doku ist
gewünscht. kommt noch