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

标签 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

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

错误在哪里,如何解决?

最佳答案

当您使用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/

相关文章:

c - 警告 : ‘noreturn’ function does return

c++ - 在 lambda 中使用未捕获的变量

c++ - std::regex:匹配由数字和空格组成的字符串,并提取数字。怎么样?

c - 如何将此 C 代码转换为汇编 IA32?

c - 在 malloc 的结构中初始化原子标志

javascript - 在 three.js 中释放内存

pointers - 如何检查两个变量是否指向内存中的同一个对象?

c++ - 如何从内存中读取,就像使用 iostream 从文件中读取一样?

c++ - 使用 Boost 预构建包

c++ - vector 类如何接受多个参数并从中创建一个数组?