旧指令

Linux 内核的 arm64 端口提供了支持模拟架构中已弃用或过时指令的基础设施。该基础设施代码使用未定义指令钩子来支持模拟。在可用时,它还允许在硬件中启用指令执行。

可以通过写入 sysctl 节点 (/proc/sys/abi) 来控制模拟模式。以下解释了不同的执行行为以及 sysctl 节点的相应值 -

  • 未定义

    值:0

    生成未定义指令中止。对于架构中已过时的指令的默认值,例如,SWP

  • 模拟

    值:1

    使用软件模拟。为了帮助软件迁移,在这种模式下,对模拟指令的使用进行跟踪,并发出速率限制警告。这是已弃用指令的默认值,例如,CP15 屏障

  • 硬件执行

    值:2

    尽管标记为已弃用,但某些实现可能支持启用/禁用对这些指令执行的硬件支持。使用硬件执行通常会提供更好的性能,但会失去收集有关弃用指令使用的运行时统计信息的能力。

默认模式取决于指令在架构中的状态。已弃用的指令应默认为模拟,而已过时的指令必须默认为未定义。

注意:在所有情况下都可能无法进行指令模拟。有关更多信息,请参阅各个指令说明。

支持的旧指令

  • SWP{B}

节点:

/proc/sys/abi/swp

状态:

已过时

默认:

未定义 (0)

  • CP15 屏障

节点:

/proc/sys/abi/cp15_barrier

状态:

已弃用

默认:

模拟 (1)

  • SETEND

节点:

/proc/sys/abi/setend

状态:

已弃用

默认:

模拟 (1)*

注意:系统上的所有 CPU 必须在 EL0 处支持混合字节序,才能启用此功能。如果在启用此功能后热插拔了一个新的(不支持混合字节序的)CPU,则应用程序中可能会出现意外结果。