割り込みの優先度

ローカル APIC 経由で割り込みがプロセッサにあがる場合、ベクタ番号に応じて割り込みの優先度が決まる。

割り込み優先度 = ベクタ番号/16

1 が最低、15 が最高の優先度となる。ベクタ番号は 0 〜 255(8 bit)であり、ベクタ 0 〜 31 は IA32 アーキテクチャ専用として予約済みなので、ユーザ定義の割り込みの優先度は 2 〜 15 となる。なお、同じ優先度内ではベクタ番号が大きい方が、レベルは高くなる。(ベクタ番号の上位 4 bit はベクタ優先度、下位 4 bit は優先度グループ内の順位となる)

ローカル APIC は割り込み処理のためにタスク優先度、プロセッサ優先度を定義している。

  • プロセッサの優先度

PRR(プロセッサ・プライオリティ・レジスタ)に書き込まれる 0 〜 15 の値。PRR は読み出し専用で、現在の優先度を知るために使用する。

  • タスク優先度

TPR(タスク・プライオリティ・レジスタ)に書き込まれる 0 〜 15 の値。S/W が設定する。S/W は TPR を利用し、プロセッサに割り込みをあげることができる優先度の閾値を決定できる。プロセッサは、TPR 内で指定された優先度より、高い優先度を持つ割り込みだけを処理する。通常は、カーネルがより優先度の低い割り込みを抑止するために使用する。例えば、TPR 13 に設定したら、13 以下の割り込みはあがってこなくなる。


+------+
| 15 |
+------+
| 14 |
TPR = 13 --------------+------+---------
^ | 13 |
| +------+
| | 12 |
マスクされる | +------+
割り込みの | | |
範囲 | . . .
| | |
| +------+
| | 2 |
| +------+
| | 1 |
| +------+
| | 0 |
v +------+