我尝试在FreeBSD-x64内核空间中分配大内存,但它返回NULL。
void *ptr = NULL;
static int
init_module(void)
{
u_long SIZE_ALLOC = ((u_long)2500 * 1024 * 1024);
ptr = malloc(SIZE_ALLOC, M_DEVBUF, M_NOWAIT);
if( !ptr )
uprintf("Allocation has been failed!!\n");
return (0);
}
我有足够的RAM(8 [GB]
)并且我有足够的可用内存,但它会返回NULL
。
如果我在用户空间中运行此代码,它可以正常工作并捕获大量内存,但对于内核空间,它会失败!!!!
错误在哪里,我该如何解决?
答案 0 :(得分:4)
使用M_NOWAIT
标志时,只能获得NULL结果。
它基本上意味着现在没有那么多可用的内存。。
试试M_WAITOK
。我也会添加一个M_NODUMP
。结果是模块初始化进程可能会被释放,直到释放足够的内存。
内核 malloc 分配 phyisical memory ,它不会被分页。请参阅" 4.4BSD操作系统的设计和实现"中的memory management section。在FreeBSD操作系统的设计和实现中,可以逐字逐句地找到相同的文本。
您可以查看sysctl vm.phys_free
可用的物理内存量。在我的机器上显示:
FREE LIST 0:
ORDER (SIZE) | NUMBER
| POOL 0 | POOL 1 | POOL 2
-- -- -- -- -- -- -- --
12 ( 16384K) | 0 | 0 | 0
11 ( 8192K) | 0 | 0 | 0
10 ( 4096K) | 0 | 0 | 0
9 ( 2048K) | 0 | 0 | 0
8 ( 1024K) | 0 | 0 | 0
7 ( 512K) | 0 | 0 | 0
6 ( 256K) | 0 | 0 | 0
5 ( 128K) | 33 | 4 | 0
4 ( 64K) | 2137 | 112 | 0
3 ( 32K) | 18136 | 116 | 5
2 ( 16K) | 20492 | 47 | 11111
1 ( 8K) | 2817 | 24 | 23422
0 ( 4K) | 1396 | 32 | 4956
如果我正确解释了这一点,我无法使用内核malloc分配一个连续的块> 128K。
答案 1 :(得分:0)
答案 2 :(得分:-2)
每页:http://www.linuxjournal.com/article/6930
内核中的最大分配是(大约)1 gig
并由以下人员分配:
#include <linux/slab.h>
void * kmalloc(size_t size, int flags);
不要指望malloc()在内核中工作