我试图从以下两个来源计算出共享内存段的范围,即进程内存布局中的内存映射段。
从 https://manybutfinite.com/post/anatomy-of-a-program-in-memory/中,我找到了一个进程内存布局的图表
内存映射段和堆是否会增长,直到它们相遇?
或者这两个段中的每一个都有成长的限制,类似于堆栈段的RLIMIT_STACK?

From的Linux编程接口
为了允许堆和堆栈的增长空间,共享内存段从虚拟地址0x40000000开始附加。映射映射(第49章)和共享库(第41和42章)也放在这一领域。(共享内存映射和内存段放置的默认位置有一些变化,这取决于内核版本和进程RLIMIT_STACK资源限制的设置。)地址0x40000000定义为内核常量TASK_UNMAPPED_BASE。
共享内存段是否从TASK_UNMAPPED_BASE开始并向上增长?
请注意,上面的图表显示共享内存段向下增长,所以它是向上增长还是向下增长?

谢谢。
发布于 2018-09-02 21:03:03
有几个限制适用于mmap段和堆段。RLIMIT_AS确定总体上可用的地址空间;这涵盖了程序可以进行的所有内存分配。RLIMIT_DATA确定数据段的最大大小。
内核根据这些限制检查堆栈扩展、mmap和brk (堆分配)。它还针对潜在冲突的段检查分配,这样段就不会相互覆盖(例如,请参阅为堆分配执行的检查brk)。如果分配是不可能的,则程序会被适当地“通知”:C库为brk返回一个D7错误,如果不能扩展堆栈,内核会用SIGSEGV杀死程序.
共享内存段(严格地说,从内核角度来看,虚拟内存区域)的增长取决于内存布局,内存布局可以从一个进程到另一个进程。在大多数体系结构中,“遗留”内存映射导致从TASK_UNMAPPED_BASE开始的自下而上分配;非遗留内存映射导致自顶向下分配。有关示例,请参阅arch_pick_mmap_layout()和mmap_is_legacy()中的x86体系结构。您可以使用setarch的S -L标志切换到遗留内存映射(参见下面的示例)。
实际上,通过查看/proc/$/maps并检查加载的共享库(如果有的话)的地址(如果有的话),您可以看到段是如何增长的。动态链接器总是先加载;如果它的地址比其他库低,那么分配是自下而上的,否则是自顶向下的。比较cat /proc/self/maps和setarch x86_64 -L cat /proc/self/maps在64位x86系统上的输出.
https://unix.stackexchange.com/questions/466443
复制相似问题