简而言之:进程的虚拟地址空间是连续的吗?
我需要了解内核为进程分配的虚拟地址。如果我所述有误,请纠正我。
在进程创建时,内核会为其分配虚拟内存,并将进程各个段的虚拟地址的起始位置和结束位置存储在
现在假设一个进程的堆已经用完并且需要增加堆大小,调用
如果虚拟地址范围是连续的,那么新分配的堆块是否是从最初为该进程分配的范围之外提供的?还是以使新块相邻于原块的方式分配?如果没有空间(因为内存映射段正在那里),它如何跟踪?
如果虚拟地址范围不连续,
您能否澄清一下我的概念?
我需要了解内核为进程分配的虚拟地址。如果我所述有误,请纠正我。
在进程创建时,内核会为其分配虚拟内存,并将进程各个段的虚拟地址的起始位置和结束位置存储在
task_struct
中的mm_struct
中。现在假设一个进程的堆已经用完并且需要增加堆大小,调用
brk()
。如果虚拟地址范围是连续的,那么新分配的堆块是否是从最初为该进程分配的范围之外提供的?还是以使新块相邻于原块的方式分配?如果没有空间(因为内存映射段正在那里),它如何跟踪?
如果虚拟地址范围不连续,
vm_struct
如何跟踪堆(或任何其他段)的不同地址范围块?您能否澄清一下我的概念?
brk()
,尽管我承认我最近没有看过这个。另一方面,如果我没记错的话,OpenBSD对于每个分配都使用mmap()
。 - ninjalj