旧指令

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,则应用程序中可能会出现意外结果。