运行时检测Linux / ARM上的LDREX / STREX可用性

时间:2014-03-26 19:44:36

标签: c linux arm atomic

在Linux / ARM上运行时检测LDREX / STREX原子操作的可用性是否有可靠(最好是没有误报和误报)的方法?我在辅助向量的AT_HWCAP字段中寻找了一些东西,发现了一些可能间接暗示可用性的东西(例如HWCAP_LPAE据称可行),但它们可能会有误报。

2 个答案:

答案 0 :(得分:4)

在ARMv6架构中引入了

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上运行。