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