Volatile vs VolatileRead/Write?

本文探讨了在.NET框架中Volatile与VolatileRead/Write的区别。指出VolatileRead/Write方法使用全内存屏障,这在设计上是一个错误,并已被更正。推荐使用System.Threading.Volatile类,它在运行时会根据具体处理器类型替换为合适的版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Volatile vs VolatileRead/Write?

You should never use Thread.VolatileRead/Write(). It was a design mistake in .NET 1.1, it uses a full memory barrier. This was corrected in .NET 2.0, but they couldn't fix these methods anymore and had to add a new way to do it, provided by the System.Threading.Volatile class. Which is a class that the jitter is aware of, it replaces the methods at jit time with a version that's suitable for the specific processor type.

 

 

http://stackoverflow.com/questions/15039188/volatile-vs-volatileread-write

posted on 2013-07-25 14:29 RockyLOMO 阅读(...) 评论(...) 编辑 收藏

### 正确实现 MSR_MSP 函数的内联汇编语法 在 ARM 架构中,`MSR` 指令用于将数据写入系统控制寄存器。具体到 `MSP`(Main Stack Pointer),可以通过该指令将其设置为主堆栈指针的初始值。以下是关于如何正确编写 `MSR_MSP` 函数并使用内联汇编来完成这一操作的内容。 #### 使用 C 和内联汇编实现 MSR_MSP 功能 下面是一个典型的例子,展示如何通过内联汇编将指定值传递给主堆栈指针: ```c void msr_msp(unsigned int value) { __asm__ volatile ( "msr msp, %0" : : "r"(value) : "memory" ); } ``` 在此代码片段中: - `%0` 是占位符,表示第一个输入参数 `value` 将被替换到这里[^1]。 - `"r"` 表明这个参数应该放在某个通用寄存器中作为输入。 - `volatile` 关键字告诉编译器不要优化这条汇编语句,从而确保其按原样执行[^2]。 #### 解释 BX r14 的功能 对于 `BX r14` 这一汇编语句的作用,在 ARM 中它通常用来返回子程序。这里的关键点在于: - `BX` (Branch and Exchange) 不仅跳转到由寄存器指定的目标地址,还会切换处理器模式(如果目标地址最低位为 1,则进入 Thumb 模式;否则保持 ARM 模式)。因此当执行 `BX r14` 时,实际上是利用链接寄存器 (`LR`) 来恢复调用前的状态,并可能改变当前的工作模式[^3]。 #### 安全性和注意事项 为了保证函数的安全运行以及跨平台兼容性,请注意以下几点: - **内存屏障**:有时需要显式的同步机制防止重排序问题影响硬件行为; - **特权级别检查**:某些情况下修改特殊用途寄存器需处于适当的操作权限下才能成功; - **交叉编译环境适配**:不同版本 GCC 或 Clang 可能存在细微差异,务必验证工具链支持情况后再部署实际产品环境中[^4]。 ```c // 增强版考虑了更多边界条件后的实现方式如下所示: #include <stdint.h> static inline void set_stack_pointer(uintptr_t sp_value){ asm volatile ("MSR msp,%0\n\t" :: "r"(sp_value)); } int main(){ uintptr_t new_sp=0x8000; //假设这是新的栈顶位置 set_stack_pointer(new_sp); return 0; } ``` 以上展示了更贴近真实应用场景下的封装形式,其中定义了一个静态内嵌函数专门负责更改 MSP 寄存器内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值