4

最近、私はいくつかのインタビューに参加しました。尋ねられたすべてのカーネルの質問のうち、説得力のある答えを見つけることができなかった特定の質問が 1 つあります。

ユーザー空間プロセスと割り込みコンテキスト関数の間でデータを共有しながら、さまざまな同期手法をどのように使用しますか? 私の説得力のある答えは次のとおりです。

割り込みコンテキスト コード:

1. do *spin_lock_irqsave*
2. access data buffer which is shared between user space app and kernel
3. do *spin_lock_irqrestore*

それから、これは説得力のある答えではありませんでした。データアクセスのすべてのインスタンスで行う必要がirqsaveありますか?irqrestore

4

1 に答える 1

2

割り込みコンテキストからユーザー空間コンテキストにデータを直接転送することはできません。割り込み処理では処理情報がないため、どこにデータを送信すればよいかわかりません。カーネル空間から中間プロセス コンテキストを使用する必要があります。

さて、質問に答えます。デバイス データには、割り込みコンテキストからのデータを格納するバッファがあります。スピンロックを使用してデータを保護する必要がありますが、irqsave/irqrestore 部分は使用しません。あなたは割り込みコンテキストにいるからです。

次に、デバイスは、ユーザー空間がこのデータを取得する方法を提供します。char デバイス、netlink ソケット、ioctl 呼び出し、またはその他の方法のいずれかを使用して決定します。ユーザー空間でこのデータが必要な場合はmemcpy、デバイス バッファーからユーザー空間バッファーに移動します。ただし、割り込みコードをデッドロックさせたくないため、spin_lock_irqsave/ペアを使用してデバイス バッファーを保護します。spin_lock_irqrestore

ユーザー空間が上記のメソッドのいずれか (char device read、netlink socket、ioctlcall など) を使用する場合、カーネルはロック機構を提供しますが、ユーザー空間とプロセスの間のインターフェース用です。

于 2012-10-16T05:21:13.197 に答える