为什么内核的 arm64 向量表与 11 对齐?



在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_EL3VBAR_EL2VBAR_EL1

每个寄存器为:

  • Bits [63:11] - Vector Base Address
  • Bits [10:0] - Reserved, RES0

所以您根本无法提供不与2^11对齐的地址。

参见";ARMv8体系结构参考手册";

PS:0x80是给定异常级别(ELx(的不同类型中断的开始

最新更新