Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 为什么内核';s arm64向量表与11对齐?_Assembly_Arm64 - Fatal编程技术网

Assembly 为什么内核';s arm64向量表与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

在中,向量表与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)
在其他代码中,如与11对齐。 但我知道aarch64与0x80对齐


为什么使用11字节对齐?

基本上,这是ARMv8的架构要求,您只需要接受并接受它

向量表的地址(对于每个EL级别)被写入特殊的向量基址寄存器-s,即
VBAR_EL3
VBAR_EL2
VBAR_EL1

每个登记册为:

  • 位[63:11]-矢量基址
  • 位[10:0]-保留,RES0
因此,您无法提供与2^11不对齐的地址

请参阅“ARMv8体系结构参考手册”


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

对不起。我忘了arm64首先与0x800对齐。这相当于2^11IMO,永远不要使用
.align
,始终使用
.balign 0x800
.p2align 11
,以避免
.align
是否意味着
.balign
.p2align
的歧义。(特别是与
4
2^4=16
-
相关。balign 11
将是一个错误,因为11字节的对齐实际上是不可能的:对齐仅作为2的幂的倍数才有意义。)