- Created driver framework with probe/init lifecycle. Drivers register via
REGISTER_DRIVER macro which places pointers in a .drivers linker section.
- During boot, init_drivers() iterates the section, probes each driver
(checking if hardware is present), and initializes those that respond OK.
- Added .drivers section to linker.ld with __drivers_start/__drivers_end
symbols for iteration.
- Also added .rodata.* pattern to the .rodata section for string literals
placed in sub-sections by the compiler.
- No drivers are registered yet; the VGA driver will be the first.
Tested: boots cleanly with driver scan completing (0 registered, 0 loaded).
- Added first-fit free-list allocator with block splitting and coalescing.
Provides kmalloc(), kfree(), and kcalloc() for kernel-space dynamic memory.
- Each block carries an inline header with a magic value (0xCAFEBABE) for
heap corruption detection, plus double-free checking.
- Memory is obtained from the paging subsystem in 4 KiB page increments.
All allocations are 8-byte aligned with a 16-byte minimum block size.
- Created freestanding string.c with memset, memcpy, memmove, memcmp,
strlen, strcmp, strncmp, strcpy, strncpy — replacing the unavailable
libc implementations.
- Added documentation in docs/kmalloc.md.
Tested: kmalloc(64) returns 0xD0001010 (in kernel heap) and kfree succeeds.
Works with both 4 MiB and 128 MiB RAM.
- Created two-level x86 paging (page directory + page tables) with 4 KiB pages.
- Identity maps all detected physical memory in two phases:
1) Static: first 16 MiB using 4 BSS-allocated page tables (avoids
chicken-and-egg with PMM bitmap in BSS).
2) Dynamic: memory above 16 MiB using PMM-allocated page tables,
created before paging is enabled so physical addresses still work.
- Provides kernel heap at 0xD0000000–0xF0000000 for virtual page allocation.
- API: paging_map_page, paging_unmap_page, paging_alloc_page, paging_free_page,
paging_get_physical.
- Added pmm_get_memory_size() to expose detected RAM for paging init.
- Kernel tests paging by allocating a virtual page, writing 0xDEADBEEF, and
reading it back, then freeing it.
- Added documentation in docs/paging.md.
Tested: boots and passes paging test with both 4 MiB and 128 MiB RAM in QEMU.
- Added bitmap-based physical memory manager (PMM) that parses the Multiboot2
memory map to discover available RAM regions.
- Supports two allocation zones: PMM_ZONE_DMA (below 16MB) and PMM_ZONE_NORMAL
(above 16MB), with automatic fallback from NORMAL to DMA when the preferred
zone is exhausted.
- Marks kernel memory region and multiboot info structure as reserved using
_kernel_start/_kernel_end linker symbols.
- Page 0 is always marked as used to prevent returning NULL as a valid address.
- Added linker script symbols (_kernel_start, _kernel_end) to track kernel
memory boundaries for the allocator.
- Kernel now initializes PMM after PIC and performs test allocations to verify
the subsystem works.
- Reworked IDT initialization to register all 32 CPU exception handlers (ISR 0-31)
and 16 hardware interrupt handlers (IRQ 0-15, mapped to IDT entries 32-47).
- Created assembly stubs in interrupts.S using macros for ISRs with and without
error codes, plus IRQ stubs. All route through a common stub that saves
registers, loads kernel data segment, and calls the C handler.
- Added isr.c with a unified interrupt dispatcher that handles both exceptions
(halts on fault) and hardware IRQs (sends EOI via PIC).
- Implemented PIC (8259) driver in pic.c with full initialization sequence that
remaps IRQ 0-7 to IDT 32-39 and IRQ 8-15 to IDT 40-47. Includes mask/unmask
and EOI support.
- Extracted port I/O primitives (inb, outb, io_wait) into port_io.h header for
reuse across drivers.
- Kernel now initializes PIC after IDT and enables interrupts with STI.
This commit adds GDT initialization with proper code/data segments and reloads CS.
It also adds the initial IDT structure and loads an empty IDT.
Build configuration updated to disable SSE/MMX to prevent compiler generation of unsupported instructions in early boot.