[armv8-arch64]linux kernel 5.9的异常量表介绍(irq,fiq,sync,svc)
生活随笔
收集整理的這篇文章主要介紹了
[armv8-arch64]linux kernel 5.9的异常量表介绍(irq,fiq,sync,svc)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在entry.S中,定義了異常向量表,從代碼中我們可以知道以下信息:
- 該表的基地址在vectors處(在開機的時候,會將其寫入到vbar_el1中)
- 這個表以".align 11"方式對齊,即這張表至少占據2^11 size
- kernel_entry是一個用于定義向量表offset的宏,在kernel_entry中,是以“.align 7”方式對齊的,即2^8=0x80方式對齊,與ARMV8中的向量表offset一致
- armv8的向量表中又16個offset,在Linux Kernel中,僅實現了6個
- Linux Kernel中沒有實現 FIQ
我們再來看看kernel_ventry宏,它是用于定義向量表offset的宏,,從代碼中我們可以知道以下信息:
- kernel_ventry定義的offset以“.align 7”方式對齊的,即2^8=0x80方式對齊,與ARMV8中的向量表offset一致
- 該宏定義最終調用了“b el()\el()_\label”,即:
– kernel_ventry 1, sync //調用了 el1_sync
– kernel_ventry 1, irq //調用了 el1_irq
– kernel_ventry 1, error //調用了 el1_error
– kernel_ventry 0, sync //調用了 el0_sync
– kernel_ventry 0, irq //調用了 el0_irq
– kernel_ventry 0, error //調用了 el0_error
在__primary_switched函數中,將向量表的基地址vectors寫入到了vbar_el1中.
(linux_5.9/arch/arm64/kernel/entry.S)SYM_FUNC_START_LOCAL(__primary_switched)adrp x4, init_thread_unionadd sp, x4, #THREAD_SIZEadr_l x5, init_taskmsr sp_el0, x5 // Save thread_info#ifdef CONFIG_ARM64_PTR_AUTH__ptrauth_keys_init_cpu x5, x6, x7, x8 #endifadr_l x8, vectors // load VBAR_EL1 with virtualmsr vbar_el1, x8 // vector table addressisbstp xzr, x30, [sp, #-16]!mov x29, sp#ifdef CONFIG_SHADOW_CALL_STACKadr_l scs_sp, init_shadow_call_stack // Set shadow call stack #endifstr_l x21, __fdt_pointer, x5 // Save FDT pointerldr_l x4, kimage_vaddr // Save the offset betweensub x4, x4, x0 // the kernel virtual andstr_l x4, kimage_voffset, x5 // physical mappings// Clear BSSadr_l x0, __bss_startmov x1, xzradr_l x2, __bss_stopsub x2, x2, x0bl __pi_memsetdsb ishst // Make zero page visible to PTW#ifdef CONFIG_KASANbl kasan_early_init #endif #ifdef CONFIG_RANDOMIZE_BASEtst x23, ~(MIN_KIMG_ALIGN - 1) // already running randomized?b.ne 0fmov x0, x21 // pass FDT address in x0bl kaslr_early_init // parse FDT for KASLR optionscbz x0, 0f // KASLR disabled? just proceedorr x23, x23, x0 // record KASLR offsetldp x29, x30, [sp], #16 // we must enable KASLR, returnret // to __primary_switch() 0: #endifadd sp, sp, #16mov x29, #0mov x30, #0b start_kernel SYM_FUNC_END(__primary_switched)而在開機時的在__primary_switched函數中被調用的流程如下所示
_head —> primary_entry —> __primary_switch —> __primary_switched —> 將向量表基地址vectors寫入到vbar_el1寄存器
相關代碼:
(linux_5.9/arch/arm64/kernel/head.S)SYM_CODE_START(primary_entry)bl preserve_boot_argsbl el2_setup // Drop to EL1, w0=cpu_boot_modeadrp x23, __PHYS_OFFSETand x23, x23, MIN_KIMG_ALIGN - 1 // KASLR offset, defaults to 0bl set_cpu_boot_mode_flagbl __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 processorb __primary_switch SYM_CODE_END(primary_entry)__HEAD _head:/** DO NOT MODIFY. Image header expected by Linux boot-loaders.*/ #ifdef CONFIG_EFI/** This add instruction has no meaningful effect except that* its opcode forms the magic "MZ" signature required by UEFI.*/add x13, x18, #0x16b primary_entry #elseb primary_entry // branch to kernel start, magic.long 0 // reserved #endif ......總結
以上是生活随笔為你收集整理的[armv8-arch64]linux kernel 5.9的异常量表介绍(irq,fiq,sync,svc)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [architecture]-ARMV8
- 下一篇: GP TEE_ObjectInfo结构体