xv6の割り込み処理の実装は基本的にx86用に記述されているため、それを他のアーキテクチャに移植するのはなかなか骨が折れる。
RISC-Vのアーキテクチャでは割り込み処理は下記のPrivileged Architecture Manualに従っており、0x100番台のアドレスもしくは、High Trap Base Address(0xF...FE00から始まるアドレス)からスタートする。 とりあえず基本的なモードとして0x100番台からのアドレスから割り込み処理を受け付ける構成を利用したいが、xv6の構成はx86用のため、なかなか大変だ。
x86の場合は、IDTというテーブルを用いて割り込みが発生した場合にどこにジャンプするのかが決まる。
ところが、RISC-Vや他のRISCアーキテクチャでは割り込みの位置が決まっているため、そこに合わせるように割り込みベクタのアドレスを調整しないといけない。 しかし今回はブートコードのアドレスの低い部分(bootblock)と実際のプログラムが入っている部分が別のオブジェクトとしてコンパイルされるため、 割り込みを受け付けてから、実際の割り込み処理ルーチンに渡す方法が思いつかない。 やっぱり、High Trap Base Addressを使ったほうが要領が良いのかな...
とりあえず現状としては、xv6のブートコードはRISC-Vで動作するようになったものの、まだ最初のプロセスが立ち上がらない。 まだまだ試行錯誤が続きそうだ。