如何解决为什么内核的 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_EL3
、VBAR_EL2
、VBAR_EL1
。
每个寄存器是:
Bits [63:11] - Vector Base Address
Bits [10:0] - Reserved,RES0
因此您根本无法提供未与 2^11 对齐的地址。
参考《ARMv8 架构参考手册》
PS:0x80
是给定异常级别 (ELx) 的不同类型中断的开始
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。