OS起動編⑧ consoleinit() (Xv6を読む~OSコードリーディング~)
前回
jupiteroak.hatenablog.com
トップページ
jupiteroak.hatenablog.com
main.c
https://github.com/mit-pdos/xv6-public/blob/master/main.c#L27
int main(void) { ... consoleinit(); // console hardware ...
console.c
https://github.com/mit-pdos/xv6-public/blob/master/console.c#L288
void consoleinit(void) { initlock(&cons.lock, "console"); devsw[CONSOLE].write = consolewrite; devsw[CONSOLE].read = consoleread; cons.locking = 1; ioapicenable(IRQ_KBD, 0); }
consoleinit関数では、コンソールの入出力に関連した初期化を行っています。
処理の内容
initlock(&cons.lock, "console");
initlock関数を呼び出して、コンソールの操作に関連しているロックの初期化を行っています。
devsw[CONSOLE].write = consolewrite; devsw[CONSOLE].read = consoleread;
デバイスとそのデバイスの入力(read)・出力(write)で利用される関数の関連付けを行います。
devsw構造体は、デバイスとそのデバイスの入力(read)・出力(write)で利用される関数を関連付けるためのデータ構造です。
コンソールのデバイス番号はCONSOLE(#define CONSOLE 1)なので、devsw[CONSOLE]にコンソールの入力(read)・出力(write)で利用される関数(consolereadとconsolewrite)のアドレスをセットしておきます。
cons.locking = 1;
以降の処理でコンソールの操作に関連しているロックを取得する場合は、1を設定します。
ioapicenable(IRQ_KBD, 0);
ioapicenable関数を呼び出して、ピン番号がIRQ_KBD(#define IRQ_KBD 1)であるIRQピン(I/OAPICが持つIRQピン)に送信される割り込みを有効化しています。
ピン番号IRQ_KBD(#define IRQ_KBD 1)のIRQピンにはキーボードからの割り込みが送信されるので、その割り込みのベクタ番号は33(T_IRQ0 + IRQ_KBD)となります。