kalloc.c void freerange(void *vstart, void *vend)

トップページ
jupiteroak.hatenablog.com


kalloc.c
https://github.com/mit-pdos/xv6-public/blob/master/kalloc.c#L46

void freerange(void *vstart, void *vend)
{
  char *p;
  p = (char*)PGROUNDUP((uint)vstart);
  for(; p + PGSIZE <= (char*)vend; p += PGSIZE)
    kfree(p);
}

freerange関数は、仮想アドレスvstartから仮想アドレスvendの範囲において、4KB境界のアドレス値ごとにkfree関数を呼び出し、メモリ領域を解放します(メモリ領域を未使用状態にします)。

引数 *vstart
解放されるメモリ領域(未使用状態となるメモリ領域)のうち、先頭にある4KBのページの先頭アドレス(仮想アドレス)です。

引数 *vend
解放されるメモリ領域(未使用状態となるメモリ領域)のうち、最後尾にある4KBのページの先頭アドレス(仮想アドレス)です。


処理の内容

vstartを4KB境界に切り上げる

char *p;
p = (char*)PGROUNDUP((uint)vstart);

PGROUNDUPマクロを使って、アドレスvstartを4KB境界のアドレス値(0x1000倍のアドレス値)に切り上げます。

vstartからvendの範囲でkfree関数を呼び出しメモリ領域を解放する。

for(; p + PGSIZE <= (char*)vend; p += PGSIZE)
    kfree(p);

for文を使って、4KB境界のアドレス値ごとにkfree関数を呼び出し、メモリ領域を解放します(メモリ領域を未使用状態にします)。