fs.c void iinit(int dev)

トップページ
jupiteroak.hatenablog.com


fs.c
https://github.com/mit-pdos/xv6-public/blob/master/fs.c#L171

void
iinit(int dev)
{
  int i = 0;
  
  initlock(&icache.lock, "icache");
  for(i = 0; i < NINODE; i++) {
    initsleeplock(&icache.inode[i].lock, "inode");
  }

  readsb(dev, &sb);
  cprintf("sb: size %d nblocks %d ninodes %d nlog %d logstart %d\
 inodestart %d bmap start %d\n", sb.size, sb.nblocks,
          sb.ninodes, sb.nlog, sb.logstart, sb.inodestart,
          sb.bmapstart);
}

iinit関数は、iノードのキャッシュ領域を初期化します。

引数 dev
iノードの情報を記録したスーパーブロックが所属するハードディスク(マスタードライブ、スレイブドライブのどちらか)を示す値です。


処理の内容

initlock(&icache.lock, "icache");

initlock関数を呼び出して、icache(iノードのキャッシュ領域)の操作に関わるロックを初期化します。

  for(i = 0; i < NINODE; i++) {
    initsleeplock(&icache.inode[i].lock, "inode");
  }

メインメモリ上に用意されているiノードのキャッシュ領域にある全てのiノードエントリについて、スリープロックを初期化しておきます。

readsb(dev, &sb);

readsd関数を呼び出して、ハードディスクにあるスーパーブロックから内容を読み込み、読み込んだ内容を構造体変数sb(アドレス&sbが指定するメモリ領域)に保存します。

cprintf("sb: size %d nblocks %d ninodes %d nlog %d logstart %d\
 inodestart %d bmap start %d\n", sb.size, sb.nblocks,
          sb.ninodes, sb.nlog, sb.logstart, sb.inodestart,
          sb.bmapstart);

cprintf関数を呼び出して、メッセージを出力します。