u-boot의 entry point는 ENTRY(_start)로 기재한 것처럼 start.S파일의 _start이다.
해당 시퀀스에서는 reset을 통해, vector table을 세팅하고(세팅 전 boot params 저장), lowlevel_init 등을 수행하고 _main으로 jump.
_main는 crt0.S에 작성되어 있는데 crt0.S의 목적은 C언어로 작성된 프로그램의 메인 함수를 호출하기 전에 필요한 초기화를 수행하는 루틴의 집합(crt == c runtime)
크게 board_init_f(), relocate_code(), board_init_r()로 나뉘어 수행한다.
board_init_f()
board_init_f() 호출 전에 stack address 및 gd(global data)에 대한 설정을 먼저 진행.
이후 common/board_f.c에 정의되어 있는 해당 함수에서 init_seqeunce_f[]에 리스트업 된 시퀀스를 수행하는데, 실행되는 내용을 살펴보면 cpu, dram, timer, watchdog, serial 등의 초기화를 진행한다.
함수 구성의 경우 대개 config로 조건문 처리 되어있거나, __weak 키워드를 통해 stub형태나 default 동작을 수행하는 함수으로 구성되어 있기 때문에 target에 맞게 config 설정이나 구현하면 됨.
board_init_f() 수행 완료후, gd에 대하여 arm64bit 시스템의 경우 대개 x18 레지스터에 gd에 대한 address 값을 저장
이후 relocate_code()가 실행되어 flash메모리에 저장된 u-boot 코드가 RAM으로 copy하는 동작이 수행된다. 이후 c_runtime_cpu_setu()에서 vector table도 relocate한 다음 BSS영역을 0로 clear하는 동작 수행.
board_init_r()
마지막으로 board_init_r()이 호출되어 init_sequence_r[]에 리스트 업 된 시퀀스 수행 후, 마지막으로 run_main_loop 실행
이후 bootm 명령을 통해 kernel image load
'Embedded System > Bootloader' 카테고리의 다른 글
U-boot command (0) | 2023.12.28 |
---|---|
Bootloader(U-Boot) Overview (0) | 2023.12.28 |