- 메모리에 적재시켜주는데... 메모리 몇 번지에 로드시켜야 하는가?
- 커널 이미지는 누가 메모리에 로드시켜 주는가?
u32 code0; /* Executable code */ |
u32 code1; /* Executable code */ |
u64 text_offset; /* Image load offset, little endian */ |
u64 image_size; /* Effective Image size, little endian */ |
u64 flags; /* kernel flags, little endian */ |
u64 res2 = 0; /* reserved */ |
u64 res3 = 0; /* reserved */ |
u64 res4 = 0; /* reserved */ |
u32 magic = 0x644d5241; /* Magic number, little endian, "ARM\x64" */ |
u32 res5; /* reserved (used for PE COFF offset) */ |
그리고 실제로 커널의 코드를 통해서 이 헤더가 구현되어있는 모습을 보자면, (단 EFI가 아니라 Uboot를 위한 헤더라고 가정한다)
b stext // branch to kernel start, magic |
.long 0 // reserved |
le64sym _kernel_offset_le // Image load offset from start of RAM, little-endian |
le64sym _kernel_size_le // Effective size of kernel image, little-endian |
le64sym _kernel_flags_le // Informative flags, little-endian |
.quad 0 // reserved |
.quad 0 // reserved |
.quad 0 // reserved |
.ascii ARM64_IMAGE_MAGIC // Magic number |
.long 0 // reserved |
<linux/arch/arm64/kernel/head.S>
이 헤더는 리눅스 커널 이미지의 처음 시작 64byte 값이다. 부트로더 코드를 읽어보지는 않았지만, 일단 ARM64_IMAGE_MAGIC("ARM\x64") String값을 읽고 일단 리눅스 커널이라는 것을 알아낸 후 사이즈에 대한 정보를 통해서 메모리에 적재하는 것으로 추정된다. 그리고 메모리에 올린 후 제어권을 리눅스 커널로 넘겨주어야 하는데 이 때 아래와 같은 값을 각각 레지스터에 써서 넘겨준다. (이 때, 제어권을 넘겨준다는 말은 PC값을 이미지의 처음 주소로 assign한다는 의미가 주된 의미지만 필요시 CPU mode를 바꿔줌으로써 넘겨준다.)
x0 = physical address of device tree blob (dtb) in system RAM.
x1 = 0 (reserved for future use)
x2 = 0 (reserved for future use)
x3 = 0 (reserved for future use)
'전공공부 > Linux' 카테고리의 다른 글
setup_arch: arm64_memblock_init (0) | 2021.09.12 |
---|---|
function: set_cpu_boot_mode_flag (0) | 2020.11.09 |
[2020.10.17] Linux Kernel, primary_entry - 1 (0) | 2020.10.21 |
[Line by line] Linux Kernel, SYM_CODE_START macro (0) | 2020.10.21 |
[Line by line] Linux Kernel - 1 (0) | 2019.02.09 |