Bir bootloader nasıl çalışır? Uygulamaya atlama ve güvenli firmware güncellemesi nasıl tasarlanır?
Cevap
Bootloader, reset sonrası ilk çalışan küçük programdır. Görevleri: geçerli bir uygulama olup olmadığını kontrol etmek, gerekiyorsa yeni firmware'i (UART, USB, CAN, OTA) alıp Flash'a yazmak ve uygulamaya atlamak.
Flash yerleşimi
| Bölge | Adres (örnek) | İçerik |
|---|---|---|
| Bootloader | 0x08000000 | 32 KB |
| Uygulama | 0x08008000 | Vektör tablosu + kod |
| Metadata | Son sektör | Versiyon, CRC, imza, boot bayrakları |
Uygulama linker script'inde Flash başlangıcı 0x08008000 olarak ayarlanmalıdır.
Uygulamaya atlama (Cortex-M)
#define APP_ADDR 0x08008000UL
typedef void (*app_entry_t)(void);
void jump_to_app(void) {
uint32_t sp = *(volatile uint32_t *)APP_ADDR;
uint32_t reset = *(volatile uint32_t *)(APP_ADDR + 4);
if ((sp & 0x2FFE0000UL) != 0x20000000UL) return; /* geçerli SRAM mı? */
__disable_irq();
SysTick->CTRL = 0;
/* kullanılan çevresel birimleri ve saatleri sıfırla, NVIC bekleyenleri temizle */
for (int i = 0; i < 8; i++) { NVIC->ICER[i] = 0xFFFFFFFF; NVIC->ICPR[i] = 0xFFFFFFFF; }
SCB->VTOR = APP_ADDR; /* vektör tablosunu taşı */
__set_MSP(sp);
__enable_irq();
((app_entry_t)reset)();
}Sık yapılan hatalar: VTOR'u güncellememek (interrupt'lar bootloader handler'larına gider), SysTick veya bir çevresel birimin interrupt'ını açık bırakmak.
Güvenli güncelleme tasarımı
- Bütünlük: Her imaj için CRC32 veya SHA-256; atlamadan önce doğrulanır.
- Özgünlük (secure boot): İmaj ECDSA/Ed25519 ile imzalanır; bootloader açık anahtarı içerir. Bootloader bölgesi yazma korumalı (RDP/WRP) olmalıdır.
- A/B (dual bank) şeması: Yeni imaj pasif slota yazılır; doğrulama başarılıysa aktif slot değiştirilir. Güncelleme yarıda kesilirse eski imaj çalışmaya devam eder.
- Rollback / deneme sayacı: Yeni imaj ilk açılışta kendini "onaylanmış" olarak işaretlemezse (watchdog reset sonrası) bootloader eski sürüme döner.
- Anti-rollback: Eski ve zafiyetli bir sürümün yüklenmesini versiyon sayacıyla engellemek.
- Güncelleme sırasında güç kesintisine karşı her adım idempotent olmalıdır.
Hazır çözümler: MCUboot (Zephyr, A/B ve imza desteği), ST'nin ROM bootloader'ı (System Memory), ESP-IDF OTA.
İlgili Mikrodenetleyiciler soruları
- Kesme (interrupt) nedir? ISR yazarken nelere dikkat edilir?
- Watchdog timer nedir, ne işe yarar?
- Mekanik bir butonun debounce işlemi neden gereklidir ve yazılımda nasıl yapılır?
- DMA nedir, ne zaman kullanılır? DMA kullanırken cache coherency ve double buffering gibi konularda nelere dikkat edilmelidir?
- ADC çözünürlüğü, referans voltajı ve örnekleme hızı nedir? ADC okumasında doğruluğu etkileyen faktörler nelerdir?
- Timer ile PWM sinyali nasıl üretilir? Frekans ve duty cycle nasıl hesaplanır?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.