4. 割り込みハンドラー
Linux の割り込みハンドラーは、上半分 (上半分) と下半分 (下半分) の 2 つの部分に分かれています。上半分と下半分がある理由はひとえに割り込み処理の効率化によるものです。
上半分の機能は「登録中断」です。割り込みが発生すると、デバイス ドライバーの割り込みルーチンの下半分がデバイスの実行キューの下半分にハングされ、その後は問題なく、新しい割り込みが到着するのを待ちます。このようにして、上半分は迅速に実行され、彼女が担当する機器によって生成されるより多くの中断を受け入れることができます。上部の方が速い理由は、実行が完了しない場合、他の割り込みの処理が間に合わず、割り込みハンドラが実行されるまで待つことしかできないためです。したがって、デバイスによって生成されるできるだけ多くの割り込みを処理および処理するには、割り込みハンドラーが高速である必要があります。
ただし、一部の割り込みイベントの処理はより複雑なので、割り込みハンドラーが処理を完了するまでにもう少し時間がかかる必要があります。しかし、複雑な処理を短時間で完了させるという矛盾をどう解決するか、このときLinuxは下半分の概念を導入しました。下半分と上半分の最大の違いは、下半分は中断可能であるのに対し、上半分は中断不可能であることです。
下半分は、割り込みハンドラーが行うことのほぼすべてを実行します。上半分は、下半分を担当デバイスの割り込み処理キューにキューに入れるだけで、後は何も気にしないからです。下半分は通常、デバイスを監視して割り込みを生成するイベント情報を取得し、この情報 (通常はデバイス上のレジスタを読み取ることで取得) に基づいて対応する処理を実行する役割を担います。後半で何をすべきかわからない場合は、有名なダチョウのアルゴリズムを使用して問題を解決します。率直に言って、イベントを無視します。
下半分は割り込み可能なため、実行中に他のデバイスが割り込まれた場合、そのデバイスの上半分の実行が終了するまで待ってから、再度実行することができます。ただし、注意しなければならない点が 1 つあります。つまり、デバイス割り込みハンドラーが実行されている場合、上半分が実行されているか下半分が実行されているかに関係なく、割り込みハンドラーが処理されない限り、その間にデバイスによって新しい割り込みが生成されます。この期間は割り込みは無視されます。割り込みハンドラはリエントラントではないため、同じ割り込みハンドラを並列実行することはできません。
Linux カーネル 2.0 より前では、割り込みは高速割り込みと低速割り込みに分割されていました (ここでは擬似割り込みについては説明しません)。高速割り込みの下半分も割り込み不可なので、より高速に実行できます。しかし、ハードウェアのレベルが向上し続けると、高速割り込みと低速割り込みの実行速度に差がなくなるため、割り込みルーチンのトランザクション処理の効率を向上させるために、Linux カーネル 2.0 からはすべての割り込みハンドラが組み込まれます。スロー割り込みの形式 - 下半分は割り込み可能です。
ただし、後半では、コードの特定の部分を中断できない場合に、中断をマスクすることもできます。 cti、sti、または save_flag、restore_flag を使用してアイデアを実現できます。使い方や違いについては、本記事の指定参考書の割り込み処理の章を参照してください。
詳細については、この記事で指定されている参考書籍を参照してください。ここでは詳細を説明することは目的ではありません。概念を整理することが目的です。
5. 割り込みフラグビットを設定します
割り込みを処理するとき、割り込みコントローラーは、送信した最後の割り込みが処理されるまで、最初に割り込みを送信したデバイスをブロックします。したがって、割り込みを送信したデバイスが割り込み処理中に別の割り込みを送信すると、その割り込みは永久に失われます。
これが起こる理由は、割り込みコントローラーが割り込み情報をバッファーできないためです。そのため、現在の割り込みが処理される前に新しい割り込みが到着すると、新しい割り込みは確実に失われます。ただし、メインプロセッサ(CPU)には割り込みをバッファリングする機能があるため、この不具合はメインプロセッサ(CPU)上で「割り込みフラグ設定」(sti)をセットすることで解決できます。 「割り込みフラグビットの設定」を使用すると、割り込みの処理後に、以前にマスクされた割り込みを処理するために sti 関数を使用できます。
上記は、Linux デバイス ドライバーの割り込み (1) (2) の詳細な分析です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。