C++ 为什么malloc不能在FreeBSD-x64内核空间中分配巨大的内存?
我试图在FreeBSD-x64内核空间中分配大内存,但它返回NULLC++ 为什么malloc不能在FreeBSD-x64内核空间中分配巨大的内存?,c++,c,memory,memory-management,freebsd,C++,C,Memory,Memory Management,Freebsd,我试图在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
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
如果我在用户空间中运行这段代码,它工作得很好,可以捕获巨大的内存,但在内核空间中它失败了
错误在哪里?我该如何解决这个问题?无论您有什么RAM,它都不会增加内核使用的RAM的比例,在相同比例的巨大RAM中。通常内核有1GB的RAM用于其功能(我不太确定具体数量)。因此,由于可用RAM有限,在内核模式下如此巨大的分配失败并不令人意外当您使用
M_NOWAIT
标志时,您只能得到一个空结果。
这基本上意味着现在没有这么多可用内存
试试M_WAITOK
。我还要添加一个M_NODUMP
。结果是,模块初始化进程可能处于休眠状态,直到释放足够的内存
内核malloc分配不分页的物理内存。请参阅“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的连续块。64位进程?它将尝试分配一个连续的内存范围。如果存在碎片,它将失败,即使当你把所有的空闲空间加起来时,总的来说它有足够的空闲空间。我认为内核空间的上限不一定与系统的RAM空间相匹配。奇怪的问题是,为什么你需要分配这么大的内存?@Robinson-true,可能是寻找一个连续的内存范围。我需要它作为特殊的内存池。是的,我需要连续的内存范围。为什么这在用户空间很好,但在内核空间有问题?我有大约6[GB]的可用空间。不,内核没有任何限制。我认为巨大内存的连续范围在内核空间有问题。连续范围肯定是个问题。在我看来,由于我知道内核空间的一些限制,在内核空间中拥有非常大的连续范围是非常困难的。你自己说在用户空间中它会带来成功,那么为什么会这样。我已经检查了M_WAITOK,但FreeBSD感到恐慌。我一点也不知道穆诺邓普!!!!!然后可能没有足够的内存来做你想做的事情。