怎样申请大块内核内存

参考答案

Linux内核环境下,申请大块内存的成功率,随着系统运行时间的增加而减少。

虽说可通过vmalloc系列调用申请物理不连续,但虚拟地址连续的内存使用效率不高,在32位系统上vmalloc的内存地址空间有限。

通常做法是在系统启动阶段申请大块内存,成功概率要相对高些,但不是100%

如果程序真的比较在意这个申请的成功与否,只能退用启动内存Boot Memory)。

下面是申请并导出启动内存的一段实例:

void* x_bootmem = NULL;
EXPORT_SYMBOL(x_bootmem);

unsigned long x_bootmem_size = 0;
EXPORT_SYMBOL(x_bootmem_size);

static int __init x_bootmem_setup(char *str)
{
        x_bootmem_size = memparse(str, &str);
        x_bootmem = alloc_bootmem(x_bootmem_size);
        printk("Reserved %lu bytes from %p for x\n", x_bootmem_size, x_bootmem);

        return 1;
}
__setup("x-bootmem=", x_bootmem_setup);

操作比较简单,但有利有弊,不可避免它也有其自身的限制:

  • 内存申请代码只能连接进内核,不能在模块中使用。
  • 被申请的内存不会被页分配器和slab分配器所使用和统计,也就是说它处于系统的可见内存之外,即使在将来的某个地方你释放了它。
  • 一般用户只会申请一大块内存,如果需要在其上实现复杂的内存管理则需要自己实现。

在不允许内存分配失败的场合,通过启动内存预留内存空间将是我们唯一的选择。

 

以上,是【怎样申请大块内核内存】的参考答案。

输出,是最好的学习方法

欢迎在评论区留下你的问题、笔记或知识点补充~

—end—

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧