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

时间:2015-08-07 14:35:20

标签: 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 has been failed!!\n");

       return (0);  
   }   

我有足够的RAM(8 [GB])并且我有足够的可用内存,但它会返回NULL

如果我在用户空间中运行此代码,它可以正常工作并捕获大量内存,但对于内核空间,它会失败!!!!

错误在哪里,我该如何解决?

3 个答案:

答案 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)

无论你拥有多少内存,它都不会增加内核使用的内存占RAM的相同比例。通常内核有1GB RAM用于其功能(我不确定确定数量)。因此,由于可用内存有限,内核模式下这种巨大分配的失败并不是一个令人惊讶的问题

答案 2 :(得分:-2)

每页:http://www.linuxjournal.com/article/6930

内核中的最大分配是(大约)1 gig

并由以下人员分配:

#include <linux/slab.h>

void * kmalloc(size_t size, int flags);

不要指望malloc()在内核中工作