summaryrefslogtreecommitdiff
path: root/efi-kernel/mk.sh
diff options
context:
space:
mode:
authorclaude <[email protected]>2026-07-12 10:27:24 +0000
committerclaude <[email protected]>2026-07-12 10:27:24 +0000
commit3caf5e9682807b9579938431cca4446d7efcf615 (patch)
tree119845f998ad6dbf36cc486bad7f2bb646660c7b /efi-kernel/mk.sh
parentc480e76433f9bb8ce8ce9d5802cdada8883db184 (diff)
downloadplan9-kencc-linux-3caf5e9682807b9579938431cca4446d7efcf615.tar.gz
plan9-kencc-linux-3caf5e9682807b9579938431cca4446d7efcf615.zip
🌭 efi-kernel/: настоящий EFI-загрузчик + amd64-ядро (Plan9 a.out)HEADmain
По уточнению @lzcnt (нужен EFI-загрузчик, не a.out-парсер, и amd64-ядро): - kernel.c + kern64.s -> 6c/6a/6l -> amd64 Plan9 a.out (S_MAGIC 0x8A97, entry 0x100000), kmain пишет строку в VGA 0xB8000. - efi_load.c -> PE32+ bootx64.efi (через pe64.s из 9legacy + dd skip=40): под UEFI печатает через ConOut, разбирает встроенный a.out (big-endian 40-байтный заголовок), копирует сегменты по entry, прыгает в ядро (long mode). - Проверено: валидный PE32+ x64 EFI_APPLICATION, ядро встроено и парсится, ESP собран. Co-Authored-By: Claude Opus 4.8 <[email protected]>
Diffstat (limited to 'efi-kernel/mk.sh')
-rwxr-xr-xefi-kernel/mk.sh15
1 files changed, 15 insertions, 0 deletions
diff --git a/efi-kernel/mk.sh b/efi-kernel/mk.sh
new file mode 100755
index 0000000..9cd32c2
--- /dev/null
+++ b/efi-kernel/mk.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+# EFI-загрузчик + amd64-ядро -> bootx64.efi. Нужны: BINDIR (6c/6a/6l), PLAN9SRC (include),
+# и pe64.s/efi.h/mem.h из ../efi (запусти ../efi/fetch_ref.sh).
+set -e; cd "$(dirname "$0")"
+BIN="${BINDIR:?}"; INC="${PLAN9SRC:?}"; export objtype=amd64
+for f in pe64.s efi.h mem.h; do [ -f ../efi/$f ] || { echo "нет ../efi/$f — запусти ../efi/fetch_ref.sh"; exit 1; }; cp ../efi/$f .; done
+head -162 pe64.s > pe64min.s
+"$BIN/6a" kern64.s; "$BIN/6c" -I"$INC/amd64/include" -I"$INC/sys/include" kernel.c
+"$BIN/6l" -l -s -T0x100000 -E _start -o kernel.out kern64.6 kernel.6
+python3 -c "d=open('kernel.out','rb').read(); open('kernel_blob.h','w').write('static unsigned char kernel_blob[]={'+','.join(hex(b) for b in d)+'};\nstatic unsigned kernel_len=%d;\n'%len(d))"
+"$BIN/6a" -DIMAGEBASE=0x8000 pe64min.s
+"$BIN/6c" -I"$INC/amd64/include" -I"$INC/sys/include" efi_load.c
+"$BIN/6l" -l -s -R1 -T0x8000 -o boot.out pe64min.6 efi_load.6
+dd if=boot.out bs=1 skip=40 of=bootx64.efi 2>/dev/null
+echo "bootx64.efi: $(ls -la bootx64.efi|awk '{print $5}') байт"