今日的行程:
辦公室:9:30 - 19:30
讀書室:19:30 - 21:00
ldr x6, <label> // x6 為 64 bit register
// 所以如果 label 沒有 align 8 byte,就會是 unalign access
ldr w6, <label> // 同理,4 byte align
b primary_entry
--> primart_entry
bl record_mmu_state // 設定 Endian,
// kernel 有個 CONFIG_CPU_BIG_ENDIAN config,
// 並且清掉 SCTLR_ELx_M
bl preserve_boot_args // 非常字面上意思 XD
...
adrp x0, init_idmap_pg_dir // idmap 應該是 identity mapping
// (VA == PA)
...
bl __pi_create_init_idmap // 不太確定 __pi_ 這個 prefix
// 怎麼安上去的,實作應該是在
// arch/arm64/kernel/pi/map_range.c 的
// create_init_idmap
...
bl init_kernel_el // 設定 EL 的樣子XD
bl __cpu_setup // arch/arm64/mm/proc.S
b __primary_switch
--> primary_switch
...
bl __enable_mmu // enable mmu
...
ldr x8, =__primary_switched
adrp x0, KERNEL_START // __pa(KERNEL_START)
br x8
--> __primary_switched
...
bl start_kernel // 接下來都是 C code 了
上述都是 boot hart 的流程,other hart 會在前一級的 boot loader 裡面 parking (透過 spin table 機制或是 PCSI 機制),直到 boot hart 執行到 smp_init (boot_secondary) function,才會透過 interrupt 機制讓 other hart 跳到 kernel head.S 含有 secondary 字眼的 function 執行。