是否有可能在运行时从内核代码分配大的(即 32mb)物理连续的内存区域(即不使用 bootmem)?从我的实验来看,无论我使用什么 GFP 标志,似乎都不可能成功获得超过 4mb 的块。根据我读过的文档, GFP_NOFAIL 应该让 kmalloc 只需等待释放请求的数量,但据我所知,如果您请求的数量超过可用数量,它只会使请求无限期挂起 -它似乎没有主动尝试释放内存来满足请求(即 kswapd 似乎没有运行)。有没有某种方法可以告诉内核积极地开始交换内容以释放请求的分配?
编辑:所以我从 Eugene 的回复中看到,不可能从单个 kmalloc 获得 32mb 区域......但是是否有可能以更黑客的方式完成它?就像确定最大的可用连续区域,然后手动迁移/交换其两侧的数据一样?
或者像这样的事情怎么样:
1) Grab a bunch of 4mb chunks until you're out of memory.
2) Check them all to see if any of them happen to be contiguous, if so,
combine them.
3) kfree the rest
4) goto 1)
如果有足够的时间运行,这可能有效吗?
您可能想看看连续内存分配器补丁 https://lkml.org/lkml/2011/7/20/45。从绿网文章 http://lwn.net/Articles/396702/,这些补丁正是您所需要的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)