2012-01-24 9 views
1

私は、割り込み処理を実装するLinuxカーネルでコードを見つけようとしています。特に、システムタイマーの処理を担当するコードを見つけようとしています。x86アーキテクチャ用のLinuxカーネルでの割り込み処理コードの位置

http://www.linux-tutorial.info/modules.php?name=MContent&pageid=86

によると、カーネルの扱いが、それは例外を扱う方法と非常によく似た割り込み:すべての一般的な>汎用レジスタは、システムスタックにプッシュされ、共通の割り込みハンドラが呼び出されます。 >現在の割り込み優先順位が保存され、新しい優先順位がロードされます。これにより、より低い優先レベルの割り込みが、この>割り込みを処理している間にカーネルを中断するのを防ぎます。その後、実際の割り込みハンドラが呼び出されます。

私はスタック上の汎用レジスタをすべてプッシュするコードと、共通の割り込み処理コードを探しています。

少なくとも汎用レジスタをスタックにプッシュすることはアーキテクチャに依存しないため、私はx86アーキテクチャに関連するコードを探しています。現時点では、カーネルソースのバージョン3.0.4を見ていますが、どのバージョンでも問題ありません。私はkernel/irq/handle.cを調べ始めましたが、レジスタを保存するようなものは見えません。登録された割り込みハンドラを呼び出すように見えます。

+0

"アーキテクチャに依存しない"とは、実際に*依存*を意味していましたか? –

答えて

0

私は

ハードウェア割り込みハンドラを実行する前に、(レジスタを含む)、現在の状態を保存し、スタック上の汎用レジスタのすべてをプッシュするコードを探しています。コードは関与していません。また、割り込みが終了すると、ハードウェアは、格納された状態から状態を読み出します。

ここで、割り込みハンドラ内のコードは、レジスタの保存されたコピーを読み書きし、割り込みが終了するときに異なる値が復元される可能性があります。これがコンテキストスイッチの仕組みです。


x86では、ハードウェアは割り込みハンドラの実行を開始する前に変更されたレジスタのみを保存します。ほとんどの組み込みアーキテクチャでは、ハードウェアはすべてのレジスタを保存します。違いの理由は、x86には膨大な数のレジスタがあり、割り込みハンドラで変更されていないものを保存して復元することは無駄になるからです。したがって、割り込みハンドラは自発的に使用するレジスタを保存して復元する責任があります。

Intel® 64 and IA-32 Architectures Software Developer’s Manual(6-15ページから)を参照してください。

+0

私はおそらく正しいと思います。x86アーキテクチャでiret命令の存在を覚えているので、これは可能です(ハードウェアが割り込みハンドラがいつ終了するかを知る方法はありません)。 CPUが割り込み信号を検出したときの動作を明示的に文書化したx86アーキテクチャ用のドキュメントの場所を知っていますか? – ryanmcfall

+0

@BenVoight:ポインタありがとうございます。インタラプトハンドラに制御を移す前に、ハードウェアがeipレジスタを保存する必要性についてのDavid Schwartzの答えのコメントが当てはまります。 割り込みハンドラは、明示的に使用するレジスタの保存と格納を担当します。しかし、割り込みが処理された結果、プロセス切り替えが発生した場合はどうなりますか?その場合、すべてのレジスタを発信プロセスのスタックにプッシュする必要があるようです。プロセス制御ブロックを実際に操作するコードはこれを実行していないようです。 – ryanmcfall

+0

@ryanmcfall:コンテキストスイッチ(yuck!)中にスタックオーバーフローが発生する可能性がある場合、スレッドスタックに格納されているとは思いません。その代わりに、スレッド制御ブロックにこれらのレジスタ用の専用空間と、おそらく 'PUSH' /' POP'の代わりに 'MOV'命令があります。 –

1

arch/i386/kernel/entry_32.Sの32ビットバージョンは、entry_64.Sの64ビットバージョンです。カーネルのエントリポイントをマークするさまざまなENTRYマクロを検索します。

+0

ありがとう、これらのファイルにSAVE_ALLマクロが見つかりました。しかし、実際に割り込み処理コードによってそれらが呼び出されるかどうかはわかりません。上記のBen Voightの答えはそうではないようです。 – ryanmcfall

+0

@ryanmcfall:割り込みハンドラ内の命令を指すように既に変更されているので、割り込みハンドラが 'EIP'レジスタを保存することは不可能であることは明らかです。同じ理由が、割り込みハンドラの起動によって変更されるいくつかの他のレジスタにも当てはまります。他のレジスタは、ハンドラ内で保存する必要があります。ハンドラによって変更されたレジスタだけを保存して復元する必要があるため、最適化が必要です。 –

関連する問題