PLICの実装
本章では外部割り込みと複数の入出力デバイスの割り込みを調停するための仕組みを実装します。
執筆中!!!(概要だけ書いてます)
外部割り込みとは何か?
外部のデバイスに接続することがある。 デバイスから割り込みを発生させたいことがある。 それらの割り込みのことを、ソフトウェア割り込み、タイマ割り込みと区別して、外部割り込みという。 外部割り込みは複数のデバイスから発生することがある。 そのため、外部割り込みの順序付け、制御などが必要である。 それらを扱うモジュールを割り込みコントローラという。
RISC-Vと外部割り込み
RISC-Vにおいて、外部割り込みの割り込みコントローラはPLIC(Platform-level interrupt controller)が定義されている。ただし、ISAの仕様には含まれていない。 PLICはMMIOによってアクセスできるデバイスであり、それぞれのCPUコアに対して次の機能を提供する。
- 外部割り込みの有効無効の管理
- 外部割り込みの順序付け
- 割り込み信号の供給
- 割り込みの完了判定
PLICデバイスには次のレジスタが定義されていて、メモリマップは図TODOのようになっている。
- レジスタの一覧
あああ
メモリマップの図
コアに対して外部割り込みを発生させられるとき、PLICはそのコアのmipレジスタのMEIPビットを立ち上げます。 これによって割り込みが発生したとき、割り込みを処理するプログラムは次のように割り込みを実行するべきです。
- (外部デバイスで割り込みの原因が発生し、PLICに通知され、mip.MEIPビットが
1になり、割り込みが発生する) - レジスタの値をメモリに退避する
- PLICのレジスタを読み込み、割り込み要因を特定する
- 割り込みを処理する
- PLICに割り込み処理の完了を通知する
- xRET命令を実行し、割り込み処理を終了する
図にすると、図TODOのように外部割り込みが処理されます。
図
PLICデバイスの実装
plic_memoryモジュールを実装する
とりあえず何もないまま
入力デバイスを接続する
FIFOにつなぐ 完成
PLICをテストする
優先度を設定して、割り込みが発生することを確認する
優先度を変えて、割り込みが発生していないことを確認する