본문 바로가기
Kernel/理解

Bootloader 개요

by 暻煥 2024. 2. 2.

Linux Documentation을 정리하였다.
(Kernel/Document/arm/Booting)

 


Booting ARM Linux

ARM Linux를 Booting 하기 위해서는 boot loader가 필요하다.
boot loader는 main kernel이 수행되기 전에 동작하는 작은 프로그램을 말한다.
여러 가지 device들이 boot load를 통해 초기화되며,
최종적으로 linux kernel을 실행하며, kernel에게 필요한 정보를 전달한다.



BL(Boot loader)는 간단하게 아래의 수행 과정을 거친다.
1. RAM을 설정하고 초기화한다.
2. 하나의 시리얼 포트를 초기화한다.
3. machine type을 감지한다.
4. kernel tage list를 설정한다.
5. initramfs를 로드한다.
6. kernel image를 호출한다.


1. Ram 설정 및 초기화


kernel이 사용하기 위한 모든 RAM을 찾아서 초기화한다.
HW 의존적인 방법으로 RAM을 detecting 한다. 
(일반적으로 RAM의 사이즈를 미리 알고 Bootloader를 작성한다.)


2. Serial Port 초기화


BL은 하나의 Serial Port를 초기화한다.
이후, kernel의 serial driver가 자동으로 해당 port를 감지하여 kernel console로 사용한다.
또한, BL은 kernel tagged list를 통하여 "console=" option을 kernel에게 전달할 수 있고, 
serial port의 option 전달 가능하다. (--> Documentation/kernel-parameters.txt)


3. machine type detecting


BL은 machine type을 감지한다.
(일반적으로 미리 machine type을 알고 BL을 작성한다.)
이후에, MACH_TYPE_xxx 값을 r1 register를 통해서 kernel에게 전달한다.
(--> linux/arch/arm/tools/mach-types)
미리 machine type이 정해져 있지 않은, Device Tree Only Flatform인 경우 machibe type은 ~0으로 설정된다.


4. Boot Data 설정


tagged list 혹은 dtb image와 같은 cofinguration을 설정한다.
차후 해당 data의 시작 주소를 r2 register를 통해 kernel에게 전달한다.


4-1. Kernel Tagged List 설정

 

Tag name
Value
Size
Description
0x00000000
2
Empty tag used to end list
0x54410001
5 (2 if empty)
First tag used to start list
0x54410002
4
Describes a physical area of memory
0x54410003
5
Describes a VGA text display
0x54410004
5
Describes how the ramdisk will be used in kernel
0x54420005
4
Describes where the compressed ramdisk image is placed in memory
0x54410006
4
64 bit board serial number
0x54410007
3
32 bit board revision number
0x54410008
8
Initial values for vesafb-type framebuffers
0x54410009
2 + ((length_of_cmdline + 3) / 4)
Command line to pass to kernel

BL은 kernel tagged list를 생성하고 초기화해야만 한다.
tagged list는 ATAG_CORE와 ATAG_NONE 사이에 위치해 있다.
ATAG_CORE가 비어 있으면 size field에 0x2로 설정한다.
ATAG_NONE은 size field가 항상 0x0이다.

tag list의 크기는 정해져 있지 않다.
중복되어 삽입될 수도 있고, 삽입 시에 중복 검사를 하여 대체될 수도 있다.

BL은 kernel에게 memory의 크기와 위치 그리고 root file system의 위치를 꼭 전달해야 한다.
그러므로 최소의 크기를 가지는 tag list는 아래와 같다.

tagge list는 system RAM에 적재된다.

tagged list는 overwrite의 위험성 때문에 decompressor의 위치나 initrd 'bootp'의 위치에 적재되어서는 안된다.

일반적으로 안전한 tagged list의 위치는 RAM의 첫 번째 16KB이다.

(initrd : Initial RAM disk)


4-2. Device Tree 설정


BL은 dtb image를 64bit align 하여 system RAM에 로드한다.
dtb format에 대해서는 Documentation/devicetree/booting-without-of.txt에 설명되어 있다.
kernel은 dtb의 physical address 위치에서 magic key value 0xD00DFEED를 찾는다.
만약 해당 값이 존재하면 tagged list 대신에 dtb가 booting data로 전달된다.

BL은 적어도 메모리의 크기와 위치, root filesystem의 위치를 전달해야 하기 때문에
dtb는 kernel decompressor가 로드되어 overwrite 되지 않는 안전한 곳에 위치해야 한다.
kernel low mem으로 mapping 되는 공간에 적재된다.

dtb를 128MB 이상의 위치에 적재하는 것이 일반적으로 안전하다.


5. inittramfs 적재


마찬가지로 initramfa는 kernel decompressor가 적재되지 않는 공간에 위치해야 한다.
또한, low mem 공간에 위치해야 한다.
일반적으로 device tree blob이 끝난 다음에 바로 적재하는 것이 안전하다.


6. kernel image 호출


zImage를 호출하는 데에는 2가지의 옵션이 있다.
flash에 저장되어 바로 링크를 걸어서 실행되거나, RAM에 적재되어서 실행된다.

zImage가 system RAM에 적재되어서 실행되는 경우, RAM의 앞쪽 128MB 공간에 적재되어야 한다. 
이때, 앞쪽 32MB보다는 뒤쪽 공간에 적재되는 것이 안전하다.
왜냐하면, decompression 작업 수행전에 image relocation이 필요할 수 있기 때문이다.
해당 relocate는 boot process를 약간 빠르게 만든다.

만약 압축되지 아닌 파일. 즉, zImage가 아닌 경우에는 kernel은 TEXT_OFFSET - PAGE_OFFSET에 위치해야 한다.

image 옵션이 어떠하든 아래의 5개 조건들은 모두 항상 충족되어야 한다.

1.
모든 DMA 장치들을 정지시켜서 bogus network packet 혹은 disk data에 의해서 RAM의 내용이 변경되는 것을 막는다.

2.
CPU register를 설정한다.
r0 = 0
r1 = machine type
r2 = tagged list의 physical address 혹은 dtb의 physical address

3.
모든 interrupt를 금지하며, CPU 모드를 설정한다.
ARM Virtualization 확장 기능이 포함되어 있지 않은 경우 CPU는 SVC 상태이어야 한다.
만약에 virtualization extension이 포함되어 있으면 HYP 상태로 진입하여서 kernel이 모든 extension을 사용할 수 있도록 한다.
(사전에 설치되어잇는 hypervisor에 의해서 virtualization 기능이 이미 사용되고 있다면 해당 HYP 상태 사용 불가능)

4.
Cache와 MMU 설정한다.
MMU와 data cache는 꺼져 있어야 한다. 하지만, instruction cache는 켜져 있을 수도 꺼져 있을 수도 있다.

만약 kernel이 HYP 상태라면, PL1(privilesged kernel mode) configuration에서 위의 조건들이 추가된다.
게다가, 모든 traps가 disable 되고, 모든 system resource에 대한 접근 권한이 부여된다.

만약 HYP 상태로 진입이 불가능하다면, kenel booting이 가능하도록 configration을 작성해야 한다.

5.
kernel image의 첫 번째 instruction으로 jump 한다.

 

.

'Kernel > 理解' 카테고리의 다른 글

ZRAM 분석  (0) 2024.02.02
ELF 실행 & execve  (0) 2024.02.02
[sched] Pressure Stall Information (PSI)  (0) 2024.02.02
[mm][fs] File/Anon + VMA/Page  (0) 2024.02.02
ARM64 (ARMv8) Assembly 참고 자료  (0) 2024.02.02