mkkernel

command
v1.99.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 21, 2026 License: MIT Imports: 8 Imported by: 0

Documentation

Overview

mkkernel zet een tamago-ELF om naar het raw arm64 "Image"-formaat dat de Raspberry Pi-firmware (en elke Linux-capabele bootloader) laadt: platte bytes op het laadadres, met de 64-byte arm64 Image-header vooraan en een branch naar het ELF-entrypoint in het eerste instructiewoord.

Gebruik: go run ./image/mkkernel -elf metal/out/hopos5.elf -o kernel8.img -load 0x80000 -raw

De ELF moet zó gelinkt zijn dat alle PT_LOAD-segmenten op of boven load+64 liggen (de header-ruimte); voor HopOS-images geldt TEXT_START = load + 0x10000.

Met -pe ontstaat een UEFI-applicatie (BOOTAA64.EFI, zie pe.go) en is -elf HERHAALBAAR: elke ELF is dezelfde build gelinkt op een eigen kandidaat-venster (load = TEXT − 0x10000, uit de ELF afgeleid). Verpakt wordt één payload + relocatietabel (docs/archief/pe-relocatie.md); de extra varianten dienen als diff-bewijs. De stub (metal/board/uefi/init.s) kiest bij boot de eerste kandidaat die volgens de firmware vrij is — zo boot één bestand universeel, ongeacht welk RAM een bord al bezet heeft.

PE/COFF-verpakking voor UEFI-boot (mkkernel -pe): de tamago-ELF wordt een AArch64 EFI-applicatie met échte secties — elk PT_LOAD-segment één PE-sectie met de eigen permissies (RX/RO/RW), zoals de Linux-arm64-kernel (efi-header.S) dat doet. Dat is geen cosmetiek: EDK2's image-protection mapt code-secties read-only-executable, en een alles-in-één-RWX-sectie betekent dat de stub zijn eigen globals niet kan schrijven (gemeten 2026-07-13: data abort op de eerste store, QEMU + EDK2-debugbuild). Strikte W^X-firmware (servers!) eist deze indeling sowieso.

De relocatie-vraag lost de stub zelf op (metal/board/uefi/init.s is positie-onafhankelijk en verhuist de image naar het linkadres); voor loaders die zonder relocatie-informatie weigeren te verplaatsen ligt er een lege .reloc-sectie in (één blok met twee ABSOLUTE-padding-entries — de klassieke truc uit de x86-Linux-stub).

Layout: RVA = 0x1000 + (paddr − load), en FileAlignment == SectionAlignment == 0x1000 zodat RVA == bestandsoffset. De HopOS-linkstijl (-R 0x1000) legt de segmenten al pagina-rond aaneengesloten; de sprong van de firmware-lading naar het linkadres blijft daardoor één vlakke kopie.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL