[Linux] カーネルスレッドが kthread_run 関数とカーネル割り込みを作成する

kthread_run関数の詳しい説明

PCIE ホットスワップ対応カーネル スレッドの作成を例に挙げます。注
: カーネル スレッドは RTOS スレッドとは少し異なります。ここでは、Linux は作成直後に実行されます。一部の RTOS スレッドは、実行する前にスケジューリング キューに追加する必要があります。 RT-Threadシステムなど
ここに画像の説明を挿入

kthread_run は、カーネル スレッド (カーネル スレッド) を作成および実行するための Linux カーネル内の関数です。

Linux カーネルでは、スレッドは独立して実行でき、プロセス リソースを共有できる軽量の実行ユニットです。ユーザー空間スレッド (ユーザー空間スレッド) とは異なり、カーネル スレッドはカーネル状態で実行され、より高い特権レベルとシステム リソースへの幅広いアクセス権を持ちます。

kthread_run 関数の機能は、新しいカーネル スレッドを作成し、それをスケジューリングのためにカーネル スレッド スケジューラに自動的に追加することです。これは、threadfn と data という 2 つのパラメータを受け入れます。

threadfn は、新しいスレッドで実行される関数を表す関数ポインタです。この関数にはパラメータがなく、戻り値の型が int である必要があります。通常、開発者は、新しいスレッドが実行する必要があるコード ロジックを threadfn 関数で記述します。

data は、threadfn 関数に渡されるパラメータを表すポインタです。開発者は、data パラメーターを使用して、カスタム データ構造またはその他の情報を新しいスレッドに渡すことができます。

kthread_run 関数は、新しいカーネル スレッドを作成し、指定された threadfn 関数を新しいスレッドのエントリ ポイントとして使用します。次に、新しいスレッドは threadfn 関数のコードの実行を開始します。開発者は、特定のタスクの実行、割り込みの処理、ハードウェアの駆動などのカスタム ロジックを threadfn に作成できます。

kthread_run はカーネル スレッドの作成と実行に使用される関数で、関数ポインタをスレッド エントリとして受け入れ、パラメータをスレッド関数に渡すことができます。kthread_run を使用すると、開発者は Linux カーネルで独自のスレッドを作成および管理し、さまざまなタイプの非同期タスク処理および同時操作を実装できます。

schedule_timeout_idle アイドル状態でタイムアウトスケジューリング関数を実行します。

効果

通常、タスクがschedule_timeoutスリープする関数を呼び出すと、その関数は負荷の原因とみなされ、システムの負荷平均に影響を与えます。ただし、一部の特定のタスクは、スリープ中のシステム負荷の一部としてカウントされたくない場合があります。

/*
 * Like schedule_timeout_uninterruptible(), except this task will not contribute
 * to load average.
 */
signed long __sched schedule_timeout_idle(signed long timeout)
{
    
    
	__set_current_state(TASK_IDLE);
	return schedule_timeout(timeout);
}

この関数ではschedule_timeout_idle、まず__set_current_state関数を呼び出して現在のタスクのステータスを に設定しTASK_IDLE、タスクがアイドル状態であることを示します。次に、schedule_timeout関数を呼び出して、指定されたタイムアウトの間スリープします。

schedule_timeoutこの関数は現在のタスクを一時停止し、指定されたタイムアウト (ティック単位) に従ってタスクをいつ起動するかを決定します。タイムアウトが経過するか、タスクをウェイクアップさせるその他のイベントが発生すると、一時停止されたタスクは実行のために再スケジュールされます。

schedule_timeout_idlefunction は、タスクがスリープ中にシステム負荷の一部としてカウントされないように、現在のタスクの状態を TASK_IDLE に設定する特別なスリープ関数です。次に、標準のschedule_timeout関数とともに使用して、指定されたタイムアウト内でスリープし、再スケジュールします。

request_threaded_irq スレッド割り込み要求

スレッド処理で割り込みを要求するために使用されます。

ここに画像の説明を挿入

 */
int request_threaded_irq(unsigned int irq, irq_handler_t handler,
			 irq_handler_t thread_fn, unsigned long irqflags,
			 const char *devname, void *dev_id)
{
    
    

パラメータは次のように説明されます。

irq: 要求する割り込み番号。handler: 上半分(上半分)の割り込みハンドラ関数ポインタへのポインタ。割り込みがトリガーされると、カーネルは高速割り込み処理のためにこのハンドラーを呼び出します。
thread_fn: 下半分 (下半分) 割り込みハンドラーへの関数ポインター。割り込みがトリガーされると、カーネルはカーネル スレッドを作成し、ハンドラーの実行をスケジュールします。このスレッドは割り込みコンテキストを使い果たし、長時間の処理操作やスリープを必要とする処理操作を実行する可能性があります。
irqflags: 割り込みフラグ。割り込み要求の属性と動作を指定するために使用されます。これは、定義済みの割り込みフラグ マクロを使用して設定できます。
devname: 割り込みを要求しているデバイスを識別するために使用されるデバイス名。dev_id: デバイス ID、割り込みハンドラーに渡されるパラメーター。
request_threaded_irq 関数は、スレッド処理による割り込みを要求するために使用され、
割り込み処理関数ハンドラーと下半分の処理関数 thread_fn をそれぞれ割り込みに関連付けます。このようにして、割り込みがトリガーされると、高速割り込み応答のために上半分のハンドラーが最初に呼び出され、次にカーネルがカーネル スレッドを作成し、より長い時間またはスリープを必要とする処理を完了するために下半分のハンドラーの実行をスケジュールします。処理操作。

このスレッド化された割り込み処理メカニズムにより、割り込み処理のリアルタイム性とスケーラビリティが向上し、割り込み処理機能が他の重要なタスクの実行をブロックすることなく、より柔軟に複雑な操作を実行できるようになります。

共有割り込みの制限と考慮事項

ここに画像の説明を挿入

1. 共有割り込みは、実デバイス ID (dev-ID) をパラメータとして渡す必要があります。実デバイス ID が提供されていない場合、どの割り込みがどのデバイスに対応するかを判断することが困難になり、割り込み解除ロジックなどの問題が発生する可能性があります。

2. 自動イネーブルの無効化は、共有割り込みと互換性がありません。無効な状態では、共有割り込みが有効化を要求し、割り込みが到着するまで永久に待機するため、問題が発生する可能性があります。

3. IRQF_COND_SUSPEND は割り込みを共有する場合にのみ意味があり、IRQF_NO_SUSPEND と同時に設定することはできません。IRQF_COND_SUSPEND は、サスペンド中に条件付き処理を中断するために使用されます。これは、割り込みが特定の条件が満たされた場合にのみ中断されることを意味します。また、IRQF_NO_SUSPEND は、割り込みが一時停止されないことを意味します。

上記の注意事項は、共有割り込みに関するいくつかの制限と使用上の考慮事項を示しています。共有割り込みの正確性と信頼性を確保するには、これらの要件を満たす必要があります。

おすすめ

転載: blog.csdn.net/qq_21688871/article/details/132104910