fs.c void readsb(int dev, struct superblock *sb)

トップページ
jupiteroak.hatenablog.com


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

void
readsb(int dev, struct superblock *sb)
{
  struct buf *bp;

  bp = bread(dev, 1);
  memmove(sb, bp->data, sizeof(*sb));
  brelse(bp);
}

readsb関数は、ハードディスク上にあるスーパーブロック(セクタ1)からデータを読み込み、読み込んだデータを構造体変数sbに保存します。

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

引数 struct superblock *sb
superblock構造体(スーパーブロックを表現したデータ構造)の変数を指定するアドレスです。


処理の内容

 bp = bread(dev, 1);

bread関数を呼び出して、ハードディスク上にあるスーパーブロックの内容を取得しバッファbpに保存します。第一引数にはスーパーブロックが所属するハードディスク(マスタードライブ)を示す値devを指定し、第ニ引数にはスーパーブロックのセクタ番号を指定します。

memmove(sb, bp->data, sizeof(*sb));

memmove関数を呼び出して、スーパーブロックに対応しているバッファ(スーパーブロックの内容を含むバッファ)bp->dataから、先頭アドレスsbのメモリ領域へ、データをコピーします。

 brelse(bp);

brelse関数を呼び出して、バッファに関連しているスリープロックを解放し、他のプロセスがこのバッファを利用できるようにします。