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