3

構造を持つカーネルモジュールを作成しようとしています & ユーザー空間アプリケーションで同じ構造を使用したいのですが、このアプリケーションは指定されたモジュールで動作します。

主な問題は、この構造体に という名前の変数が含まれていることですspinlock_t type。ロックのためにカーネルで使用されますが、ユーザー空間アプリケーションで使用する方法がわかりません。

struct new_struct
{
  ...some variable...
  spinlock_t u_lock;
};

ユーザー空間アプリケーションでスピンロックを使用する方法はありますか?

または、カーネルとユーザー空間の両方で使用できる別のロック手法があり、ロックがユーザーアプリケーションによって保持されている場合、カーネルモジュールはそれを取得できず、その逆も同様です。

4

4 に答える 4

8

_irqsave/_irqrestore を使用すると、プリエンプトが無効になり、IRQ が無効になるため、カーネル スピンロックはユーザー空間には適していません。プリエンプションまたは IRQ の無効化は、ユーザー空間では不可能です。

最善の試みはpthread_spin_lock()私が思うことです。

于 2013-12-18T05:35:03.787 に答える
4

この構造は、カーネルとユーザー プロセス間で共有されるメモリ内にあることを理解しています。そうでない場合は、ifdef KERNELカーネルとユーザー空間で異なるロックを使用できます。

ただし、共有されている場合は、ユーザー空間がカーネルをブロックすることを許可できないため、spinglocks を使用することはできません。

これを処理する簡単な方法は、すべての情報をカーネルに保持し、ユーザー空間コードにシステム コールを発行してアクセスさせることです。

もう 1 つの方法は、この通信にロックレス データ構造 (リング バッファが一般的) を使用することです。

于 2013-02-06T08:03:54.600 に答える
1

spinlooks はカーネル構造であり、ユーザー空間では使用されません。ユーザー空間の場合、pthread ミューテックスなどのミューテックスが最適な方法です。

同じコードをユーザー空間とカーネル モードでも機能させたい場合は、ifdefs を使用する必要があります。これにより、#ifdef KERNEL使用しているタイプを選択できます。

適切な機能 (spinlook またはミューテックス) を呼び出すラッパー関数 (インライン関数の場合もある) を作成する必要があります。実際の実装は ifdefs に従ってコンパイルされます。

于 2013-02-06T08:18:03.563 に答える
0

これを行う最善の方法は、カーネル リソースをロックするための IOCTL インターフェイスを作成することです。カーネル モジュールが char ドライバー インターフェイスをユーザー空間に公開していると想定しています。ユーザー空間からのこの IOCTL 呼び出しは、呼び出されたときにカーネル スピンロックを設定およびリセットします。リソースがカーネルによってロックされているかどうかを確認するために、同じインターフェイスを使用することもできます。

于 2013-02-09T16:02:01.130 に答える