2

これはウィキペディアからです...

割り込み記述子テーブル(IDT)は、x86アーキテクチャが割り込みベクタテーブルを実装するために使用するデータ構造です。IDTは、割り込みと例外に対する正しい応答を決定するためにプロセッサによって使用されます... 8086プロセッサでは、IDTはアドレス0x0000から0x03ffまでのメモリ内の固定位置にあります...

これはhttp://www.linuxjournal.com/article/4048?page=0,1からです

start_kernel(/usr/src/linux/init/main.cにあります)が呼び出されると、trap_init(/usr/src/linux/kernel/traps.cにあります)が呼び出されます。trap_initは、マクロset_trap_gate(/usr/include/asm/system.hにあります)を介してIDTをセットアップし、「OffsetDescriptionis」テーブルに示されているように割り込み記述子テーブルを初期化します。

これらの2つの説明は対照的であるように見えるため、私はかなり混乱しています...最初の説明は、IDTがプロセッサに関連しており、カーネルから独立していることを示しています(実際にはカーネル内にありません)。2つ目は、LinuxカーネルがIDTを初期化し、ISRのコードを実装し、ISRのすべてのコードがカーネル内にあることを示しています。

また、デバイスがCPUへの割り込みを生成する場合、割り込みルーチンの実行を担当するのはカーネルなのかプロセッサなのか。親切に説明してください...よろしくお願いします

4

3 に答える 3

2

IDTをロードして初期化するのはカーネルだと思います。[ソース]

カーネルが割り込みを有効にする前に、IDT テーブルの初期アドレスを idtr レジスタにロードし、そのテーブルのすべてのエントリを初期化する必要があることに注意してください。このアクティビティは、システムの初期化中に実行されます。

IDT は、コンピュータがまだリアル モードで動作している間に、BIOS ルーチンによって初期化され、使用されます。ただし、Linux が引き継ぐと、IDT は RAM の別の領域に移動され、2 回目の初期化が行われます。これは、Linux が BIOS ルーチンを使用しないためです。

次のリンクをチェックしてください。

于 2011-02-26T18:34:44.573 に答える
2

BIOS は、BIOS およびブートローダーによって使用される初期 IDT をセットアップします。一部のビデオ出力を処理する INT 10h 命令などのハードウェア インターフェイスを標準化するため、16 ビット オペレーティング システムでも使用できます。32 ビットまたは 64 ビットのカーネルが起動するとき、保護モードに切り替えるために独自の IDT を指定する必要があります。

于 2011-03-01T05:07:41.403 に答える
0

IDT は、あるメモリ位置にある割り込み関数の多数のアドレスで構成されています。

デフォルトの IDT は、システムの起動時に BIOS によって設定されます。

カーネルが起動すると、通常は独自のカーネルがセットアップされます。

于 2011-02-26T17:53:05.823 に答える