问题描述
在arch/arm64/kernel/entry.s中,向量表与11对齐。
.align 11
ENTRY(vectors)
kernel_ventry 1,sync_invalid // Synchronous EL1t
kernel_ventry 1,irq_invalid // IRQ EL1t
kernel_ventry 1,fiq_invalid // FIQ EL1t
kernel_ventry 1,error_invalid // Error EL1t
kernel_ventry 1,sync // Synchronous EL1h
kernel_ventry 1,irq // IRQ EL1h
kernel_ventry 1,fiq_invalid // FIQ EL1h
kernel_ventry 1,error // Error EL1h
kernel_ventry 0,sync // Synchronous 64-bit EL0
kernel_ventry 0,irq // IRQ 64-bit EL0
kernel_ventry 0,fiq_invalid // FIQ 64-bit EL0
kernel_ventry 0,error // Error 64-bit EL0
#ifdef CONfig_COMPAT
kernel_ventry 0,sync_compat,32 // Synchronous 32-bit EL0
kernel_ventry 0,irq_compat,32 // IRQ 32-bit EL0
kernel_ventry 0,fiq_invalid_compat,32 // FIQ 32-bit EL0
kernel_ventry 0,error_compat,32 // Error 32-bit EL0
#else
kernel_ventry 0,sync_invalid,32 // Synchronous 32-bit EL0
kernel_ventry 0,irq_invalid,32 // IRQ 32-bit EL0
kernel_ventry 0,fiq_invalid,32 // FIQ 32-bit EL0
kernel_ventry 0,error_invalid,32 // Error 32-bit EL0
#endif
END(vectors)
而在其他代码中,例如 linux-kernel-module-cheat 与 11 对齐。 但我知道 aarch64 与 0x80 https://developer.arm.com/documentation/100933/0100/AArch64-exception-vector-table 对齐。
为什么他们使用 11 字节对齐?
解决方法
基本上,这是 ARMv8 的架构要求,您只需要接受并接受它。
向量表的地址(对于每个 EL 级别)被写入特殊的向量基地址寄存器-s,即VBAR_EL3
、VBAR_EL2
、VBAR_EL1
。
每个寄存器是:
Bits [63:11] - Vector Base Address
Bits [10:0] - Reserved,RES0
因此您根本无法提供未与 2^11 对齐的地址。
参考《ARMv8 架构参考手册》
PS:0x80
是给定异常级别 (ELx) 的不同类型中断的开始