이 글에서는 리눅스 헤더로 부터 넘어온 첫 번째 함수 stext에 대해서 알아볼 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| ENTRY(stext) bl preserve_boot_args bl el2_setup // Drop to EL1, w0=cpu_boot_mode adrp x23, __PHYS_OFFSET and x23, x23, MIN_KIMG_ALIGN - 1 // KASLR offset, defaults to 0 bl set_cpu_boot_mode_flag bl __create_page_tables /* * The following calls CPU setup code, see arch/arm64/mm/proc.S for * details. * On return, the CPU will be ready for the MMU to be turned on and * the TCR will have been set. */ bl __cpu_setup // initialise processor b __primary_switch ENDPROC(stext)
|
stext 함수는 여기서 ENTRY라는 마치 함수와 같은 것으로 둘려져 있는데, 여기서 ENTRY는 링커스크립트의 것과는 다르게 리눅스 내에서 매크로로 정의되어 있는 function-like macro일 뿐이다.
2번 째 줄의 preserve_boot_args에 대해서 간략하게 알아보자면, 이전 글의 마지막에서 언급한 적이 있는데, 리눅스는 시작 할 때 몇 개의 값을 전달 받고 시작하게 된다고 언급한 적이 있다. 이 값들이 지금 당장은 쓰이지 않지만 나중에 쓰이기 위해 따로 저장하기 위함이라 볼 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13
|
preserve_boot_args: mov x21, x0 // x21=FDT
adr_l x0, boot_args // record the contents of stp x21, x1, [x0] // x0 .. x3 at kernel entry stp x2, x3, [x0, #16]
dmb sy // needed before dc ivac with // MMU off
mov x1, #0x20 // 4 x 8 bytes b __inval_dcache_area // tail call ENDPROC(preserve_boot_args) |
linux/arch/arm64/kernel/setup.c 에 위치하고 있는 아래의 boot_args에 저장하게 되는 꼴이 된다.
u64 __cacheline_aligned boot_args[4];
|