C++ 为什么malloc不能在FreeBSD-x64内核空间中分配巨大的内存?

C++ 为什么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

我试图在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

如果我在用户空间中运行这段代码,它工作得很好,可以捕获巨大的内存,但在内核空间中它失败了


错误在哪里?我该如何解决这个问题?

无论您有什么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感到恐慌。我一点也不知道穆诺邓普!!!!!然后可能没有足够的内存来做你想做的事情。