summaryrefslogtreecommitdiff
path: root/kernel/README.md
diff options
context:
space:
mode:
authorclaude <[email protected]>2026-07-12 01:31:26 +0000
committerclaude <[email protected]>2026-07-12 01:31:26 +0000
commitc480e76433f9bb8ce8ce9d5802cdada8883db184 (patch)
treef84928e5a12c234ec44e899198dca9a41d02170b /kernel/README.md
parenta4dce7f4d920e492d38c32ad3e42efdcfef3b3f1 (diff)
downloadplan9-kencc-linux-c480e76433f9bb8ce8ce9d5802cdada8883db184.tar.gz
plan9-kencc-linux-c480e76433f9bb8ce8ce9d5802cdada8883db184.zip
🌭 kernel/: болваночное ядро (пишет в 0xB8000) + загрузчик Plan9 a.out
- kernel.c + kern.s: 386-ядро, пишет строку в VGA-текстбуфер 0xB8000, halt. Собирается 8a+8c+8l в Plan9 a.out (I_MAGIC, entry 0x100000). - loader.c: загрузчик a.out (не ELF — выхлоп у нас a.out): разбор big-endian заголовка, загрузка сегментов по entry, зануление bss, прыжок. - проверено: kernel = валидный a.out с 0xB8000 в коде; loader.aout_parse корректно разбирает реальное ядро (entry/размеры сходятся). - bin/: добавлены 8a, 8l (386 ассемблер + линкер). Co-Authored-By: Claude Opus 4.8 <[email protected]>
Diffstat (limited to 'kernel/README.md')
-rw-r--r--kernel/README.md40
1 files changed, 40 insertions, 0 deletions
diff --git a/kernel/README.md b/kernel/README.md
new file mode 100644
index 0000000..1e711ae
--- /dev/null
+++ b/kernel/README.md
@@ -0,0 +1,40 @@
+# kernel — болваночное ядро + загрузчик (Plan9 a.out)
+
+Ядро-болванка, которое пишет строку в VGA-текстбуфер **0xB8000**, и **загрузчик**,
+который грузит его. Всё в формате **Plan9 a.out** (не ELF) — потому что наш kencc-выхлоп
+именно a.out; загрузчик разбирает a.out-заголовок, а не ELF.
+
+## Файлы
+* `kern.s` — энтрипоинт на 386-асме: ставит стек, зовёт `kmain`.
+* `kernel.c` — ядро: пишет `PLAN9 KERNEL STUB -> writes to 0xB8000` в 0xB8000.
+* `loader.c` — загрузчик Plan9 a.out: разбор заголовка (big-endian), загрузка
+ сегментов `[text][data]` по адресу линковки, обнуление bss, прыжок в entry.
+* `loader_test.c` — хостовый тест: прогоняет `aout_parse` из настоящего загрузчика на
+ собранном ядре и печатает поля (magic/entry/размеры).
+* `mkboot.sh` — сборка: `8a`+`8c`+`8l` -> `kernel` (a.out), `8c` -> `loader.8`.
+
+## Сборка
+```sh
+BINDIR=../bin ./mkboot.sh
+```
+
+## Формат Plan9 a.out (386)
+32-байтный заголовок, **big-endian**, 8 полей по 4 байта:
+```
+magic text data bss syms entry spsz pcsz
+```
+`magic == I_MAGIC == 0x1EB` (intel 386). Сегменты идут сразу за заголовком:
+`file[32 .. 32+text]` = text, дальше data. Загрузчик копирует их по `entry`
+(равен `-T` линкера, тут `0x100000`), зануляет bss и прыгает в `entry`.
+
+## Что проверено
+```
+kernel: Plan9 a.out, magic=0x1EB (I_MAGIC 386), entry=0x100000,
+ константа 0xB8000 присутствует в коде.
+loader: aout_parse на реальном kernel -> OK, entry=0x100000, text/data сходятся.
+```
+Реальный запуск в QEMU/Bochs не гонялся (в контейнере нет эмулятора), но kernel —
+валидный a.out, а загрузчик корректно его разбирает и знает, куда грузить и куда прыгать.
+
+> Хочешь под GRUB/multiboot — можно докинуть a.out→ELF-обёртку; здесь же честный
+> a.out-путь под твоё «выхлоп у нас в а.аут».