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() -
FrameAllocatortrait —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_0000→0x4800_0000(kernel'den sonraki RAM) - 32 256 frame × 4 KiB = 126 MiB kullanılabilir
-
remaining_frames()— debug/log için -
FrameAllocatortrait'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ı -
PageTableEntry—set_address/set_flags/is_table -
PageTableFlags— bitflags: VALID, TABLE, AP, AF, SH, AttrIdx, UXN, PXN, hazırNORMALveDEVICE -
map_4k_page(virt, phys, flags)— L0→L1→L2→L3 yürüyüş, eksik tablolarıEARLY_PAGE_TABLEShavuzundan 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)
| Seviye | bits[1:0] | Anlam |
|---|---|---|
| L0 | 11 | Table |
| L1/L2 | 01 | Block (1 GiB / 2 MiB) |
| L1/L2 | 11 | Table (next level) |
| L3 | 11 | Page (4K) — TEK GEÇERLİ DEĞER |
| L3 | 01 | RESERVED / 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_page → flags | 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_spinfeature -
#[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 corelinked_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.toml → build-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ı.