Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Linux/ARM上LDREX/STREX可用性的运行时检测_C_Linux_Arm_Atomic - Fatal编程技术网

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

C Linux/ARM上LDREX/STREX可用性的运行时检测,c,linux,arm,atomic,C,Linux,Arm,Atomic,在Linux/ARM上运行时,是否有可靠且最好无误报和误报的方法来检测LDREX/STREX原子操作的可用性?我在aux向量的AT_HWCAP字段中查找了一些内容,发现了一些可能间接暗示可用性的内容,例如HWCAP_LPAE可能会这样做,但它们可能会有误报。LDREX/STREX是在ARMv6体系结构中引入的,因此您只需检查体系结构版本-如果是v6或更高版本,你有。如果没有,你就没有。从特权代码中,您可以直接读取MIDR,否则会出现一些用户空间接口,如/proc/cpuinfo 如果您真的需要实

在Linux/ARM上运行时,是否有可靠且最好无误报和误报的方法来检测LDREX/STREX原子操作的可用性?我在aux向量的AT_HWCAP字段中查找了一些内容,发现了一些可能间接暗示可用性的内容,例如HWCAP_LPAE可能会这样做,但它们可能会有误报。

LDREX/STREX是在ARMv6体系结构中引入的,因此您只需检查体系结构版本-如果是v6或更高版本,你有。如果没有,你就没有。从特权代码中,您可以直接读取MIDR,否则会出现一些用户空间接口,如/proc/cpuinfo

如果您真的需要实现能够跨所有体系结构版本工作的原子,那么您最好依赖由提供的cmpxchg,而不是尝试自己开发。

LDREX/STREX是在ARMv6体系结构中引入的,因此您只需检查体系结构版本—如果是v6或更高版本,您就有了它们。如果没有,你就没有。从特权代码中,您可以直接读取MIDR,否则会出现一些用户空间接口,如/proc/cpuinfo


如果您真的需要实现能够跨所有体系结构版本工作的原子,那么您最好依赖由提供的cmpxchg,而不是尝试使用自己的。

Mpcore,TRM没有说明您是否可以或不能以非特权模式访问它

MRC p15,0,<Rd>,c0,c0,0; reads Main ID register
cpu id注册数之后明确表示:仅在特权模式下可访问 因此,我希望/假设arm文档会对主id寄存器说同样的话。当然,为了验证这是不是核心问题,你需要费力阅读多少个主要id注册答案

啊,MIDR=主ID寄存器,不像前面提到的MIDR,我想这是一个很容易的测试,看看你是否可以在用户模式下访问MIDR

编辑:

1176确实明确说明了MIDR

只能在特权模式下访问

我想知道这个限制是否消失了

编辑2:

在mpcore上验证,您无法在用户模式下访问MIDR

编辑3:


我认为您必须依靠内核来帮助解决用户空间问题。和/或如果您只支持ARMv6或更高版本,则ldrex/strex将在那里,您无需检查,假设它不是在cortex-m上运行,而是在arm11或cortex-a/r上运行。

Mpcore,TRM不会说明您是否可以或无法在非特权模式下访问它

MRC p15,0,<Rd>,c0,c0,0; reads Main ID register
cpu id注册数之后明确表示:仅在特权模式下可访问 因此,我希望/假设arm文档会对主id寄存器说同样的话。当然,为了验证这是不是核心问题,你需要费力阅读多少个主要id注册答案

啊,MIDR=主ID寄存器,不像前面提到的MIDR,我想这是一个很容易的测试,看看你是否可以在用户模式下访问MIDR

编辑:

1176确实明确说明了MIDR

只能在特权模式下访问

我想知道这个限制是否消失了

编辑2:

在mpcore上验证,您无法在用户模式下访问MIDR

编辑3:


我认为您必须依靠内核来帮助解决用户空间问题。和/或如果您只支持ARMv6或更高版本,则ldrex/strex将在那里,您无需进行检查,假设它不在cortex-m上运行,但是arm11或cortex-a/r。通常有无数的协处理器寄存器,其中包含各种支持或不支持该指令的标志。它们是否可由非特权代码访问?好问题。您可能需要让引导加载器读取或弄清楚其他任何需要知道的信息,然后在每种模式下离开或向其他所有人提供这些信息。LDREX/STREX用于跨多个内核共享ram您能检测到在非特权代码中是否有多核处理器吗?即使是单核,由于内核调度器可以中断加载和后续存储之间的进程。据推测,内核会在上下文切换时使LDREX状态无效,这样,当进程恢复时,STREX将失败并强制重试。所以,检查多核是没有用的。通常有无数个协处理器寄存器,其中包含各种支持或不支持该指令的标志。它们是否可由非特权代码访问?好问题。您可能需要让引导加载器读取或弄清楚其他任何需要知道的信息,然后在每种模式下离开或向其他所有人提供这些信息。LDREX/STREX用于跨多个内核共享ram您能检测到在非特权代码中是否有多核处理器吗?即使是单核,由于内核调度器可以中断加载和后续存储之间的进程。据推测,内核会在上下文切换时使LDREX状态无效,这样,当进程恢复时,STREX将失败并强制重试。那么,检查多个- core是无用的。目前我依赖内核用户助手,但我收到了一些使用强化内核的用户的投诉,他们关闭了CONFIG_KUSER_助手,希望直接使用atomics。所以,也许我的问题是所谓XY问题的一个例子;我真的应该问:如何在运行时确定我应该使用kuser助手还是直接使用atomics?如果您是ARMv6+,请使用STREX/LDREX。如果您是ARMv5或更低版本,则需要探测KUSER_助手。根据链接,安装SIGSEGV并测试_kuser_helper_版本的值大于2。如果您得到一个SEGV或版本小于2,并且您是ARMv5或更低版本,那么您无法使用该内核实现无锁。当你的用户要求你做不可能的事情时,放弃。使用/proc/cpuinfo,因为一些芯片供应商将cp15寄存器搞乱,内核将提供一个可能是硬配置的解决方案。目前,我依赖内核用户助手,但我收到了一些使用硬内核的用户的投诉,他们关闭了配置助手,希望直接使用原子。所以,也许我的问题是所谓XY问题的一个例子;我真的应该问:如何在运行时确定我应该使用kuser助手还是直接使用atomics?如果您是ARMv6+,请使用STREX/LDREX。如果您是ARMv5或更低版本,则需要探测KUSER_助手。根据链接,安装SIGSEGV并测试_kuser_helper_版本的值大于2。如果您得到一个SEGV或版本小于2,并且您是ARMv5或更低版本,那么您无法使用该内核实现无锁。当你的用户要求你做不可能的事情时,放弃。使用/proc/cpuinfo,因为一些芯片供应商会把cp15寄存器搞砸,内核可能会提供一个硬配置。