在Linux / ARM上运行时检测LDREX
/ STREX
原子操作的可用性是否有可靠(最好是没有误报和误报)的方法?我在辅助向量的AT_HWCAP
字段中寻找了一些东西,发现了一些可能间接暗示可用性的东西(例如HWCAP_LPAE
据称可行),但它们可能会有误报。
答案 0 :(得分:4)
LDREX
/ STREX
,因此您只需要检查架构版本 - 如果是v6或更高版本,您就拥有它们。如果没有,你就不会。从特权代码中,您可以直接读取MIDR,否则会有一些用户空间界面,如/proc/cpuinfo
。
如果你真的需要实现适用于所有架构版本的原子,你可能最好依靠Kernel User helpers提供的cmpxchg
而不是试图推广自己的。{/ p>
答案 1 :(得分:0)
Mpcore,TRM没有说你是否能够或者无法在非自愿模式下访问它。
MRC p15,0,<Rd>,c0,c0,0; reads Main ID register
cpu id注册了一些之后明确说明:只能在特权模式下访问 所以我希望/假设arm文档会对主id寄存器说同样的话。当然,你需要通过多少主要的id寄存器答案来验证这是什么核心?
啊,MIDR =主ID寄存器,Notlikethat提到MIDR,我想这是一个简单的测试,看看你是否可以在用户模式下访问MIDR ......
编辑:
1176确实明确说明了MIDR。
只能在特权模式下访问。
我想知道这种限制是否消失了。
EDIT2:
在mpcore上验证,您无法在用户模式下访问MIDR。
EDIT3:
我认为你必须依靠内核来帮助用户空间。和/或如果你只支持ARMv6或更新版本,那么ldrex / strex将在那里,你不必检查,假设这不是在cortex-m上运行,而是在arm11或cortex-a / r上运行。