bootmain.c void waitdisk(void)

トップページ
jupiteroak.hatenablog.com


bootmain.c
https://github.com/mit-pdos/xv6-public/blob/master/bootmain.c#L50

void
waitdisk(void)
{
  // Wait for disk ready.
  while((inb(0x1F7) & 0xC0) != 0x40)
    ;
}

waitdisk関数は、ハードディスクが使用できる状態であることを確認します。

in命令(ポート入力命令)でポートアドレス0x1f7を指定することにより、ハードディスクコントローラが持つStatus Registerの値を読み取っています。
Status Registerは、現在のハードディスクドライブの状態を示しているレジスタです。
読み取った値を 0xC0(0b1100 0000)でマスク処理することにより、Status Registerのbit7(BSYフラグ)とbit6(RDYフラグ)の値を取り出しています。
((r = inb(0x1f7)) &0xC0) != 0x40 が偽となる場合→取り出した値(0b xx00 0000)が0x40(0b 0100 0000)と同じ場合→Status Registerのbit7(BSYフラグ)に1がセットされていない、かつ、Status Registerのbit6(RDYフラグ)に1がセットされている場合は、whileループから脱出して次の処理に進みます。
Status Registerのbit6(RDYフラグ)に1がセットされている時は、ハードディスクドライブがスピンダウンやエラーを起こしていないことを意味しています。
((r = inb(0x1f7)) &0xC0) != 0x40 が真となる場合→取り出した値(xx00 0000)が0x40(0100 0000)と異なる場合→Status Registerのbit7(BSYフラグ)に1がセットされている場合は、whileループを繰り返します。
Status Registerのbit7(BSYフラグ)に1がセットされている時は、Status Registerのbit6(RDYフラグ)に1がセットされていても意味をなしません。