在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对齐。
为什么他们使用11byte align?
发布于 2021-04-06 13:05:42
基本上,这是ARMv8的架构要求,您只需要接受并接受它。
(对于每个EL电平)向量表的地址被写入特殊的向量基地址寄存器-s,即VBAR_EL3、VBAR_EL2、VBAR_EL1。
每个寄存器为:
Bits [63:11] - Vector Base AddressBits [10:0] - Reserved, RES0因此您根本无法提供未与2^11对齐地址。
请参阅"ARMv8架构参考手册“
对于给定的异常级别(ELx),PS:0x80是不同类型中断的开始
https://stackoverflow.com/questions/66962053
复制相似问题