屏障指令 - 防止优化导致错误

本文探讨了处理器流水线设计和编译器优化如何导致程序代码顺序重排,从而可能引入错误。以preempt_disable()和preempt_enable()为例,展示了代码可能的不正确重排方式。为解决这个问题,文章介绍了在计数器修改前后使用屏障指令来防止CPU指令优化,确保代码执行顺序的正确性。这在驱动和其他关键操作中至关重要。
摘要由CSDN通过智能技术生成

处理器流水线设计、编译器优化设计,为了获得更高性能,有时程序代码顺序会被重新编排。

这种 重编排有时 会带来意外的程序 错误。

如:

preempt_disable();
function_which_must_not_be_preempted();
preempt_enable();
可能如下重排效果:
function_which_must_not_be_preempted();
preempt_disable();
preempt_enable();
也可能如下重排效果:
preempt_disable();
preempt_enable();
function_which_must_not_be_preempted();

为了消除这种重排影响,可以在计数器修改前后添加屏障指令:

<preempt.h>
#define preempt_disable() \
do { \
inc_preempt_count(); \
barrier(); \
} while (0)

驱动为了防止cpu指令优化执行,可以使用 屏障指令,如:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值