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)となります。




次回
jupiteroak.hatenablog.com