kva: implement dynamic VA allocator to remove fixed VAs (H6)
Created kernel virtual address allocator to replace fixed VAs:
- include/kva_alloc.h: KVA allocator interface
- src/kernel/kva_alloc.c: Bitmap-based allocator with spinlock protection
- Region: 0xC0500000 .. 0xC0800000 (3 MB, 768 pages)
- kva_alloc_init(): Initialize bitmap and spinlock
- kva_alloc_pages(): Allocate contiguous page range
- kva_free_pages(): Free allocated range
Migrated fixed VA usages to dynamic allocation:
- src/hal/x86/mm.c: hal_mm_map_physical_range() now uses kva_alloc_pages
instead of fixed KVA_PHYS_MAP (0xDC000000U)
- src/drivers/virtio_blk.c: virtio vring allocation now uses kva_alloc_pages
instead of fixed VIRTIO_VRING_VA (0xC0340000U)
Removed obsolete constants:
- include/arch/x86/kernel_va_map.h: Removed KVA_PHYS_MAP constant
Updated layout comment to document KVA allocator region
Boot integration:
- src/kernel/main.c: Added kva_alloc_init() call after kheap_init()
Validation:
- make -j$(nproc): PASS
- make test SMOKE_SMP=4: 131/131 PASS
- make test-battery: 157/157 PASS
This completes H6: remove fixed VAs, replacing hardcoded virtual
addresses with dynamic allocation to prevent collisions and improve
architectural flexibility.