linux – 进程的虚拟地址范围

前端之家收集整理的这篇文章主要介绍了linux – 进程的虚拟地址范围前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
简而言之:一个进程的虚拟地址空间是连续的吗?

我需要了解内核分配给进程的虚拟地址.如果我继续错误,请纠正我.

在进程创建时,内核将虚拟内存分配给进程,并在task_struct的mm_struct中存储进程的不同段的虚拟地址的开始和结束.

现在说一个进程已经用完了堆,需要增加堆size.calls brk().

如果虚拟地址范围是连续的,那么新分配的堆块是否从最初为此进程分配的范围之外提供?或者它是以新块与原始块相邻的方式分配的.如果没有空间(因为内存映射段正在那里),该怎么办?它是如何跟踪的?
如果虚拟地址范围不连续,vm_struct如何跟踪堆(或任何其他段)的地址范围的不同块?

你可以清楚我的概念吗?

解决方法

虚拟地址空间不连续.查看cat / proc /< pid> / mem的输出.

在启动进程时,内核为动态链接器和进程本身分配几个映射.之后,动态链接器通过mmap()分配更多映射,并且进程可以通过mmap()分配更多映射,并通过brk()扩展堆. dlmalloc和衍生物上的malloc()使用brk()进行短于阈值的分配,使用mmap()进行大于或等于该阈值的分配(大约128K IIRC).

在任何情况下,当调用mmap()时,内核通常将内存映射到远离堆的位置,因此通常有足够的空间来扩展堆.如果没有剩余的虚拟空间来扩展堆,则brk()将失败.

原文链接:https://www.f2er.com/linux/393928.html

猜你在找的Linux相关文章