2

私は次のようなコードを書きました:

非中断コンテキストにあります。

spin_lock_irqsave(&lock, flags);
printk("some message blah...\n");
spin_unlock_irqrestore(&lock, flags);

このコードを実行していますが、クラッシュが見られないため、安全に「見えます」。しかし、これが本当に安全なコードかどうかはわかりません。1/100000 の確率でシステム クラッシュを引き起こす可能性があるためです。

さらに、spin_lock_irqsave 内で "sleep" 関数を呼び出すことが安全かどうか (非割り込みコンテキストで) 知りたいです。

4

1 に答える 1

4

カーネル コードは、スピン ロックを保持している間はスリープしてはなりません。Linux Device Drivers, Third Editionでは、第 5 章の「スピンロックとアトミック コンテキスト」セクションに次のように記載されています。

Therefore, the core rule that applies to spinlocks is that any code must,
while holding a spinlock, be atomic. It cannot sleep; in fact, it cannot
relinquish the processor for any reason except to service interrupts (and
sometimes not even then).

についてprintkは、クリティカル セクション内で呼び出すのが安全だと思います。ソースコードのコメントには、次のことも記載されています。

This is printk(). It can be called from any context. We want it to work.
于 2014-12-18T17:43:36.950 に答える