ARM Cortex-M이 부팅할 때 가장 먼저 읽는 테이블.
0x08000000: Initial Stack Pointer
0x08000004: Reset_Handler 주소
0x08000008: NMI_Handler
0x0800000C: HardFault_Handler
CPU 전원이 들어오면 0x08000000에서 SP 값 로드하고, 0x08000004에서 Reset_Handler 주소 읽어서 점프. 펌웨어 시작.
200429.hex Vector Table
Ghidra에서 0x08000000으로 이동:
08000000 18 52 00 20 addr DAT_20005218 ; SP
08000004 01 28 00 08 addr FUN_08002800+1 ; Reset
08000008 1f 2b 00 08 addr FUN_08002b1e+1 ; NMI
0800000c ab 20 00 08 addr FUN_080020aa+1 ; HardFault
리틀 엔디안
바이트 순서가 뒤집혀 있다:
08000000: 18 52 00 20 → 0x20005218 (뒤에서부터)
Thumb 비트
Reset_Handler 주소가 0x08002801인데 실제 주소는 0x08002800.
마지막 비트 1은 Thumb 모드 표시. ARM Cortex-M은 Thumb 모드만 쓴다.
핵심 발견: CAN 인터럽트
외부 인터럽트는 0x08000040부터:
08000090 dd 22 00 08 addr FUN_080022dc+1 ; CAN1_RX0
IAP 부트로더니까 CAN 수신 핸들러가 핵심이다. 0x080022DC로 가보면:
void CAN1_RX0_IRQHandler(void)
{
// FIFO에서 메시지 읽기
// IAP 프로토콜 처리
}
Vector Table로 알 수 있는 것
- 사용 중인 인터럽트: 0이 아닌 핸들러
- 코드 영역 범위: 모든 핸들러가
0x08002xxx~0x08003xxx - 개발 수준: 간단한 에러 처리만 구현
라벨 지정
분석 편의를 위해 이름 지정 (L 키):
| 주소 | 변경 후 |
|---|---|
| 0x08002800 | Reset_Handler |
| 0x080022DC | CAN1_RX0_IRQHandler |
다음 글에서 메모리 맵 추정.