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