3.7 代码:sbrk
sbrk
是一个用于进程减少或增长其内存的系统调用。这个系统调用由函数growproc
实现(kernel/proc.c:239)。growproc
根据n
是正的还是负的调用uvmalloc
或uvmdealloc
。uvmalloc
(kernel/vm.c:229)用kalloc
分配物理内存,并用mappages
将PTE添加到用户页表中。uvmdealloc
调用uvmunmap
(kernel/vm.c:174),uvmunmap
使用walk
来查找对应的PTE,并使用kfree
来释放PTE引用的物理内存。
XV6使用进程的页表,不仅是告诉硬件如何映射用户虚拟地址,也是明晰哪一个物理页面已经被分配给该进程的唯一记录。这就是为什么释放用户内存(在uvmunmap
中)需要检查用户页表的原因。