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関数を呼び出し、メモリ領域を解放します(メモリ領域を未使用状態にします)。