加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 进程的虚拟地址范围

发布时间:2020-12-13 19:29:48 所属栏目:Linux 来源:网络整理
导读:简而言之:一个进程的虚拟地址空间是连续的吗? 我需要了解内核分配给进程的虚拟地址.如果我继续错误,请纠正我. 在进程创建时,内核将虚拟内存分配给进程,并在task_struct的mm_struct中存储进程的不同段的虚拟地址的开始和结束. 现在说一个进程已经用完了堆,
简而言之:一个进程的虚拟地址空间是连续的吗?

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

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

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

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

你可以清楚我的概念吗?

解决方法

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读