5.16. binit関数

この関数でバッファキャッシュを初期化を行う。

バッファキャッシュについては5.12. バッファキャッシュとディスクの読み書きで見た。
キャッシュを走査するためのbcache内のheadフィールドの前(prev)と後(next)のアドレスをheadフィールドの値で初期化する。
そしてforループでバッファキャッシュの全エントリ(30個)を初期化し、buf配列が循環するようにリンクさせる。 ループが終わると、headのnextはbuf配列の29番目を指すようになり、prevは0番目を指すようになる。 29番目のprevと0番目のnextはheadを指す。
headからnextを辿ると、buf配列の29, 28, 27 ... 0, headとなる。
headからprevを辿ると、buf配列の0, 1, 2 ... 29, headとなる。

bio.c

void
binit(void)
{
  struct buf *b;

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

//PAGEBREAK!
  // Create linked list of buffers
  bcache.head.prev = &bcache.head;
  bcache.head.next = &bcache.head;
  for(b = bcache.buf; b < bcache.buf+NBUF; b++){
    b->next = bcache.head.next;
    b->prev = &bcache.head;
    initsleeplock(&b->lock, "buffer");
    bcache.head.next->prev = b;
    bcache.head.next = b;
  }
}