Kapitel 11 von 15nullos.de

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