怎样申请大块内核内存?

迷失技术de小猪 Linux 37

在 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 分配器所使用和统计,也就是说它处于系统的可见内 存之外,即使在将来的某个地方你释放了它。 一般用户只会申请一大块内存,如果需要在其上实现复杂的内存管理则需要自己实现。 在不允许内存分配失败的场合,通过启动内存预留内存空间将是我们唯一的选择。

回复

我来回复
  • 暂无回复内容

免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部