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

M4 — EL0 + Syscall

M4
EL0 User Mode + Syscall + UI Capability Model
19 Mayıs 2026 • 5 alt adım — 2 tamamlandı (M4.3, M4.4), 3 plan
USER TASK + FB CAP ÇALIŞIYOR
M4.1
EL0 sayfa izinleri
PageTableFlags::USER_NORMAL (AP[1]=1) eklendi; ayrı user address space hala plan
M4.2
EL1 → EL0 eret
user_first_kernel_entry + initial_eret_to_user; spike olarak çalışıyor
✓ M4.3
SVC syscall dispatch
sys_write, sys_yield, sys_exit — full user lifecycle
✓ M4.4
UI Framebuffer Capability
Cap + Grant + per-task root mapping + revoke
M4.5
EL0 IRQ preemption
Timer IRQ EL0 → EL1 → context save → resume
M4 boyunca 5 + 3 = 8 bug tespit edildi ve düzeltildi (3'ü kritik silent corruption): aynı x9-base register hatası 3 farklı asm bloğunda, inline asm register-allocation race, kernel stack overflow, heap-clobbering page-table fallback. M4.3 + M4.4 commit'leri:091f4e7 · ac9be09 · 546801b.
M4.3
EL0 User Task + Syscall Dispatch
19 Mayıs 2026 • 5 bug, hepsi silent — full lifecycle pass
USER LIFECYCLE TAMAM
Yapılanlar
  • Task::is_user + spawn_user_task + user_first_kernel_entry
  • eret ile EL1 → EL0 ilk geçiş + saved user context (ELR, SPSR, SP_EL0, x0–x30)
  • rust_el0_sync_handler — SVC dispatch (x8=syscall id, x0–x2=args)
  • Sistem çağrıları: sys_write, sys_yield, sys_exit
  • return_to_user_from_yield — yield sonrası tekrar EL0'a iniş
QEMU çıktısı
[User] Hello from EL0 via sys_write! [User] Still alive, yielding... (×3) [User] Time to exit cleanly. task_exit() Dead 10 sn sonra: [SEC 1..9] drift sabit [Kern-A] iter 2 117 500 000 PANIC YOK, ABORT YOK
kernel/src/arch/aarch64/mod.rs (return_to_user, initial_eret_to_user)
kernel/src/task/scheduler.rs (user_first_kernel_entry)
kernel/src/arch/aarch64/exceptions.rs (rust_el0_sync_handler)
kernel/src/main.rs (user_yield_loop)
userspace/hello/ — standalone EL0 binary (70 KB ELF)
5 sinsi bug — tasarlanmıştan farklı bir hikaye
A. x9 base self-clobber (3 fonksiyon)
ldp x8, x9, [x9, #64] x9'u ezdiği için sonraki ldp x10, x11, [x9, #80] NULL+0x50'ye düşüyordu — FAR_EL1=0x50 ile birebir.
Fix: base x9 → x16 (IP0), x16/x17 slot atlandı. user_first_kernel_entry + return_to_user + initial_eret_to_user.
B. inline asm {0} register race
User syscall'larında mov x1, {0}; LLVM {0}'a x1 atayınca mov x8, #2 tarafından eziliyordu → svc'ye x1=0x2 garbage.
Fix: explicit in("x1") buf, closure'lara sarıldı.
C. Kernel stack overflow → adjacent task corruption
16 KiB stack yetersiz: task_exit sonrası PriorityTask::partial_cmp adjacent Box<Task>'in çöpe çıkmış 0x3d8 offset'inden okuyordu.
Fix: tüm task stack'leri 64 KiB. Guard page TODO M5/Audit #18.
M4.4
UI Framebuffer Capability Model
19 Mayıs 2026 • Kernel-mediated framebuffer + grant/revoke + per-task mapping
SMOKE TEST PASS
Tasarım
  • Kernel framebuffer fiziksel sayfalarının tek sahibi (FramebufferCap)
  • Owner FramebufferGrant ile başka task'lere kısıtlı yetki verir (READ/WRITE/VSYNC/DMA bitmask + sub-region)
  • Grant verilirken kernel hedef task'in kendi page table root'una map'liyor (per-task address space)
  • revoke_grant + cascade revocation iskeleti — TLB invalidate ile
  • FramebufferRegion dirty rect + vsync_subscribed event modeli iskeleti
QEMU çıktısı (smoke test)
[M4.4] FramebufferCap#1 oluşturuldu (1024x768 BGRA) [FB] Mapping → root=0x4001f000 VA=0x3c000000 (task 100) [M4.4] UI Server (task 100) Grant#1 (FULL) [FB] Caps: 1 | Grants: 1 [FB] Mapping → root=0x4001f000 VA=0x3c000000 (task 200) [M4.4] Client (task 200) Grant#2 (WRITE|VSYNC, 400x300@100,100) [FB] Caps: 1 | Grants: 2 [M4.4] Client Grant#2 revoke ediliyor... [FB] Grant#2 revoked (owner=200, grantee=200) [FB] Caps: 1 | Grants: 1 [M4.4] smoke test TAMAMLANDI. 12 sn sonra: 34 017 satır log, PANIC YOK.
kernel/src/ui/framebuffer.rs · mod.rs · scene.rs · capability.rs
kernel/src/mm/address_space.rs (per-task root) · arch/aarch64/mmu.rs (map_4k_page_to_root)
3 fix — biri büyük heap corruption
A. use alloc::format eksik
revoke_grant cascade log'unda format! çağrısı var ama alloc::format import edilmemişti.
B. orphan present_grant
Fazladan bir } impl bloğunu erken kapatıyor, present_grant impl dışında kalıyordu. Yeni impl FramebufferManager bloğuna sarıldı.
C. heap-clobbering fallback (KRİTİK)
Task root yoksa unwrap_or(0x40200000) kernel heap başına işaret ediyordu. Mapping orayı page table sanıp caps Vec'in ilk frame'ini parçalıyordu → cap.id garbage → "FramebufferCap not found" panic. Caps.len() hâlâ 1, sadece içerik çöp.
Fix: fallback = kernel root page table.
M4.1
Region-based kernel mapping (linker symbols)
.text=RX-U, .rodata=R-U+NoExec, .data=RW+NoUser+NoExec
3 BLOCKER AÇILDI
Yapılanlar
  • linker.ld: __text_start..end, __rodata_*, __data_*, __bss_*, __stack_top, __kernel_end sembolleri
  • PageTableFlags: KERNEL_TEXT (R+X+U), KERNEL_RODATA (R+U+UXN+PXN), KERNEL_DATA (RW+NoUser+UXN+PXN)
  • setup_initial_identity_mapping: her bölgeyi ayrı flag'le map ediyor (eskiden tek NORMAL idi)
  • spawn_user_task_with_arg: u64 argüman desteği (saved_user_gprs[0] → eret sonrası x0)
QEMU çıktısı
[M4.1] regions: text   0x40000000..0x40018000   (96 KB · RX+U) rodata 0x40018000..0x40027000   (60 KB · R+U+NX) data   0x40027000..0x40028000   (4 KB · RW-U+NX) bss    0x40028000..0x4082c000   (8.1 MB · RW-U+NX) stack_top=0x4083c000 kend=0x4083c000 [M6.4] Paylaşılan IPC endpoint mint: id=5 [M6.4] IPC Server + Client spawn (ep arg=5) [IPC-Server] recv loop basliyor          ← EL0 .rodata OK! [M6.4] SYS_IPC_RECV task=6 ep=5          ← syscall + arg OK [M6.4] RECV pending yok → task block     ← cap validation PASS [IPC-Client] call loop basliyor [IPC-Client] CALL gonderiliyor [M7] SYS_IPC_CALL task=7 → target=5      ← cap validation PASS
M4.1 sayesinde açılan 3 blocker
M5.5 ⚠️ → 🟡
Kernel .text=RX-U / .data=RW+UXN ayrımı geldi (Audit #11). Stack guard page hâlâ ayrı bir iş.
M6.4 ❌ → ✅
M4.1 region mapping ile syscall yolu açıldı. Sonraki adım (M6 audit) ile is_receive_on_own + register layout + 3 silent bug daha kapatıldı → 3/3 round-trip reply DOGRU. Detay: aşağıdaki M6 audit kartı.
Kernel security daraltıldı
.data ve .bss artık EL0'a kapalı — kernel secrets izole. Aynı zamanda .text read-only (W^X kısmen).