boot: separate BIOS from UEFI
boot/bios/ now holds the MBR, the El Torito stub and the real-mode stage 2; boot/uefi/ is empty and documented. Separate directories rather than #ifdefs, because the two share almost nothing. A BIOS loader lives in 16-bit real mode, reaches the firmware through software interrupts, and walks itself up into long mode. A UEFI loader is a 64-bit PE that the firmware has already placed in long mode with paging on, calling services through a table of function pointers. What they do share is the hand-off contract, which boot/README.md now writes down: ELF segments placed, long mode, a 24-byte-entry memory map at E820_MAP_ADDR, framebuffer geometry at VBE_INFO_ADDR. That contract is the point of documenting it now. UEFI's GetMemoryMap returns EFI_MEMORY_DESCRIPTORs, and the right move is to translate them into the entries kernel/arch/x86_64/e820.c already parses rather than teach the kernel a second format. Build output paths under $(BUILD)/boot are unchanged; only sources moved.
This commit is contained in:
parent
8a4ac03ea9
commit
08a1a9033a
19 changed files with 125 additions and 33 deletions
|
|
@ -16,7 +16,7 @@ one group. Verified rendering correctly on 2026-08-08.
|
|||
counter-intuitive part and it is a timing fact, not a preference: the kernel does
|
||||
not reach `vga_init()` until roughly the last 300ms of a ~2.8s boot, so a
|
||||
kernel-drawn logo appeared for about one frame before `console_takeover()` wiped
|
||||
it. Drawn from `splash()` in `boot/stage2main.c` it is up for the whole boot.
|
||||
it. Drawn from `splash()` in `boot/bios/stage2main.c` it is up for the whole boot.
|
||||
`kernel/dev/vga.c` keeps the same drawing code against the same mask
|
||||
(`vga_draw_logo`, `vga_logo_centered`) for things that want the mark *after*
|
||||
boot — the crash screen, eventually `schinit`. Don't "fix" the duplication by
|
||||
|
|
@ -35,7 +35,7 @@ for the one rule. 4 bits rather than 8 because the header is included by the
|
|||
**`STAGE2_SECTORS` was encoded in five places, not the three `docs/layout.md`
|
||||
claimed.** Raising it 24 → 48 to fit the 8 KiB mask proved it: the `dd seek=25`
|
||||
offset stayed behind and the kernel got written straight over stage2's tail.
|
||||
The five were `boot/bootasm.S`, `boot/stage2main.c`, the `dd seek=`, and *twice*
|
||||
The five were `boot/bios/bootasm.S`, `boot/bios/stage2main.c`, the `dd seek=`, and *twice*
|
||||
inside `tools/mkiso.sh` (its size assertion and `-boot-load-size`). It now lives
|
||||
only in the root Makefile, which passes `-DSTAGE2_SECTORS` and exports it to
|
||||
mkiso; the `#define`s left in the boot sources are `#ifndef` fallbacks. Hard
|
||||
|
|
|
|||
Loading…
Reference in a new issue