2

我一直在尝试实现一个给我带来问题的 linux system_call,我怀疑这是因为我的代码没有锁定(或者可能是抢占)。

我在一个非常频繁调用的函数中有一个关键部分(每次进行 system_call 时都会调用这个自定义函数),它也由 system_calls 启动/停止。有没有办法确保每次在 linux 内核中进行任何系统调用时都会发生的这个关键部分是不可抢占的,并且必须在其他任何事情发生之前完成执行?

4

1 回答 1

2

如果我正确理解了这个问题,最简单的方法是使用自旋锁:

#include <linux/spinlock.h>

static DEFINE_SPINLOCK(foo_lock);

int my_system_call(...)
{
        ...
        /* critical section starts */
        spin_lock(&foo_lock);
        /* critical section goes here */
        ...
        /* critical section ends */
        spin_unlock(&foo_lock);
        ...
}

这样的临界区将是不可抢占的,临界区的并发执行不会重叠。

于 2013-01-29T19:22:54.123 回答