抱歉,如果标题没有应有的描述性,那么问题很难用几句话来形容。我试图通过 malloc'ing 找出我有多少可用内存,如果可行,则写入该段。在某些系统(x86_64 上的所有 linux)上,我在写入第 2049 个 mib 时看到了段错误。代码是:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/mman.h>
int main (int argc, char **argv) {
void *addr;
int megasize = 2100
/// allocate the memory via mmap same result
//addr = mmap ((void *) 0, (size_t) megasize << 20, PROT_READ | PROT_WRITE,
// MAP_PRIVATE | MAP_ANONYMOUS, (int) -1, (off_t) 0);
addr = malloc(megasize << 20);
if (addr == MAP_FAILED) {
fprintf (stderr, "alloc of %d megabytes failed %s\n", megasize,
strerror (errno));
exit (1);
};
printf ("got %d megabytes at %p\n", megasize, addr);
{
int i;
char *p = addr;
printf("touching the %d Mb memory:\n", megasize);
for (i = 0; i < megasize; i++) {
p[i << 20] = 0;
putchar('.');
if (i%64==63) // commenting out this line i see that it really is the 2049th mb
printf(" #%d\n", i);
fflush(stdout);
};
putchar('\n');
};
/// free the memory
munmap (addr, (size_t) megasize << 20);
return 0;
}
它在某些系统上可靠地段错误,而在其他系统上则可以正常工作。阅读失败的系统的日志告诉我它不是 oom 杀手。我可以选择一些会导致 malloc 失败的 megasize 值,但这些值更大。对于大于 2gib 且小于 malloc 为这些系统返回 -1 的限制的任何大小,段错误都会可靠地发生。
我相信我正在达到一个限制,这是 malloc 没有观察到的,我无法弄清楚它是什么。我尝试通过 getrlimit 读出一些似乎相关的限制,例如 RLIMIT_AS 和 RLIMIT_DATA 但这些限制要大得多。
这是我的 valgrindlog 的相关部分
==29126== Warning: set address range perms: large range [0x39436000, 0xbc836000) (defined)
==29126== Invalid write of size 1
==29126== at 0x400AAD: main (in /home/max/source/scratch/memorytest)
==29126== Address 0xffffffffb9436000 is not stack'd, malloc'd or (recently) free'd
任何人都可以给我一个关于问题是什么的线索吗?