gpt4 book ai didi

linux - 进程的虚拟地址范围

转载 作者:IT王子 更新时间:2023-10-28 23:38:55 27 4
gpt4 key购买 nike

简而言之:进程的虚拟地址空间是连续的吗?

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

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

现在说a进程已经用完了堆,需要增加堆大小。调用brk()

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

你能澄清一下我的概念吗?

最佳答案

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

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

无论如何,当调用 mmap() ,内核通常将内存映射到远离堆的地方,因此通常有足够的空间来扩展堆。如果没有剩余的虚拟空间来扩展堆,brk()会失败。

关于linux - 进程的虚拟地址范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5928327/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com