1

schedule()エミュレーション部分を機能させるために、ATOMIC コンテキストで呼び出す必要があるエミュレーション ドライバーを作成しています。今のところ、schedule()ATOMIC(スピンロックなど)コンテキスト内で呼び出すことができるこのハックがあります。

int p_count = current_thread_info()->preempt_count;

current_thread_info()->preempt_count = 0;
schedule();
current_thread_info()->preempt_count = p_count;

しかし、それは IRQ 内では機能しません。システムは呼び出し後に停止するだけschedule()です。

私ができるようにカーネルをハックする方法はありますか? ユーザーモードLinuxでLinuxカーネル4.2.1を使用しています

4

1 に答える 1

5

カーネル コードでは、割り込みコンテキストまたはプロセス コンテキストのいずれかになります。割り込みコンテキストでは、ブロッキング関数 ( など) を呼び出すことも、ポインターschedule()にアクセスすることもできません。currentこれはカーネルの設計方法に関連しており、割り込みコンテキストでそのような機能を使用する方法はありません。この回答も参照してください。

目的に応じて、目標を達成できる戦略を見つけることができます。schedule()自然なカーネル フローに頼るのではなく、明示的に呼び出さなければならないというのは奇妙に思えます。

考えられるアプローチの 1 つを次に示します (ただし、これも特定の目標によって異なります)。IRQ を使用して、ワーク キューでワークをスケジュールできますschedule_work()。実際、ワーク キューは設計上、カーネル コードをプロセス コンテキストで実行します。そこから、ブロッキング関数を呼び出して、現在のプロセス データにアクセスできます。

于 2015-12-14T16:28:08.180 に答える