据我了解,在 Linux 上,进程加载器不会像堆栈那样自动为进程创建“堆”区域,这是正确的吗?
我使用过/proc/$$/maps
,在调用之前malloc()
没有“堆”区域。
答案1
Linux 不会为堆段和堆栈段“自动创建”区域。
在编程语言中总是有一个入口点,控制权从操作系统转移到程序。在C中,这就是main()
函数。
Linux 中的每个进程在 32 位环境中具有 4GB 的内存映射,在 64 位环境中具有 8TB 的内存映射。这是操作系统可以寻址的最大内存量。请注意,这与您的系统实际拥有的物理内存数量无关。每个进程都给人一种错觉,以为它是单独在计算机上的。
在调用之前main()
,操作系统将用于调用程序的命令行元素推送到最初为空的堆栈的“顶部”,这就是堆栈段是。如果main()
调用自身为函数,则传递的参数将被推送到堆栈段中。
4GB/8TB┌───────────┐
│ stack │ <- main(), argc/argv parameters and functions, growing downwards
├ ─ ─ ─ ─ ─ ┤
│ │
│ │ <- empty
│ │
│ │
├───────────┤
│ data │ <- static data and literal constants
├───────────┤
│ text │ <- all the instructions; the compiled code
0└───────────┘
现在你的问题是:
我使用过
/proc/$$/maps
,在调用 malloc 之前没有“堆”区域。
这堆内存:进程可以在运行时使用malloc()
系统调用扩展到虚拟内存的未占用部分。这动态分配内存位于上方数据在里面堆段。因此,在第一次调用之前没有堆区域或段是正常的malloc()
。
4GB/8TB┌───────────┐
│ stack │ <- main(), argc/argv parameters and functions, growing downwards
├ ─ ─ ─ ─ ─ ┤
│ │
│ │ <- empty
├ ─ ─ ─ ─ ─ ┤
│ heap │ <- malloc()'d memory space, growing upwards
├───────────┤
│ data │ <- static data and literal constants
├───────────┤
│ text │ <- all the instructions; the compiled code
0└───────────┘