1

私は、割り込み処理を実装するLinuxカーネルのコードを見つけようと研究しています。特に、システムタイマーの処理を担当するコードを見つけようとしています。

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

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

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

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

4

2 に答える 2

1

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

于 2012-01-24T23:20:49.170 に答える
-1

スタック上のすべての汎用レジスターをプッシュするコードを探しています

ハードウェアは、割り込みハンドラを実行する前に、現在の状態(レジスタを含む)を保存します。コードは関係ありません。そして、割り込みが終了すると、ハードウェアはそれが保存されていた場所から状態を読み取ります。

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


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

6-15ページから始まるインテル®64およびIA-32アーキテクチャーソフトウェア開発者マニュアルを参照してください。

于 2012-01-25T00:22:09.807 に答える