【发布时间】:2023-04-04 23:18:01
【问题描述】:
据记载,在堆上分配的变量存储在低地址区域并朝着堆栈增长,反之亦然。我决定测试一下:
#include <stdio.h>
#include <stdlib.h>
const char my_const_global_var = '0';
char my_global_var = '0';
int main(void) {
char my_stack_var = '0';
char* my_heap_var = (char*) malloc(1);
*my_heap_var = '0';
}
似乎my_const_global_var 和my_global_var 是在低地址区域中寻址的(在000XXXXX 之后和堆之前不久),但令我惊讶的是my_stack_var 的地址是完全正确大约 75% 标记(大约 bffbdaXX)。我猜当我的全局/堆/堆栈变量超过 3 GB 内存时我会得到一个段错误,所以我进行了搜索,发现提到了 a 3 GB barrier 但没有提及在剩余的 1 GB 可寻址空间中发生了什么。
剩余 25% 的内存地址空间会发生什么?
【问题讨论】:
-
在 32 位系统中只有 3.5 GB 是可寻址的(没有 PAE)。据推测,您看到的不可寻址的 512 MB 是为操作系统保留的。 Linux/Unix 系统为 root 保留 10% 的资源。
-
取决于平台。 Linux 和 Windows 使用不同的方法(Windows 是可配置的)。还取决于主机操作系统 - 32 位操作系统上的 32 位进程可以获得一种行为,而在 64 位操作系统上运行的 32 位进程可以获得不同的行为。
-
@ElliottFrisch 3.5GB 不是标准的用户模式/内核模式拆分。您可能会想到这样一个事实,即 32 位操作系统在没有 PAE 的情况下无法使用完整的 4GB 物理 RAM(由于内存映射设备占用了一些物理地址空间),但这不是这个问题的意义所在 - 并且数量取决于给定系统中安装的特定设备。它不固定为 3.5GB。
-
@AndrewMedico 是的,我正在考虑从 4gb 堆栈的顶部向后映射视频内存。
标签: c memory heap-memory stack-memory