Linux启动,如果需要支持KVM,则必须从EL2开始启动,即Kernel的入口在EL2执行,如下主要代码:
_head: - Kernel Image入口
b stext //跳转到stext
在stext中跳转到el2_setup
el2_setup 的逻辑:
1)看当前是否处于EL2,如果不是直接启动Linux Kernel (不支持KVM)
MSR 系统寄存器 +(寄存器)指令:Move general-purpose register to System Register allows the PE to write an AArch64 System register from a general-purpose register.
MSR 系统寄存器 + 立即数: Move immediate value to Special Register moves an immediate value to selected bits of the PSTATE.
MRS指令:Move System Register allows the PE to read an AArch64 System register into a general-purpose register.
//When the value of SPSel.SP is 0, SP_EL0 is used as the current stack pointer at all Exception levels.
//When the value of SPSel.SP is 1, each exception level use its corresponding SP_ELx
msr SPsel, #1 // We want to use SP_EL{1,2}
SCTLR_EL1, System Control Register (EL1)
E0E, bit [24] Endianness of data accesses at EL0.
EE, bit [25] Endianness of data accesses at EL1, and stage 1 translation table walks in the EL1&0 translation regime.
2)