ASELSANMicrokernel
GELİŞTİRME GÜNLÜĞÜ

M2 — Memory Management

M2.1
Adres tipleri + FrameAllocator trait
19 Mayıs 2026 • mm/ modülünün temel iskeleti
TAMAMLANDI
Yapılanlar
  • PhysAddr(u64) — fiziksel adres newtype, as_u64(), as_mut_ptr<T>()
  • VirtAddr(u64) — sanal adres newtype
  • PhysFrame — 4 KiB hizalı fiziksel sayfa, from_start_address()
  • FrameAllocator trait — fn allocate_frame() -> Option<PhysFrame>
  • Tüm tipler Copy + Eq + Debug — sıfır-cost soyutlama
Neden bu önce?
Sayfa tablosu, allocator ve MMU kodu yazmadan önce tip ayrımı şart: bir u64'ün fiziksel mi sanal mı adres olduğunu derleyici zorlamalı. Aksi halde MMU açıldığında "yanlış yerden okuduk mu?" sorusu manuel hâle gelir. Bu küçük yatırım, M2.3+ tüm kodun okunabilirliğini ve güvenliğini taşıyor.
kernel/src/mm/address.rs · frame_allocator.rs (trait) · mod.rs
M2.2
BumpAllocator — Physical Frame Allocator
19 Mayıs 2026 • en basit, en güvenilir başlangıç
TAMAMLANDI
Yapılanlar
  • BumpAllocator { next, end } — monotonik artan pointer
  • Aralık: 0x4020_00000x4800_0000 (kernel'den sonraki RAM)
  • 32 256 frame × 4 KiB = 126 MiB kullanılabilir
  • remaining_frames() — debug/log için
  • FrameAllocator trait'ini implement ediyor
Bump neden, bitmap niye değil?
Boot zamanı sayfa tabloları + kernel heap için sadece ardışık frame'ler gerek; geri verme (free) yok. Bump 5 satırla yazılır, hatasızdır, sıfır-state-bug ihtimali. Asıl genel amaçlı bitmap/buddy allocator M2.6+'ya kalsın — o zaman MMU çalışıyor olacak ve free-list'i heap'te tutabileceğiz.
kernel/src/mm/frame_allocator.rs
M2.3
PageTable + 4-seviye walker (map_4k_page)
19 Mayıs 2026 • aarch64 4K granule, 48-bit VA
TAMAMLANDI
Yapılanlar
  • PageTable — 512 × 8-byte entry, sayfa hizalı
  • PageTableEntryset_address / set_flags / is_table
  • PageTableFlags — bitflags: VALID, TABLE, AP, AF, SH, AttrIdx, UXN, PXN, hazır NORMAL ve DEVICE
  • map_4k_page(virt, phys, flags) — L0→L1→L2→L3 yürüyüş, eksik tabloları EARLY_PAGE_TABLES havuzundan alır
  • get_detailed_mapping(VA) — bir adres için 4 seviyenin descriptor değerlerini döner (doğrulama için)
aarch64 4K descriptor encoding (kritik)
Seviyebits[1:0]Anlam
L011Table
L1/L201Block (1 GiB / 2 MiB)
L1/L211Table (next level)
L311Page (4K) — TEK GEÇERLİ DEĞER
L301RESERVED / Invalid (yasak)
Bu tablo neden önemli: M2.4 testinde L3 entry'lerini yanlışlıkla 0x...601yazdık (bit 1 yoktu → Reserved). CPU sessizce dondu. Açıklaması M2.4 entry'sinde.
kernel/src/mm/paging.rs · kernel/src/arch/aarch64/mmu.rs
M2.4
MAIR + TCR + Identity Mapping + MMU enable
19 Mayıs 2026 • M2'nin en sinir bozucu hatasını içerir
2 HATA → DÜZELTİLDİ
Yapılanlar
  • MAIR_EL1 = 0x00…04ff — Attr0=Normal WB-WA, Attr1=Device-nGnRnE
  • TCR_EL1 = 0x00…800710 — T0SZ=16 (48-bit), 4K granule, Inner/Outer WB-WA, IPS=40-bit
  • Identity map: kernel RAM (128 MiB @ 0x4000_0000, NORMAL), UART (0x0900_0000, DEVICE), GIC (0x0800_0000, DEVICE)
  • 3 adres için derin doğrulama: L0/L1/L2/L3 descriptor'larını ekrana basıp gözle teyit
  • MMU enable sırası: dc civac (tüm tablolar) → MSR TTBR0 → TLBI VMALLE1IS → DSB ISH → ISB → MSR SCTLR_EL1 (M=1, C=1, I=1) → ISB
QEMU çıktısı
[M2.4.1] MAIR: 0x00000000000004ff [M2.4.1] TCR : 0x0000000000800710 [M2.4.2] 4K Identity Mapping + derin doğrulama: VA=0x40000000 L0=0x..d003 L1=0x..e003 L2=0x..f003 L3=0x40000603  ← Page ✓ VA=0x09000000 L3=0x09000407 ✓ (UART, DEVICE) VA=0x08000000 L3=0x08000407 ✓ (GIC, DEVICE) [M2.4.3] 1. dc civac + dsb sy [M2.4.3] 2. TTBR0_EL1 yazılıyor [M2.4.3] 3. TLBI VMALLE1IS [M2.4.3] 4. DSB ISH + ISB [M2.4.3] 5. MMU + Cache enable (SCTLR_EL1) [M2.4.3] 6. Final ISB [M2.4.3] MMU enable sequence tamamlandı.
kernel/src/arch/aarch64/mmu.rs
İlk denemede karşılaştıklarımız
Hata 1 — MMU enable'da SESSİZ kilitlenme (log yok, panic yok, CPU dondu)
L3 descriptor için sadece VALID set edip TABLE bit'ini kapattığımız için entry 0x..601 oldu. ARM 4K granule kuralı (M2.3 tablosunda): L3'te bits[1:0]=01 = Reserved. SCTLR.M=1 sonrası ilk instruction fetch Reserved descriptor'a düştü → translation fault → exception vector için de translation gerek → recursive fault → sessiz freeze.
Fix: map_4k_pageflags | VALID | TABLE. L3'te TABLE bit'i aslında "Page" anlamına geliyor. Entry'ler 0x..603 / 0x..407 oldu, MMU enable geçti.
M2.5
LockedHeap + global_allocator + alloc::Box
19 Mayıs 2026 • kernel'in ilk gerçek dinamik allocation'ı
HEAP ÇALIŞIYOR
Yapılanlar
  • linked_list_allocator = "0.10" + use_spin feature
  • #[global_allocator] static HEAP: LockedHeap
  • init_kernel_heap(&mut bump) — BumpAllocator'dan 2048 ardışık frame al, ilkinin adresi heap base
  • Heap = 8 MiB, identity-mapped RAM içinde (M2.4 mapping'i yeterli, ek map_4k_page çağrısı YOK)
  • Smoke test: alloc::Box::new(0xA5A5_1234) → değer geri okunabiliyor
QEMU çıktısı
[M2] BumpAllocator aralığı: PhysAddr(0x40200000) → PhysAddr(0x48000000) [M2.5] Kernel heap kuruluyor: 0x0000000040200000 + 8 MiB (identity-mapped) [M2.5] 2048 sayfa rezerve edildi, LockedHeap aktif. [M2.5] Kalan frame: 30208 [M2.5] Box::new test: 0xa5a51234 (heap çalışıyor!) [SEC 1] ticks=100 drift=+381 µs [SEC 5] ticks=500 drift=+84  µs ↑ MMU aktif + heap aktif iken bile timer sabit
kernel/Cargo.toml · kernel/src/main.rs (HEAP + init_kernel_heap)
Bu adımda karşılaştıklarımız
Hata 2 — Build: E0152 duplicate lang item in core
linked_list_allocator alloc'a dolaylı bağımlı. Rustup'ın precompiled aarch64-unknown-none target'ı alloc'u kendi core'uyla birlikte sundu; bizimkiler build-std core kullanıyordu → linker iki farklı core gördü, reddetti.
Fix: .cargo/config.tomlbuild-std = ["core", "compiler_builtins", "alloc"]. Artık alloc da bizimle birlikte derleniyor.
Hata 3 — İlk allocation'da Translation fault L0
İlk tasarımda heap base = 0xFFFF_8000_0000_0000 (high-half / TTBR1). Ama TTBR1_EL1 hiç kurulmamıştı. FAR_EL1 = 0xFFFF_8000_0000_0000 tam o adresi gösterdi — DFSC=0x04 (Translation fault, level 0).
Fix: heap'i identity-mapped RAM'e taşı (BumpAllocator zaten o aralıktan veriyor, ek mapping gereksiz). TTBR1 + high-half kernel mapping M2.6+'ya kaldı.
Bonus:M1.2'de "MMU yokken bu test çalıştırılamaz" diyerek handler'a koyduğumuz data abortpanic path'i, Hata 3'ün ilk patlamasında gerçek MMU translation fault'unu yakaladı. Hipotez 3 adım önce kuruldu, bu adımda doğrulandı.