log.c void initlog(int dev)
トップページ
jupiteroak.hatenablog.com
log.c
https://github.com/mit-pdos/xv6-public/blob/master/log.c#L53
void initlog(int dev) { if (sizeof(struct logheader) >= BSIZE) panic("initlog: too big logheader"); struct superblock sb; initlock(&log.lock, "log"); readsb(dev, &sb); log.start = sb.logstart; log.size = sb.nlog; log.dev = dev; recover_from_log(); }
initlog関数は、log構造体(ログに関する情報を記述したデータ構造)の初期化とOSがクラッシュした際の復旧作業を行います。
処理の内容
- logheader構造体のサイズを確認する
- log構造体に関連しているロックを初期化する
- ハードディスク上のスーパーブロックからデータを読み込む
- スーパーブロックの情報に基づいてlog構造体を初期化する
- OSがクラッシュした際の復旧作業を行う
logheader構造体のサイズを確認する
if (sizeof(struct logheader) >= BSIZE) panic("initlog: too big logheader");
logheader構造体のサイズがブロックサイズ(BSIZE→512バイト)よりも大きい場合は、メッセージを出力します。
log構造体に関連しているロックを初期化する
initlock(&log.lock, "log");
initlock関数を呼び出して、log構造体に関連しているロックを初期化します。
ハードディスク上のスーパーブロックからデータを読み込む
readsb(dev, &sb);
readsd関数を呼び出して、ハードディスク上のスーパーブロックからデータを読み込み、読み込んだデータを構造体変数sb(アドレス&sbが指定するメモリ領域)に保存します。
スーパーブロックの情報に基づいてlog構造体を初期化する
log.start = sb.logstart; log.size = sb.nlog; log.dev = dev;
ハードディスク上にあるヘッダーブロック(ログスペースの先頭ブロック)のセクタ番号sb.logstart、ハードディスク上にあるログスペースの大きさsb.nlog、ログスペースが所属しているハードディスク(マスタードライブ、スレイブドライブのどちらか)を示す値を、スーパーブロックから取得し、log構造体に保存します。
OSがクラッシュした際の復旧作業を行う
recover_from_log();
recover_from_log関数を呼び出して、ログスペースに保存されているブロックをハードディスク上のファイルシステム内に保存します。