如何执行一小段C代码原子

时间:2016-06-07 18:45:16

标签: c process atomic

我有这段C代码:

// ... many stuff here ...
if ( ((*(ptr + 0xffce)) & 3) ) {
     *(ptr + 0xffce) |= 3;
     *(ptr + 0xd415) = 1 << var;
}
// ... many stuff here ...

其中一些位逻辑链接,结果值写入内存。

对于我的程序,在执行此程序部分期间不要减损CPU是至关重要的。因此,它必须以 atomic 执行,并且以代码块不可分割的方式运行。只应允许调度程序在此if块之前或之后分解CPU。

如何在普通 Linux生态系统(使用用户空间程序)上实现此目的?

编辑:下面的评论表明,如果调度程序可能没有减损CPU,则可能无法执行代码块。相反的问题是:通常是否有可能实现这一目标,我需要做些什么呢?

1 个答案:

答案 0 :(得分:1)

通常,对HW的写入应放在内核模块中。如果平台受MMU或其他内存管理保护,您显示的代码(写入hw地址)将无法在用户空间中运行。理论上,用户地址空间实际上与内核地址空间不同。

在内核模式下,解决方案很可能会自我呈现。内核中有许多时序/保护机制:preempt_disable,spin_locks,in_atomic,中断,高优先级内核定时器等等。

一般您可以通过在给定平台上禁用所有中断来实现您尝试执行的操作。这通常需要RTOS或内核代码。 (禁用所有中断也会阻止调度程序运行。)但是,在大多数平台上,这都是不受欢迎的。 (有充分的理由。)所以你必须按照平台指南来做。 &#34; preempt_disable&#34;是一个关于如何禁用调度程序的好例子,而不会禁用所有其他内容。