Files
Elyz/kernel/docs/main.md
2026-07-06 00:25:49 +03:00

4.9 KiB
Raw Blame History

Точка входа: src/main.rs

Точка входа ядра (kmain). Инициализирует оборудование, подсистемы памяти, запускает тесты capability и PMActor.

Атрибуты крейта

#![no_std]   // без стандартной библиотеки
#![no_main]  // без точки входа из libc
extern crate alloc;  // аллокатор кучи

Константы

  • KERNEL_FONT: &[u8] — встроенный PSF2 шрифт 8×16 на 512 глифов (включён через include_bytes!("font.psf"))

Limine Boot Protocol Request

Статические переменные в секции .requests (через #[unsafe(link_section = ".requests")]):

Переменная Тип Назначение
MEMORY_MAP_REQUEST MemoryMapRequest Карта физической памяти
HHDM_REQUEST HhdmRequest Higher Half Direct Map offset
KERNEL_ADDR_REQUEST ExecutableAddressRequest Базовые адреса ядра (physical + virtual)
BASE_REVISION BaseRevision Проверка версии Limine
FRAMEBUFFER_REQUEST FramebufferRequest Линейный фреймбуфер
_START_MARKER RequestsStartMarker Маркер начала секции requests
_END_MARKER RequestsEndMarker Маркер конца секции requests

FramebufferDisplay<'a>

Низкоуровневый рендерер пикселей, обёртка над limine::framebuffer::Framebuffer.

impl DrawTarget (embedded_graphics):

  • Color = Rgb888, Error = Infallible
  • draw_iter(pixels) — запись пикселей в память фреймбуфера с проверкой границ

impl OriginDimensions:

  • size() — размеры фреймбуфера

Console<'a> (встроенный, НЕ используется)

Обёртка над FramebufferDisplay. В kmain используется tty::Console, этот — мёртвый код.

Поля: display, x, y, current_color. Методы: new(), set_color(), clear(), scroll(), write_str().


kmain() — точка входа

unsafe extern "C" fn() -> !

  1. Проверка BASE_REVISION.is_supported() — убеждается, что загрузчик поддерживает нужную версию Limine
  2. Получение ответов Limine: фреймбуфер, карта памяти, HHDM offset, адреса ядра
  3. Инициализация tty::Console — создаёт консоль на первом фреймбуфере, чистит экран
  4. Инициализация Serialdebug::serial::init_global() для отладки через COM1
  5. Вывод "BOOT" через info! макрос
  6. Инициализация BitmapPMM — из карты памяти и HHDM смещения
  7. Инициализация LAPICcpu::lapic::init(hhdm_offset) для MMIO доступа к Local APIC
  8. Создание P4 (PML4) — выделяет фрейм, зануляет его
  9. Картирование HHDM — все non-reserved entry памяти маппятся identity + HHDM
  10. Картирование .text секции ядра — по виртуальному базовому адресу
  11. Активация страничных таблицp4.activate(p4_phys) — запись CR3
  12. Выделение кучи 8 MiB — постранично маппится в 0xFFFF_9000_0000_0000
  13. Инициализация SlabAllocatorALLOCATOR.init() с диапазоном кучи
  14. init_cpu_features() — обнаружение INVPCID инструкции
  15. Регистрация адресного пространства ядраvmm::init_kernel_space()
  16. Инициализация IDT — регистрация обработчиков page fault и TLB shootdown
  17. Инициализация PMRouter — 65536 каналов маршрутизации
  18. Включение прерыванийsti инструкция
  19. Тест capability системы: создание CNode, insert/mint/revoke
  20. PMActor + Buddy тест (строки 257-359): создание актора, аллокация, OOM, carve, free+coalescing
  21. Вывод ASCII-арт логотипа
  22. Бесконечный HLThcf()

hcf()

fn hcf() -> ! {
    loop { x86_64::instructions::hlt(); }
}

Бесконечный цикл HLT — снижает энергопотребление, процессор ждёт следующего прерывания.


rust_panic(info: &PanicInfo) -> !

Обработчик паники: пишет информацию в serial, затем вызывает hcf().