Assembly 为什么内核';s arm64向量表与11对齐?
在中,向量表与11对齐Assembly 为什么内核';s arm64向量表与11对齐?,assembly,arm64,Assembly,Arm64,在中,向量表与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_inv
.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)
在其他代码中,如与11对齐。
但我知道aarch64与0x80对齐
为什么使用11字节对齐?基本上,这是ARMv8的架构要求,您只需要接受并接受它 向量表的地址(对于每个EL级别)被写入特殊的向量基址寄存器-s,即
VBAR_EL3
,VBAR_EL2
,VBAR_EL1
每个登记册为:
位[63:11]-矢量基址
位[10:0]-保留,RES0
PS:
0x80
是给定异常级别(ELx)的不同类型中断的开始对不起。我忘了arm64首先与0x800对齐。这相当于2^11IMO,永远不要使用.align
,始终使用.balign 0x800
或.p2align 11
,以避免.align
是否意味着.balign
或.p2align
的歧义。(特别是与4
与2^4=16
-相关。balign 11
将是一个错误,因为11字节的对齐实际上是不可能的:对齐仅作为2的幂的倍数才有意义。)