xv6-rev6 読み (5)

Lions' 本で malloc な記述を見たので確認してみます。確認したのは umalloc.c です。
以下な変数が定義されてます。

static Header base;
static Header *freep;

これ、umalloc.c プライベートな静的変数のはず。一切の初期処理な記述が皆無、ってあたりが微妙だったんですが、最初の状態は値として両方 0 なので最初の if な分岐の中を通過するのかな。

  if((prevp = freep) == 0){
    base.s.ptr = freep = prevp = &base;
    base.s.size = 0;
  }

で、直下に記述されてる繰り返しな記述を見るに

  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
    if(p->s.size >= nunits){

p->s.size は 0 ですな。で、次の条件分岐がナニ。

    if(p == freep)
      if((p = morecore(nunits)) == 0)
        return 0;

p と freep は同値なので、morecore という手続きがアレなんスね。この手続きは直上で定義されております。morecore が 何をしてるのか、は free という手続きまで読まないと分からない模様。
明日、朝練なのでがっつり掘削させて頂きます。