17

プロセス コンテキストと割り込みコンテキストがあることは知っていますが、softirq や tasklet を実行するときに、どのコンテキストで実行されるのかわかりません。

「下半分のコンテキスト」という用語を使用している人を見たことがありますが、そのような用語がある場合、他の用語との違いは何ですか。

softirq と tasklet に対するもう 1 つの質問は、実行中にスリープが許可されないのはなぜですか??

誰でもこれらの質問を特定するのを手伝ってもらえますか、ありがとう!!

4

3 に答える 3

21

softirq と tasklet はどちらも一種の下半分のメカニズムです。プロセス コンテキストではなく割り込みコンテキストで実行されるため、スリープは許可されません。スリープが許可されている場合、Linux はそれらをスケジュールできず、最終的に dequeue_task エラーでカーネル パニックを引き起こします。割り込みコンテキストには、レジスタ情報を記述するデータ構造さえないため、Linux でスケジュールすることはできません。そのような構造に設計されており、スケジュール可能であると、割り込み処理プロセスのパフォーマンスに影響します。

于 2011-08-21T04:38:22.587 に答える
15

@kai: 下半分が実行されるコンテキストの qs reg は?

技術的には、softirq割り込みコンテキスト (「softirq」コンテキスト) で実行されます。「hard-irq」コンテキスト (ハードウェア割り込みが発生したときのコンテキスト) ではないというだけです。

したがって、softirq ハンドラーでは、Linux が提供する「ルックアップ」マクロに関しては次のようになります。

in_interrupt: はい | in_irq: いいえ | in_softirq: はい | in_serving_softirq: はい

ただし、注意してください (注意!!! :):「割り込みハンドラーに適用されるすべての制限は、下半分にも適用されます。したがって、下半分はスリープできず、ユーザー空間にアクセスできず、スケジューラーを呼び出すこともできません。」-- LDD3.

ジャーメインが残りの質問に答えます。

[更新] さらに、必要に応じてデバッグ情報を出力するのに役立つシンプルで洗練されたマクロを定義できることを指摘したいと思います。何年にもわたって、私はこれらのマクロと便利なルーチンをヘッダー ファイルに入れてきました。ここで確認してダウンロードできます: "A Header of Convenience" .

次のマクロ/関数があります。

  • DEBUG モードが On の場合のみ、(通常の printk() または trace_printk() を介して) funcname / line# 情報とともに debug を出力します。
    • カーネル モード スタックをダンプする
    • 現在のコンテキストを出力します ( ftraceが使用する形式のフラグと共にプロセスまたは割り込み)
    • シンプルな assert() マクロ (!)
    • CPU を集中的に使用する DELAY_LOOP (プロセッサでスピンする必要があるテスト リグに役立ちます)
    • ユーザーモードのスリープ機能と同等
    • 2 つのタイムスタンプ (timeval 構造体) を指定して時間差を計算する関数
    • 10 進数を 2 進数に変換し、
    • さらにいくつかの。

ふぅ:-)

于 2011-11-25T04:32:55.253 に答える
9

私は受け入れられた答えとカイワンの答えに同意しますが、彼らは言及しませんでしたksoftirqd. CPU が softirq および/またはタスクレットの負荷が高い場合、ksoftirqd発生した softirq およびタスクレットをプロセス コンテキストで処理するスレッドをスケジュールします。

したがって、OPの質問に対する答えは次のようになると思います。softirqは、割り込みコンテキストまたはプロセスコンテキストで実行できます。

更新:ローカル irq を無効にして呼び出されたrun_ksoftirqd()ショーのクイック ルック。__do_softirq()したがって、技術的にはプロセス コンテキストで実行している間は、同じ制限 (スリープしないなど) が適用されます。

于 2014-10-17T06:55:37.563 に答える