我有这段C代码:
// ... many stuff here ...
if ( ((*(ptr + 0xffce)) & 3) ) {
*(ptr + 0xffce) |= 3;
*(ptr + 0xd415) = 1 << var;
}
// ... many stuff here ...
其中一些位被逻辑链接,结果值被写入内存。
对于我的程序,在执行此程序部分期间不占用 CPU 是至关重要的。因此,它必须原子 执行并且以代码块不可分割的方式运行。只应允许调度程序在此 if
block 之前或之后占用 CPU。
如何在普通 Linux 生态系统(使用用户空间程序)上实现这一目标?
编辑: 下面的评论表明,如果 CPU 可能不会被调度程序分散注意力,可能无法执行代码块。相反的问题是:通常有可能实现这个目标吗?我需要为此做什么?
最佳答案
一般来说,写入硬件应该放在内核模块中。如果平台受 MMU 或其他内存管理保护,则您显示的代码(写入硬件地址)将无法在用户空间中运行。理论上,用户地址空间实际上不同于内核地址空间。
在内核模式下,解决方案很可能会自行呈现。内核中有许多计时/保护机制:preempt_disable、spin_locks、in_atomic、中断、高优先级内核计时器等等。
一般您可以通过在给定平台上禁用所有中断来实现您想要做的事情。这通常需要 RTOS 或内核代码。 (禁用所有中断也会阻止调度程序运行。)但是,在大多数平台中,这是不受欢迎的。 (有充分的理由。)所以你必须按照平台指南去做。 “preempt_disable”是一个很好的例子,说明如何在不禁用所有其他程序的情况下禁用调度程序。
关于c - 如何原子地执行一小段 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37687010/