Linux内核arm64异常向量表为何采用.align 11对齐而非规范要求的0x80对齐?
为什么Linux aarch64内核的异常向量表要使用
.align 11对齐 - 首先要理清最容易踩的语义坑:这里的
.align 11和“11字节对齐”完全是两回事
aarch64平台下的GNU汇编有专门的对齐规则:.align n指令的作用是将当前代码位置对齐到2^n字节的自然边界,而不是直接对齐n字节。对应到.align 11,实际是要求把向量表放到2048字节(0x800)的整数地址上,是标准的高对齐配置。 - 再说说对ARM官方文档的常见误读
文档里提到的0x80规格,是异常向量表内部4类入口块的相对间隔要求(每类入口块占用0x80大小的空间),并不是整个向量表基地址需要满足的硬件最低对齐要求。
从aarch64的硬件设计来看,存放向量表基地址的VBAR寄存器,低11位是硬件保留位,写入时必须置0——也就是说硬件天生就要求向量表的基地址必须满足2048字节对齐,否则写入的值不会生效,异常跳转根本没法正常工作。内核的这套对齐配置,本质上就是在满足硬件的硬性要求。 - 选2048字节对齐还有实际的性能收益
这种高对齐度可以让整个异常向量表完全落在连续的缓存行、无缓存别名冲突的TLB映射范围内,避免跨缓存行访问、缓存集冲突带来的不必要性能损耗。这也是所有aarch64相关的内核、教学示例代码都统一采用这套对齐配置的原因。
内容的提问来源于stack exchange,提问作者fnclovers
相关产品推荐
相关产品推荐

