본문 바로가기
Embedded System/Bootloader

U-Boot Sequence 및 구조 분석

by rewyear 2023. 12. 28.

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

300x250

'Embedded System > Bootloader' 카테고리의 다른 글

U-boot command  (0) 2023.12.28
Bootloader(U-Boot) Overview  (0) 2023.12.28