이번 chapter에서는 특정 타겟을 위한 펌웨어 이미지를 생성하는 툴체인(toolchain)에 대해 배운다.
.c
소스코드를 .o
오브젝트 파일로 만든다.링커는 오브젝트 파일들의 집합인 모듈들의 심볼 의존성을 모두 처리해 실행파일로 만드는 역할을 한다.
결과물인 .elf
실행파일은 프로그램 코드와 데이터를 포함하는 등 다양한 section으로 구성된다.
.text
section: 프로그램 코드를 포함하며 읽기 전용이다..rodata
section: 런타임에 수정되지 않는 const
상수를 저장하기 위한 읽기 전용 공간이다..data
section: 초기화 된 변수나 static
같은 전역 변수들이 저장되는 공간이다. 읽기/쓰기 가능하다..bss
section: 초기화 되지 않은 변수들이 저장되는 공간이다. 읽기/쓰기 가능하다. 프로그램의 초기화 코드는 main() 함수 실행 이전에 이 영역의 변수들이 모두 0
으로 초기화되는 것을 보장해야 한다.링커 스크립트는 타겟의 메모리 섹션을 서술한 파일이다. 여기에는 프로그램이 실행되기 전에 꼭 필요한 정보들이 포함되며 코드 내 모든 심볼에 대한 정보가 저장돼있다. 즉, 메모리에 매핑되는 각 section에 대한 설명과 타겟의 flash & RAM에 프로그램을 올릴 때 필요한 정보가 저장된 .ld
파일이다.
가장 간단한 링커 스크팁트는 적어도 RAM과 FLASH에 대한 정보를 담은 MEMORY section을 갖고 있다.
MEMORY {
FLASH(rx) : ORIGIN = 0x00000000, LENGTH = 256K
RAM(rwx) : ORIGIN = 0x20000000, LENGTH = 64K
}
앞서 .text
와 .rodata
는 읽기 전용이라고 했다. 따라서 flash에 저장돼야 한다.
반면 .data
와 .bss
는 RAM에 매핑되며 수정이 가능하다.
Make
는 binary 이미지 파일 생성을 자동화할 수 있는 표준 유닉스/POSIX 도구다.
사용자가 직접 레시피나 규칙을 적용해 입맛에 맞는 출력 파일을 자동으로 생성해줄 수 있는 강력한 도구다.
별도의 문법을 가지며 구조는 아래와 같다.
target: [prerequisites]
recipe1
recipe2
...
arm-none-eabi
라는 접두어로 시작한다.qemu
로 에뮬레이션하면 위험성을 줄이고 이식성 요구 없이 타겟 머신에 특화된 코드를 실행하고 디버깅할 수 있다.Qemu
가 ARM의 하드웨어와 특수기능을 상당히 정확히 구현하고 있지만, 실제 하드웨어와 시스템 레이아웃이 완전 일치하지는 않기 때문에 분명히 한계를 가진다. 그렇지만, Qemu는 Cortex-M의 기능을 숙지하는 가장 빠른 방법이라 장담한다.