1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#!/bin/bash
# Собирает kernel-болванку (пишет в VGA 0xB8000) и загрузчик — всё в Plan9 a.out.
# Тулчейн: 8a/8c/8l (386) из ../bin. "Выхлоп у нас в а.аут" — потому и формат a.out.
set -e
cd "$(dirname "$0")"
BINDIR="${BINDIR:-$PWD/../bin}"
export objtype=386
echo "1) 8a kern.s — энтрипоинт (стек + вызов kmain)"; "$BINDIR/8a" kern.s
echo "2) 8c kernel.c — ядро (пишет строку в 0xB8000)"; "$BINDIR/8c" kernel.c
echo "3) 8l -H2 -T1M — линк в Plan9 a.out, entry=_start"; "$BINDIR/8l" -o kernel -H2 -T0x100000 -E _start kern.8 kernel.8
echo "4) 8c loader.c — загрузчик a.out (тоже a.out)"; "$BINDIR/8c" loader.c
echo
echo "=== kernel: $(ls -la kernel | awk '{print $5}') байт (Plan9 a.out) ==="
python3 - <<'PY'
import struct
d=open('kernel','rb').read()
m,t,da,b,s,e,sp,pc=struct.unpack('>8L',d[:32])
IM=(((4*11)+0)*11)+7
print(f" magic=0x{m:X} {'= I_MAGIC(386) OK' if m==IM else '(?)'} text={t} data={da} bss={b} entry=0x{e:X}")
print(" константа 0xB8000 в коде:", "да" if d.find(bytes([0,0x80,0x0B,0]),32)>=0 else "нет")
PY
echo
echo "проверка разбора загрузчиком (хостовый gcc): gcc -w -o loader_test loader_test.c && ./loader_test kernel"
|