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 に答える