从上一篇kernel 启动的入口函数查找可以得出kernel启动是从如下_head开始,然后跳转到了stext
![](https://i-blog.csdnimg.cn/blog_migrate/5515aec1d3951f199f5dde4a83525b6a.png)
stext(head.S (kernel4.14\arch\arm64\kernel)) 如下:
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)
preserve_boot_args 是保存boot传过来的参数
el2_setup 如果是el2启动做相关的处理工作
set_cpu_boot_mode_flag 设置cpu 启动模式标志
__create_page_tables 创建页表
__cpu_setup 初始化cpu
__primary_switch打开mmu ,跳到__primary_switched
__primary_switched 如下最终跳到C语言代码start_kernel
__primary_switched:
adrp x4, init_thread_union
add sp, x4, #THREAD_SIZE
adr_l x5, init_task
msr sp_el0, x5// Save thread_info
adr_l x8, vectors// load VBAR_EL1 with virtual
msr vbar_el1, x8// vector table address
isb
stp xzr, x30, [sp, #-16]!
mov x29, sp
str_l x21, __fdt_pointer, x5// Save FDT pointer
ldr_l x4, kimage_vaddr// Save the offset between
sub x4, x4, x0// the kernel virtual and
str_l x4, kimage_voffset, x5// physical mappings
// Clear BSS
adr_l x0, __bss_start
mov x1, xzr
adr_l x2, __bss_stop
sub x2, x2, x0
bl __pi_memset
dsb ishst// Make zero page visible to PTW
#ifdef CONFIG_KASAN
bl kasan_early_init
#endif
#ifdef CONFIG_RANDOMIZE_BASE
tst x23, ~(MIN_KIMG_ALIGN - 1)// already running randomized?
b.ne 0f
mov x0, x21// pass FDT address in x0
bl kaslr_early_init// parse FDT for KASLR options
cbz x0, 0f// KASLR disabled? just proceed
orr x23, x23, x0// record KASLR offset
ldp x29, x30, [sp], #16// we must enable KASLR, return
ret // to __primary_switch()
0:
#endif
add sp, sp, #16
mov x29, #0
mov x30, #0
b start_kernel
ENDPROC(__primary_switched)
start_kernel下一篇将详细介绍