【发布时间】:2017-11-02 21:48:00
【问题描述】:
我正在尝试编写一个程序,可以通过malloc(1024*1024*1024)从系统获取1GB内存。
得到内存的起始地址后,以我有限的理解,如果我想初始化它,只需使用memset()即可实现。但事实是一段时间后会触发 segfault。
我尝试使用gdb查找原因,最后发现如果我对内存进行一些操作超过128 MB会导致此故障。
是否有任何规则限制程序只能访问小于 128 MB 的内存?还是我分配和初始化的方式不对?
如果需要更多信息,请告诉我。
任何建议将不胜感激。
[平台]
- Linux 4.10.1 和 gcc 5.4.0
- 使用
gcc test.c -o test构建程序 - CPU:英特尔 i7-6700
- 内存:16GB
[代码]
size_t mem_size = 1024 * 1024 * 1024;
...
void *based = malloc(mem_size); //mem_size = 1024^3
int stage = 65536;
int initialized = 0;
if (based) {
printf("Allocated %zu Bytes from %lx to %lx\n", mem_size, based, based + mem_size);
} else {
printf("Error in allocation.\n");
return 1;
}
int n = 0;
while (initialized < mem_size) { //initialize it in batches
printf("%6d %lx-%lx\n", n++, based+initialized, based+initialized+stage);
memset(based + initialized, '$', stage);
initialized += stage;
}
[结果]
Allocated 1073741824 Bytes from 7f74c9e66010 to 7f76c9e66010
...
2045 7f7509ce6010-7f7509d66010
2046 7f7509d66010-7f7509de6010
2047 7f7509de6010-7f7509e66010
2048 7f7509e66010-7f7509ee6010 //2048*65536(B)=128(MB)
Segmentation fault (core dumped)
【问题讨论】:
-
向我们展示您的代码
-
这可能是代码问题,而不是内存系统问题。即使是 32 位 Linux 系统也应该支持 4GB 的虚拟内存空间。
-
检查 malloc 是否在分配失败时返回 NULL。您可能正在设置空指针,这可能会导致 SIGSEGV
-
@David 你需要 1GB 连续的虚拟内存。
-
@KChi 您应该将您正在使用的 exact 代码发布为 complete 程序而不是 sn-p。你甚至不应该问一个问题而不这样做。