我尝试在 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
。
如果我在用户空间中运行此代码,它可以正常工作并捕获大量内存,但对于内核空间,它会失败!!!!
错误在哪里,如何解决?
最佳答案
当您使用M_NOWAIT
标志时,您只能得到NULL结果。
这基本上意味着现在没有那么多可用内存。
尝试M_WAITOK
。我还会添加一个 M_NODUMP
。结果是模块初始化进程可能会进入休眠状态,直到释放足够的内存。
内核malloc分配物理内存,该内存未分页。请参阅memory management section在《4.4BSD操作系统的设计与实现》中。相同的文本可以在《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 的连续 block 。
关于c++ - 为什么malloc不能在FreeBSD-x64内核空间分配大内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31880337/