- 论坛徽章:
- 0
|
实验环境:
Suse Enterprise Server 9 内核是 2.6.*, 小版本号记不清楚了. 是在公司机器上运行的.
在家里的虚拟机上又试了一下, 也是一样的. 下面是Linux号
linux:~ # uname -a
Linux linux 2.6.13-15-default #1 Tue Sep 13 14:56:15 UTC 2005 i686 athlon i386 GNU/Linux
最近发现了Linux分配内存的另外一个怪异的现象: Linux进程无法直接分配接近3G的连续空间.
见下面小样例: 申请1K的内存, 得到的指针是804a008
#include <stdio.h>
#include <stdlib.h>
#define SIZE 1*1024 //1K
int main()
{
void *pPtr = 0;
pPtr = malloc(SIZE);
printf("pPtr = %lx, size = %d\n", pPtr, SIZE);
return 0;
}
linux:~ # ./test_mem_start
pPtr = 804a008, size = 1024
但是如果分配1M或者大于1M内存,则得到的指针为40151008
#include <stdio.h>
#include <stdlib.h>
#define SIZE 1*1024*1024 //1M
int main()
{
void *pPtr = 0;
pPtr = malloc(SIZE);
printf("pPtr = %lx, size = %d\n", pPtr, SIZE);
return 0;
}
linux:~ # ./test_mem_start
pPtr = 40151008, size = 1048576
因为高内存3G~4G被内核映射, 因此实际上能够申请到的最大连续空间为2G, 最大的空间为3G.
这个在SuseLinux 9/10上都验证过,没有验证过其他的发行版. 不过相信这个问题应该跟发行版没有关系.
哪位大侠可以解释一下,谢谢 |
|