4.9 KiB
4.9 KiB
Точка входа: 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 = Infallibledraw_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() -> !
- Проверка
BASE_REVISION.is_supported()— убеждается, что загрузчик поддерживает нужную версию Limine - Получение ответов Limine: фреймбуфер, карта памяти, HHDM offset, адреса ядра
- Инициализация
tty::Console— создаёт консоль на первом фреймбуфере, чистит экран - Инициализация Serial —
debug::serial::init_global()для отладки через COM1 - Вывод "BOOT" через
info!макрос - Инициализация BitmapPMM — из карты памяти и HHDM смещения
- Инициализация LAPIC —
cpu::lapic::init(hhdm_offset)для MMIO доступа к Local APIC - Создание P4 (PML4) — выделяет фрейм, зануляет его
- Картирование HHDM — все non-reserved entry памяти маппятся identity + HHDM
- Картирование .text секции ядра — по виртуальному базовому адресу
- Активация страничных таблиц —
p4.activate(p4_phys)— запись CR3 - Выделение кучи 8 MiB — постранично маппится в
0xFFFF_9000_0000_0000 - Инициализация SlabAllocator —
ALLOCATOR.init()с диапазоном кучи init_cpu_features()— обнаружение INVPCID инструкции- Регистрация адресного пространства ядра —
vmm::init_kernel_space() - Инициализация IDT — регистрация обработчиков page fault и TLB shootdown
- Инициализация PMRouter — 65536 каналов маршрутизации
- Включение прерываний —
stiинструкция - Тест capability системы: создание CNode, insert/mint/revoke
- PMActor + Buddy тест (строки 257-359): создание актора, аллокация, OOM, carve, free+coalescing
- Вывод ASCII-арт логотипа
- Бесконечный HLT —
hcf()
hcf()
fn hcf() -> ! {
loop { x86_64::instructions::hlt(); }
}
Бесконечный цикл HLT — снижает энергопотребление, процессор ждёт следующего прерывания.
rust_panic(info: &PanicInfo) -> !
Обработчик паники: пишет информацию в serial, затем вызывает hcf().