Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxカーネルの割り込みメカニズムの分析

Linuxカーネルの割り込みメカニズムの分析

  

要約:本稿では、Linux 2.4.0カーネルのデバイス割り込みプロセスをカーネル実装の観点から分析します。この記事は、Linux I /Oサブシステムについて学びたい読者およびLinuxドライバ開発者を対象としています。

キーワード:Linuxでは、割り込みは、デバイスドライバ

免責事項:この文書は、フリーソフトウェアの精神、オープンソースに基づいて発行され、誰もが得ることができる無料の、使用とが再リリースされ、しかし、あなたはあなたのコンテンツを投稿する権利を再発行するための他の人に対する制限はありません。本稿の目的は、公開され、それが読者に役立つことを願っていますが、無保証、特定の目的のためにも、黙示の保証なし。より詳細な情報は、GNU一般公衆利用許諾契約書(GPL)を参照してください、そしてGNU Free Documentation Licenseの(GFDL)。

あなたはドキュメントと一緒にGNU一般公衆利用許諾契約書(GPL)のコピーを受け取っているはずです。まだ書いていない場合は、次のアドレスにメールを送信してください。

フリーソフトウェアファウンデーション、675 Mass Ave、ケンブリッジ、MA02139、USA

ドキュメント内の誤りおよび懸念へようこそ。

&c; 5.1 I386割り込みと例外

割り込みは通常、「同期割り込み」と「非同期割り込み」の2つのカテゴリに分類されます。同期割り込みとは、命令が実行されたときにCPUコントロールユニットが発生させる割り込みのことで、命令が中断された後にのみCPUが割り込み信号を発行することから「同期割り込み」と呼ばれます。非同期割り込みとは、CPUクロックに従って他のハードウェアデバイスによってランダムに生成された割り込み信号のことです。

Intel 80x86 CPUマニュアルでは、同期割り込みと非同期割り込みはそれぞれ「例外」と「割り込み」とも呼ばれます。 Intelおよび細部に分解割り込みと例外:

(1)割り込み

1つのノンマスカブル割り込み(マスカブル割り込み):.このような割り込みがCPU INTRに送られますeflagレジスタのIFフラグをクリアすると、このピンはオフになります。

2.ノンマスカブル割り込み:CPUのNMIピンに送られ、通常ハードウェア障害などの重大なイベントが発生すると、ノンマスカブル割り込み信号が生成されます。レジスタeflagのIFフラグは、このタイプの割り込みには影響しません。

(2)例外

1.プロセッサ検出例外:CPUが命令を実行したときに検出される異常状態によって発生する例外。異常は、制御ユニット値で発生した場合、CPUは保存基づくカーネル・モード・レジスタ・スタックをEIP、そのような異常は三種類に分けることができる:

N障害(故障):引き起こされる障害に格納されたEIP値命令アドレスなので、例外ハンドラが終了した後に命令が再実行されます。 「ページ違反」は、このような異常の一般的な例です。

n Trap:eipに格納されている値は命令アドレスですが、命令はトラップの原因となった命令アドレスの後にあります。トラップは、実行された命令を再実行する必要がない場合にのみ起動され、その主な目的はプログラムをデバッグすることです。

n中止:重大なエラーが発生した場合、CPUコントロールユニットはトラブルを除いて意味のある値をeipレジスタに保存できません。異常終了は通常、ハードウェア障害またはシステムテーブル内の無効な値によって引き起こされます。 CPU制御ユニットによって発生されるこの割り込みは、CPUの実行経路を中止されたハンドラに切り替えるために使用される緊急信号であり、対応するISRは通常、影響を受けるプロセスを中止させる以外に選択肢がない。プログラミング例外:一般に「ソフトウェア割込み」とも呼ばれ、プログラマがint命令およびint3命令などの割込み要求を発行するときに発生する割込みである。 。プログラミング例外は、intoチェックおよびboundチェックの条件が満たされていない場合にも発生します。 1つはシステムコールを実行することで、もう1つはデバッガに特定の状態を通知することです。

5.1.1割り込みベクタ

各割り込みと例外は、0から255までの符号なし整数で識別できます。Intelではこれを「割り込みベクタ(Interrupt)」と呼んでいます。ベクトル)'。一般に、ノンマスカブル割り込みと例外の割り込みベクタは固定されていますが、マスカブル割り込みの割り込みベクタは割り込みコントローラを変更するようにプログラムできます。 I386 CPUの256個の割り込みベクタは、次のように割り当てられています。

1.例外割り込みとノンマスカブル割り込みには、0から31までの合計32個のベクタが使用されます。

2.マスターおよびスレーブ8259A割り込みコントローラのIRQ入力ラインに対応して、32〜47の合計16個のベクトルがマスカブル割り込みに使用されます。

3.残りの48〜255はソフト割り込みを識別するために使用されます。

Linuxは0から47までのベクトルを使用します。しかし、48と255の間のソフト割り込みベクトルの場合、Linuxはそれらのうちの1つだけを使用します。割り込みベクトル128(0x80)はシステムコールを実装するために使用されます。ユーザーモードプロセスがint 0x80アセンブリ命令を実行すると、CPUはカーネルモードに切り替わり、システムコールを処理します。ヘッダで定義された

Linuxは定義SYSCALL_VECTORに加えて、割り込みベクタに対応する第一の周辺割り込み(IRQ0のすなわち、8259A)にマクロを表す/ASM-I386 hw_irq.h /FIRST_EXTERNAL_VECTORを含みますシステムコールに使用される割り込みベクトルを表します。以下に示すように:

/*

*外部割り込み要因に使用可能なIDTベクトルは、0x20で開始します。

*:

* /

に#define FIRST_EXTERNAL_VECTOR 0x20の

の#define SYSCALL_VECTORは0x80
256の合計の

I386 CPU IDTテーブルごとに1つの割り込みのP> 5.1.2 I386ベクトル各エントリは、対応する割り込みベクタを記述する割り込みディスクリプタで、IDT内のディスクリプタのインデックスで、サイズは8バイトです。 INTELの用語によれば、割込み記述子は「ゲート」とも呼ばれる。

割り込み記述子には、次の4種類があります。

(1)タスクゲート:プロセスのTSSセグメントセレクタを含みます。割り込み信号が発生するたびに、現在のプロセスのTSSセグメントセレクタを置き換えるために使用されます。 Linuxはタスクを使用しません。タスクのフォーマットは次のとおりです。

(2)割り込みゲート:割り込みゲートには、セグメントセレクタと割り込みハンドラのセグメント内オフセットが含まれています。 I386 CPUが割り込みゲートを通過して対応する割り込みハンドラに入ると、eflagレジスタのIFフラグをクリアし、それによって次の可能なマスカブル割り込みをマスクします。

(3)トラップゲート:割り込みゲートと同様ですが、トラップフラグを介して割り込みハンドラに転送されたときに、CPUがIFフラグをクリアしない点が異なります。

(4)Call Gate:LinuxはCall Gateを使用しません。

これら3種類のドアの形式を図5-2に示します。我々はすべて知っているように

5.1.3割り込みコントローラ8259A

、PCのマシンは2を使用し、8359A PIC(プログラマブル割り込みコントローラ、プログラマブル割り込みコントローラをカスケード接続PICと呼ばれますシステム周辺機器からの割り込み信号を管理します。各8259A PICは、8本のIRQ(割り込み要求、割り込み要求、IRQ)入力ラインを提供します。カスケードモードでカスケード回線IR2スレーブ8259A PIC(第2のPIC)のために、マスター8259A PIC(最初のPIC)INT割り込み信号入力端子、及び従って利用可能な2台の8259A 15の合計を提供してもよいですIRQ入力ライン下図のように:

図5-3マスタとスレーブの8259A割り込みコントローラのカスケード接続

5.1.3.1 8259A PICの基本原理

Copyright © Windowsの知識 All Rights Reserved