스타트업 코드: main 전에 일어나는 일
리셋 직후 CPU는 .data를 RAM으로 복사하고 .bss를 0으로 채운 뒤에야 main을 부릅니다. startup.s를 한 줄씩 따라갑니다.
리셋 순서
- CPU가 벡터 테이블 0번 주소에서 초기 스택 포인터 값을 읽어 sp에 넣음
- 1번 주소에서 Reset_Handler 주소를 읽어 점프
- Reset_Handler가 아래 작업을 수행
SystemInit(): 클럭, Flash 대기 상태 같은 기본 설정main()호출
Reset_Handler가 하는 일
- .data 복사:
int count = 5;처럼 초기값이 있는 전역 변수는 그 초기값이 Flash에 저장되어 있습니다. 이것을 RAM의 변수 위치로 복사합니다. - .bss 초기화:
int total;처럼 초기값이 없는 전역 변수 영역을 0으로 채웁니다. C 표준이 전역 변수는 0으로 시작한다고 보장하기 때문입니다. - C++ 생성자 / 라이브러리 초기화 (
__libc_init_array)
실무에서 만나는 문제
- 부트로더에서 앱으로 점프했는데 변수 값이 이상하다면 앱의 스타트업이 제대로 실행됐는지 확인합니다.
- 전원이 꺼져도 남겨야 하는 값(리셋 원인 기록 등)은
.noinit섹션에 두어 .bss 초기화를 피합니다. - RAM이 큰 칩에서 .bss를 0으로 채우는 시간이 부팅 시간에 영향을 주기도 합니다.