在 Linux 中创建堆区域/段

在 Linux 中创建堆区域/段

据我了解,在 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└───────────┘

相关内容