为什么内核的 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-kernel-module-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) 的不同类型中断的开始