Рабочее ядро: ASM + C + C++ + Rust, загрузка до GUI и интерактивного шелла - #10
Merged
Conversation
Загрузка (ASM, entry.S): - multiboot-заголовок запрашивает видеорежим 1024x768x32 - identity map первых 4 GiB 2-МиБ страницами (было 2 MiB — VESA framebuffer по 0xFD000000 вызывал page fault) - передача multiboot magic/info в kernel_main Критические исправления (C): - сборка с -mno-red-zone -mno-mmx -mno-sse: компилятор генерировал SSE-инструкции (movdqa) при выключенном SSE — ядро падало с #UD сразу после kernel_main - irq_handler теперь диспетчеризует зарегистрированные обработчики (клавиатура раньше вообще не получала прерываний) - убран sti перед iretq в заглушках прерываний - VESA-драйвер берёт framebuffer из multiboot info вместо захардкоженного адреса; текстовый режим как fallback - VGA: скроллинг, backspace, tab, аппаратный курсор - новый драйвер PIT-таймера (100 Гц, uptime) - клавиатура: кольцевой буфер, Shift/CapsLock/Ctrl, keyboard_getchar() - printf: %lx/%lu/%ld/%p/%z, вывод одновременно на VGA и serial - обработчик исключений печатает rip/err/cr2 и останавливает ядро - GUI-шрифт: глиф '_', строчные буквы (маппинг на заглавные) Новое — C++ (lib/cxx): - куча ядра 16 MiB: free-list аллокатор first-fit со слиянием, kmalloc/kfree/krealloc/kmalloc_aligned/kheap_stats - operator new/delete, минимальный C++ рантайм (freestanding, -fno-exceptions -fno-rtti) - gui_widgets использует настоящую кучу вместо bump-заглушки 64 KiB Новое — Rust (kernel/rust): - staticlib no_std для x86_64-unknown-none, линкуется в ядро - интерактивная оболочка myos>: help/about/langs/mem/alloc/uptime/ echo/clear/reboot/halt, редактирование строки, Ctrl+C - GlobalAlloc поверх C++ кучи (String/Vec работают в ядре) - rust_selftest() проверяет аллокатор при старте Сборка/CI: - Makefile: правила для C++ (g++) и Rust (cargo), флаги freestanding - build_iso.sh работает из любого каталога (в CI запускался из корня и делал cd в несуществующий каталог) - kernel-smoke.yml: установка rust-таргета, QEMU-выход только после полной инициализации, проверка маркеров в serial-логе Проверено в QEMU: загрузка до GUI-рабочего стола 1024x768, оболочка отвечает на команды с клавиатуры, куча выделяет/освобождает 1 МБ. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BAZ4LHbL24XrDLrcyNZeUY
KEYTRON
marked this pull request as ready for review
July 3, 2026 10:31
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Ядро доведено до рабочего состояния
Ядро теперь полностью загружается в QEMU: инициализация → графический рабочий стол 1024×768 → интерактивная оболочка. Как и просилось, в основе четыре языка: ASM, C, C++, Rust.
Почему ядро не работало
kernel_main— код собирался без-mno-sse, компилятор генерировалmovdqaпри выключенном SSE. Добавлены-mno-red-zone -mno-mmx -mno-sse -mno-sse2 -fno-stack-protector -fno-pic.irq_handlerне диспетчеризовал зарегистрированные обработчики; теперь вызывает таблицуinterrupt_handlers.0xE0000000при замапленных всего 2 MiB → page fault. Теперь framebuffer берётся из multiboot info, а entry.S маппит первые 4 GiB.kernel_main— смок-тест ничего не проверял. Выход перенесён после полной инициализации, лог проверяется на маркеры.Что добавлено по языкам
%lx/%p, диагностика исключений (rip/err/cr2)lib/cxx/kheap.cpp): free-list first-fit со слиянием,kmalloc/kfree/krealloc, operator new/delete, минимальный рантаймkernel/rust— no_std staticlib (x86_64-unknown-none): оболочкаmyos>с командами help/about/langs/mem/alloc/uptime/echo/clear/reboot/halt;GlobalAllocповерх C++ кучи (String/Vec работают); selftest при стартеПроверено в QEMU
Rust runtime selftest: OK→ GUI 1024×768×32 → шеллsendkey), шелл отвечает;alloc 1000000выделяет и проверяет 1 МБ, после освобожденияmemпоказывает 0 занятыхQEMU_EXIT=1 ./utils/build_iso.sh+ isa-debug-exit) прогнан локально — проходитСборка
🤖 Generated with Claude Code
https://claude.ai/code/session_01BAZ4LHbL24XrDLrcyNZeUY
Generated by Claude Code