遗留指令

Linux 内核的 arm64 移植提供了基础设施,以支持对架构中已弃用 (deprecated) 或已废弃 (obsoleted) 的指令进行模拟。基础设施代码使用未定义指令钩子来支持模拟。在可用时,它也允许开启硬件中的指令执行。

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

  • 未定义 (Undef)

    值:0

    生成未定义指令中止。这是架构中已废弃指令的默认设置,例如 SWP

  • 模拟 (Emulate)

    值: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,可能会导致应用程序出现意想不到的结果。