怎样申请大块内核内存
2011-12-30 15:13
288 查看
在Linux内核环境下,申请大块内存的成功率随着系统运行时间的增加而减少,虽然可以通过vmalloc系列调用申请物理不连续但虚拟地址连续的内存,但毕竟其使用效率不高且在32位系统上vmalloc的内存地址空间有限。所以,一般的建议是在系统启动阶段申请大块内存,但是其成功的概率也只是比较高而已,而不是100%。如果程序真的比较在意这个申请的成功与否,只能退用“启动内存”(Boot Memory)。下面就是申请并导出启动内存的一段示例代码:
可见其应用还是比较简单的,不过利弊总是共生的,它不可避免也有其自身的限制:
内存申请代码只能连接进内核,不能在模块中使用。
被申请的内存不会被页分配器和slab分配器所使用和统计,也就是说它处于系统的可见内存之外,即使在将来的某个地方你释放了它。
一般用户只会申请一大块内存,如果需要在其上实现复杂的内存管理则需要自己实现。
在不允许内存分配失败的场合,通过启动内存预留内存空间将是我们唯一的选择。
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分配器所使用和统计,也就是说它处于系统的可见内存之外,即使在将来的某个地方你释放了它。
一般用户只会申请一大块内存,如果需要在其上实现复杂的内存管理则需要自己实现。
在不允许内存分配失败的场合,通过启动内存预留内存空间将是我们唯一的选择。
相关文章推荐
- 内核态用vmalloc申请大块内存
- 内核态用vmalloc申请大块内存
- 内核中的内存申请
- linux驱动开发--内核空间中内存的申请与释放
- 转:内核中的内存申请:kmalloc、vmalloc、kzalloc、kcalloc、get_free_pages
- [初级知识]linux内核开发中基本内存分配与申请
- 内核怎样管理你的内存
- 在windows内核中申请内存时遇到的问题
- nginx内存管理--大块内存空间申请 ngx_palloc_large
- 内核怎样管理你的内存
- [简记]内核中申请内存和用户空间中申请内存的函数(kmalloc/vmalloc/malloc)对比
- 内核的几个内存动态申请函数
- 详细讲解从用户空间申请内存到内核如何为其分配内存的过程
- 通过伙伴系统申请内核内存的函数有哪些?
- 通过slab分配器申请内核内存的函数有?
- 怎样让 dma_alloc_coherent() 可以申请更大的内存
- PHP内核探索:内存的申请与销毁
- linux 内核 内存管理 bootmem alloctor 申请内存
- php内核探索笔记-内存的申请与释放
- 驱动申请大块内存