Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2033012
  • 博文数量: 369
  • 博客积分: 10093
  • 博客等级: 上将
  • 技术积分: 4271
  • 用 户 组: 普通用户
  • 注册时间: 2005-03-21 00:59
文章分类

全部博文(369)

文章存档

2013年(1)

2011年(2)

2010年(10)

2009年(16)

2008年(33)

2007年(146)

2006年(160)

2005年(1)

分类: LINUX

2009-04-26 11:02:40

在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);


可见其应用还是比较简单的,不过利弊总是共生的,它不可避免也有其自身的限制:
  1. 内存申请代码只能连接进内核,不能在模块中使用。
  2. 被申请的内存不会被页分配器和slab分配器所使用和统计,也就是说它处于系统的可见内存之外,即使在将来的某个地方你释放了它。
  3. 一般用户只会申请一大块内存,如果需要在其上实现复杂的内存管理则需要自己实现。
在不允许内存分配失败的场合,通过启动内存预留内存空间将是我们唯一的选择。
阅读(7866) | 评论(4) | 转发(2) |
给主人留下些什么吧!~~

xiaosuo2010-03-11 10:32:26

一般不会吧,你会要多大,应该不超过最大的连续物理内存地址就行。

jinxinxin1632010-03-11 09:51:55

请问你申请“启动内存”太大的话,会不会影响kernel启动?

xiaosuo2009-05-02 21:55:39

因为申请和释放内存都涉及到页表的更改,并且以后访问用vmalloc申请的内存,更有可能导致tlb miss,效率上肯定要查一些的。

chinaunix网友2009-05-01 08:49:10

为什么你说“物理不连续但虚拟地址连续的内存使用效率不高”呢?????