IAP 부트로더는 Flash를 영역별로 나눠서 사용한다:

┌─────────────────┐ 0x08080000
│   Application   │
├─────────────────┤ 0x08042800
│     Buffer      │
├─────────────────┤ 0x08004000
│   Bootloader    │
└─────────────────┘ 0x08000000

HEX 파일로 추정

ls -la 200429.bin
# 16384 bytes = 16KB = 0x4000

부트로더: 0x08000000 ~ 0x08003FFF (16KB)


앱 점프 주소 찾기

부트로더는 결국 앱으로 점프한다. Ghidra에서 Search → For Scalars → 0x08004000 또는 0x08042800 검색.

// 전형적인 점프 코드
void jump_to_app(void) {
    uint32_t stack = *(uint32_t *)0x08042800;
    uint32_t reset = *(uint32_t *)0x08042804;
    __set_MSP(stack);
    ((void(*)(void))reset)();
}

0x08042800이 앱 시작 주소다. 버퍼 영역이 0x08004000 ~ 0x08042800이고 거기에 펌웨어를 받아서 검증 후 복사하는 구조.


Flash 레이아웃

영역시작크기
Bootloader0x0800000016KB
Buffer0x08004000254KB
Application0x08042800246KB

다음 글에서 CAN 초기화 코드 분석.

#8 - CAN 초기화 분석