snaka; 第7章 割り込みとFIFO - uchan-nos/os-from-zero GitHub Wiki
割り込みの終了は、0xfee000b0
番地(End of Interrupt レジスタと呼ばれる)に何かしら値を書き込むとCPUに伝えられる
volatile auto end_of_interrupt = reinterpret_cast<uint32_t*>(0xfee000b0);
*end_of_interrupt = 0;
コンパイラの最適化の影響を避けるため volatile
が必要。
- IDT
- Interrupt Descriptor Table (割り込み記述子テーブル)
- 割り込み要因番号と割り込みハンドラを対応付けるためのテーブル
-
offset_low, offset_middle, offset_high
- 割り込みハンドラのアドレスを設定するフィールド
- 3つを組み合わせて64ビットアドレスとして利用する
-
segment_selector
- 割り込みハンドラを実行する際のコードセグメントを指定する
-
attr (ビットフィールド)
- type
- 記述子の種別
-
14
(Interrupt Gate) ← 通常の割り込みはコレ -
15
(Trap Gate)
-
- 記述子の種別
- DPL (descriptor_privilege_level)
- 割り込みハンドラの実行権限
- ほとんどのケースで
0
で良い ??
- IST (interrupt_stack_table)
- ?? 常に
0
- ?? 常に
- present
- 記述子が有効であることを示すフラグ
-
1
を設定する
- type
-
ビットフィールド
- ビット単位に名前をつけられる
- 型にあまり意味はなく、設定されているビット幅以上の符号なし整数を指定する
- MSI割り込み
- Message Signaled Interrupts
- 特定のアドレス (Message Address) に対して 32 ビットの値 (Message Data) を書き込むことで割り込みを発生させる
- Destination ID
- 通知する CPU コアの番号を設定する
- Vector
- 割り込みベクタ番号
割り込みに関連するインラインアセンブラ
-
cli
命令- CPU の割り込みフラグ (IF:Interrupt Flag) を 0 にする命令
- IF が 0 のとき、CPUは外部割り込みを受け取らなくなる
- 割り込みの処理中に別の割り込みが発生しないようにするときに使用する
-
sti
命令- CPU の割り込みフラグ (IF:Interrupt Flag) を 1 にする命令
- IF が 1 のとき、CPUは外部割り込みを受け取るようになる
-
cli
と対になる
-
hlt
命令- CPU が省電力モードになる
- 割り込みが発生するまで命令の実行が停止する
- 割り込みが発生したら、省電力モードから復帰して割り込みハンドラを処理し、割り込みハンドラが終了すると
hlt
の次の命令から処理が再開される