在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内核模块,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(的不同类型中断的开始