Raspberry Pi 4 - İlk Donanım Testi
QEMU'dan gerçek karta ilk çıkış. Amaç: ilk denemede UART üzerinden temiz log alabilmek. Aşağıdaki akışı sırayla takip et.
5V bir adapter RPi4'ün GPIO pinlerini kalıcı olarak yakar. Bağlamadan önce adapterin 3.3V'a ayarlı olduğunu doğrula. TX/RX her zaman çapraz bağlanır.
QEMU'dan Gerçek Karta: İlk Çıkış
Şimdiye kadar tüm geliştirme QEMU virt makinesi üzerinde yapıldı. M0'dan M7'ye kadar olan tüm yetenekler (boot, exception handling, MMU, scheduler, capability sistemi, IPC, user-space) simülasyon ortamında test edildi ve doğrulandı.
- • EL1 bare-metal boot + VBAR + GICv2
- • MMU + 4K paging + kernel heap
- • CFS-lite scheduler + EL0 user task'ler
- • Capability sistemi (CNode + mint/revoke)
- • User-space IPC (SYS_IPC_CALL)
- • Kernel EL2'de başlar (armstub + firmware)
- • EL2 - EL1 geçişi zorunlu
- • Peripheral base 0xFE00_0000
- • UART clock Mailbox ile ayarlanmalı
- • Gerçek Device Tree + GIC-400
QEMU'da Yapılanlar: M0-M7 Teknik Özet
Aşağıdaki işler sadece plan değil; QEMU virt üzerinde log, smoke test ve audit çıktılarıyla doğrulanan kernel yetenekleri. RPi4 testi bu temelin gerçek donanımda tekrar kanıtlanmasıdır.
Boot, exception ve timer altyapısı
- aarch64 bare-metal kernel iskeleti, linker script ve boot.S QEMU virt üzerinde ayağa kaldırıldı.
- PL011 UART ile ilk boot logu alındı; VBAR_EL1 exception vector table aktif edildi.
- Exception handler policy EC bazlı çalışır hale getirildi; sync exception yolu test edildi.
- ARM Generic Timer + GICv2 ile IRQ hattı açıldı, 100 Hz drift-free tick ve irq_lock! altyapısı eklendi.
Memory management ve MMU
- PhysAddr, VirtAddr, PhysFrame ve FrameAllocator tipleriyle fiziksel/sanal adres ayrımı zorlandı.
- BumpAllocator ile kernel sonrası RAM aralığından 4 KiB frame dağıtımı yapıldı.
- 4 seviyeli aarch64 4K page table walker yazıldı; L0-L3 descriptor doğrulaması loglandı.
- MAIR_EL1, TCR_EL1, TTBR0_EL1, TLBI ve SCTLR_EL1 sırasıyla MMU + cache enable akışı doğrulandı.
- Kernel RAM normal memory, UART/GIC device memory olarak identity mapped edildi; LockedHeap ve alloc::Box çalıştırıldı.
Task modeli, context switch ve scheduler
- Task, TaskContext, FP/SIMD state ve context_switch.S ile gerçek task geçiş altyapısı kuruldu.
- CFS-lite scheduler BinaryHeap üzerinde weight, aging ve min_vruntime mantığıyla çalıştırıldı.
- Soft preemption ile timer tick NEED_RESCHED bayrağına dönüştürüldü; sonra IRQ-driven preemption yolu düzeltildi.
- Audit sırasında TaskContext offset, TCR shareability ve dead-task queue sızıntısı dahil kritik buglar kapatıldı.
EL0 user mode ve syscall yolu
- EL0 user task çalıştırıldı; SVC tabanlı syscall dispatch yolu kuruldu.
- User/kernel boundary için register sözleşmesi, task stack boyutu ve return path düzeltildi.
- Framebuffer capability modeliyle UI server/client ayrımı ve sınırlı grant/revoke akışı denendi.
- Region-based kernel mapping ile .text/.rodata/.data ayrımı için linker symbol tabanlı haritalama hazırlandı.
Capability sistemi ve provenance
- Generic Capability modeli, CNode yapısı ve capability provenance metadata katmanı eklendi.
- Memory, TCB, Untyped, Framebuffer ve Endpoint object kindleri aynı cap sistemi altında toplandı.
- Mint, derive ve revoke akışları loglanabilir hale getirildi; forensic bilgi için parent/lifetime/revoker alanları tutuldu.
- EL0 IRQ preempt senaryosu ile user taskların timer altında kesilip tekrar schedule edilebildiği gösterildi.
EL0 IPC, rights enforcement ve reply cap lifecycle
- Endpoint capability üzerinden SYS_IPC_CALL, SYS_IPC_RECV ve SYS_IPC_REPLY uçtan uca çalıştırıldı.
- Server/client iki ayrı EL0 task olarak mesajlaştı; CALL block, RECV pickup, REPLY wake semantiği doğrulandı.
- Endpoint ownership, reply_cap doğrulaması, pending queue ve revoke drain davranışları audit ile sertleştirildi.
- RECV/REPLY rights checks, one-shot reply_cap cleanup ve mesaj kaybı riskini kapatan pending queue düzeltmeleri eklendi.
Bu sayfa, QEMU'da çalışan sistemin ilk kez gerçek silikon üzerinde (Raspberry Pi 4) ayağa kalkması için gereken adımları içerir. Amaç: ilk denemede UART üzerinden temiz, okunabilir log alabilmek.
1. Gerekli Donanım
İlk gerçek donanım bring-up hedef kartı.
FAT32 boot partition ve kernel8.img için kullanılır.
Boot loglarını seri port üzerinden almak için gerekir.
TX, RX ve GND hatlarını çapraz bağlamak için kullanılır.
Fiyatlar 21 Mayıs 2026 tarihinde kontrol edilen referans değerlerdir; stok, kargo ve kampanya bilgileri satıcı tarafında değişebilir.
2. Derleme Süreci
Board-specific feature'ları aktif ederek RPi4 imajını oluşturun:
make clean
make image-rpi4Bu komut linker-rpi4.ld dosyasını kullanır ve çıktı olarak kernel8.img üretir.
3. SD Kart Hazırlığı

Kartı FAT32 (tek partition) olarak biçimlendirin ve şu dosyaları köke kopyalayın:
Önerilen config.txt
arm_64bit=1
kernel=kernel8.img
enable_uart=1
dtoverlay=disable-bt
uart_2ndstage=14. UART Bağlantısı

Pin Şeması (çapraz)
- GPIO 14 (TX) → Adapter RX
- GPIO 15 (RX) → Adapter TX
- GND → Adapter GND
Terminal Ayarı
- Baud: 115200
- 8-N-1 (Data-Parity-Stop)
- picocom -b 115200 /dev/ttyUSB0
5. Pre-Flight Checklist
Güç vermeden önce her maddeyi tek tek doğrula ve işaretle. İşaretler tarayıcında saklanır.
6. Test Sırasında: Beklenen Senaryolar
İlk denemede en olası 4 durum ve nasıl tepki vereceğimiz. Hangisini gördüğünü bana bildir, oradan ilerleriz.
Olası sebep: config.txt eksik/yanlış, UART pinleri ters bağlı veya disable-bt yok.
Ne yapalım: config.txt'i doğrula, TX/RX çapraz mı kontrol et, dtoverlay=disable-bt ekle.
Olası sebep: UART clock (mailbox) baud hızıyla uyuşmuyor.
Ne yapalım: 115200 baud'u doğrula, mailbox clock log'una bak, uart_2ndstage=1 ekle.
Olası sebep: EL2 to EL1 geçişi veya stack kurulumu sorunu.
Ne yapalım: Erken boot log'larını paylaş; exception vector + stack init'i gözden geçirelim.
Olası sebep: GIC / Timer / Scheduler init'inde kilitlenme.
Ne yapalım: Takıldığı son satırı not et; hangi init aşamasında durduğunu bildir.
7. Logları Yakalama ve Raporlama
İlk 20-30 saniyelik logu mutlaka dosyaya kaydet. Analiz için en değerli veri budur.
Log kaydı için seçenekler
# picocom ile (önerilen)
picocom -b 115200 /dev/ttyUSB0 --logfile rpi4-test.log
# veya screen
screen -L /dev/ttyUSB0 115200
# veya basit tee
cat /dev/ttyUSB0 | tee rpi4-test.logSonra şu şablonu doldurup bana gönder:
=== RPi4 İlk Test Raporu ===
Build komutu: make image-rpi4
config.txt içeriği: (yukarıdaki gibi mi?)
UART çıktısı (en önemli kısım):
[Buraya logları yapıştır]
Son gördüğün satır:
[örn: [M8.1] UART Clock (from mailbox): 48000000 Hz]
Çıkan sorun:
[ ] Hiçbir şey çıkmadı
[ ] Çöp karakter çıkıyor
[ ] Belli bir yere kadar log geldi sonra durdu
[ ] Kernel panic / reset attı
Ek notlar:
...