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

M9 — Device Tree

D + E + M9.1 paralel denetim
RPi5 + QEMU virt cilalama + DT walk debug — 18 paralel araştırma
Aynı yöntemle 3 başlık paralel keşif: gerçek donanım yolu net.
18/18 RAPOR · YOL HARİTASI HAZIR
D · RPi5 / BCM2712 (6 rapor)
  • SoC: Cortex-A76 ARMv8.2, EL2 entry, x0=DTB; RAM @ 0x0, kernel @ 0x80000
  • UART: PL011 UART10 @ 0x10_7D00_1000 (40-bit PA gerek, TCR_EL1.IPS=0b101)
  • GIC-400 (GICv2) @ 0x10_7FFF_9000 / 0x10_7FFF_A000
  • Boot: kernel_2712.img + ARM64 Linux Image header (64 byte) + config.txt enable_uart=1
  • Board abstraction: arch/aarch64/board/qemu_virt.rs + rpi5.rs + ayrı linker scripts
E · QEMU virt cilalama (6 rapor)
  • GICv3: atlanabilir — RPi5 zaten GICv2 (yatırım boşa gitmez)
  • Timer: CNTV+CVAL drift-free ✓; sadece per-CPU init helper eksik (SMP için)
  • PSCI: system_off/reset/cpu_on SMC tabanlı; 100 satır
  • ramfb: fw_cfg@0x09020000 DMA + RamFbCfg (28 B BE); GTK pencerede pixel çıkışı
  • virtio-blk: defer — virtio-drivers crate ile M9.5'te
  • SMP: percpu.rs hazır; PSCI CPU_ON + secondary_start asm
M9.1 walk() bug (6 rapor)
  • Kök neden: ptr::add() allocation dışı = UB; LLVM opt-level=z + lto=true ile loop kapatılıyor
  • Padding spec: offset-from-DTB-base (mutlak değil); aligned DTB'de eşdeğer ✓
  • Çözüm: byte-offset &[u8] slice + bound-check'li iter (repnop/fdt patterni). walk_v2 yazıldı, gerçek DTB'de validate edilecek
  • Synthetic 103-byte test DTB hazır; M9.1 mini-test bench için
Net yol haritası (paralel araştırmadan çıkan)
M9.2  Board abstraction (arch/aarch64/board/{mod,qemu_virt,rpi5}.rs) M9.3  PSCI shutdown/reset + panic handler integration            (~150 LoC) M9.4  Per-CPU timer init helper + secondary entry asm + PSCI CPU_ON M9.5  Linker_rpi5.ld + ARM64 Linux Image header + kernel_2712.img build M9.6  RPi5 ilk boot: SD kart + config.txt + serial → "HELLO from BCM2712" M9.7  walk_v2 RPi5 gerçek DTB ile validate                       (TCG bug bypass) M10   ramfb framebuffer (GTK'da pixel çıkışı, ASELSAN UI fundamenti) M11   virtio-blk (persistent storage, dynamic ELF loading) M12   SMP bring-up: 4 core round-robin scheduling
M6.4 regression durumu
[M9.1] DTB header: magic=0xd00dfeed totalsize=0x100000 struct=0x1b88 version=17 boot_cpu=0 [M9.1] walk_v2 QEMU TCG'de geçici disabled — RPi5/U-Boot DTB ile validate edilecek [IPC-Client] reply DOGRU (echo+1) - hedef ile esleshme PASS    x3    ← regression-free [IPC-Client] 3 cagri tamam, exit task_exit() name='IPC-Server'/'IPC-Client' state=Dead
M9.1
Device Tree parser — RPi5 + telefon SoC için temel yatırım
QEMU virt'i aşıp gerçek donanıma çıkmanın ilk adımı. U-Boot/Linux aarch64 boot protokolü.
HEADER PARSE OK + BOOT PROTOKOLÜ
Kazanım
  • kernel/src/dt.rs modülü: FdtHeader + walk + memory + bootargs API'leri
  • boot.S: x0 (DTB phys) callee-saved x19'a save → _start_rust(dtb_phys: u64) imzası
  • Linux/U-Boot/QEMU aarch64 standart boot protokolü destekleniyor
QEMU self-test
  • Gömülü qemu-virt.dtb (1 MiB, 8-byte aligned) ile self-test
  • Header doğrulandı: magic=0xd00dfeed v17 size=0x1b88
  • walk() QEMU TCG'de hang üretiyor — RPi5/U-Boot'ta validate edilecek
Yol haritası
  • D — Raspberry Pi 5 target/linker/boot iskeleti
  • E — QEMU virt GICv3 + timer + framebuffer cilalama
  • B — SMP bring-up (RPi5'te gerçek secondary core)
QEMU log
[M9.1] DTB phys=0x0000000000000000 (boot protokolünden x0) [M9.1] x0=0 / invalid magic (QEMU ELF boot beklenen). Gömülü QEMU virt DTB ile self-test: [M9.1] embedded DTB phys=0x0000000040021cd0 size=1048576 bytes (align8=true) [M9.1] DTB header: magic=0xd00dfeed totalsize=0x100000 struct=0x1b88 version=17 boot_cpu=0 [M9.1] walk() QEMU TCG'de geçici disabled — header parse OK, memory/bootargs RPi5 testinde validate edilecek [IPC-Client] reply DOGRU (echo+1) - hedef ile esleshme PASS    x3    ← M6.4 regression-free [IPC-Client] 3 cagri tamam, exit task_exit() name='IPC-Server'/'IPC-Client' state=Dead
Niye bu önemli
QEMU'dan ilk çıkış
DT olmayan kernel = QEMU virt'e çakılı. M9.1 ile RPi5 ve telefon SoC'leri için aynı parser kullanılır — tek seferlik yatırım.
Standart boot protokolü
U-Boot / Linux aarch64 convention'ı tam destekleniyor: x0=DTB phys. RPi5 + Snapdragon U-Boot port'ları doğrudan boot edebilir.
Audit borç temizliği önceden
M9.1'den önce task_exit TTBR0 cleanup + ELF kernel essentials map fix'leri yapıldı → temiz zemin üzerinde DT inşası.
SIRADAKİ
Kalan açık uçlar
M5 tek küçük gap + M6/M7 multi-core + 2 bağımsız task lifecycle bug'ı
DEVAM
  • ✅ M5.1–5.4 — Generic Capability + provenance + CNode + mint/derive/revoke + 5 object kind hazır
  • ✅ M6.1 · M6.3 · M6.4 — Endpoint cap + kernel msg queue + Reply Cap + tam EL0 IPC akışı
  • ✅ M7.1–M7.5 — IPC ABI + rights enforcement + reply cap one-shot + revoke wake — 10/10 audit yeşil
  • ✅ M5.5 + M7.4 + M8.2 stack mapping — Kapsamlı denetimle çözüldü (üst kartta detay). User stack USER_NORMAL + guard unmapped + per-task TTBR0/ASID. Kernel hung gitti. M7-Server EL0'da sys_write çalışıyor, hello-elf ELF EL0'da "He" yazıp exit ediyor.
  • 🟡 M5.5 stack guard fault handler — Guard page map edilmiyor (Strategy A), overflow translation fault üretir; handler'da "stack overflow in task #N" branch'i opsiyonel.
  • 🟡 M7.4 demo helper bug — M7-Server u_list_my_endpoints + u_print_hex EL0 abort (kapsam dışı, helper'lar basitleştirilince çalışır).
  • ✅ Task exit TTBR0 cleanuptask_exit() artık switch_to_kernel_address_space() çağırıyor; ELF kernel essentials mapping de 2 MiB → 128 MiB'a çıkarıldı. M6.4 0 DATA ABORT ile geçiyor.
  • ✅ M9.1 Device Tree parser — kernel/src/dt.rs + boot.S x0 protokolü + QEMU self-test (üst kartta detay).
  • 🟡 M9.1 walk() TCG hang — Gömülü DTB ile QEMU TCG'de hang; RPi5/U-Boot'ta validate edilecek.
  • 🟡 M8 ELF demo — hello-elf entry'de undefined instruction (binary'nin kendi prologue bug'ı). Geçici disable.
  • 🟡 M6/M7 multi-core — Single-core OK; SMP'de ipc_blocked_tasks + ENDPOINT_REGISTRY için per-CPU lock