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構造体のサイズを確認する

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関数を呼び出して、ログスペースに保存されているブロックをハードディスク上のファイルシステム内に保存します。