是否可以在运行时从内核代码中分配大的(即32mb)物理连续内存区域(即不使用bootmem)?从我的实验来看,无论我使用什么GFP标志,似乎都不可能成功获得超过4mb的块。根据我读过的文档,GFP_NOFAIL应该让kmalloc等待,只要有必要就可以释放请求的数量,但是我可以告诉它只是让请求无限期挂起如果你请求超过可用 - 它似乎没有积极尝试释放内存来满足请求(即kswapd似乎没有运行)。有没有办法告诉内核积极地开始交换东西以释放所请求的分配?
编辑:所以我从尤金的回应中看出,从单个kmalloc获得一个32mb的区域是不可能的......但是有没有可能以更多的hackish方式完成它?就像识别最大的可用连续区域一样,然后手动迁移/交换它两侧的数据?
或者这样的事情:
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)
如果有足够的时间来运行,可能会有效吗?
答案 0 :(得分:1)
您可能需要查看Contiguous Memory Allocator patches。从LWN article判断,这些补丁正是您所需要的。
答案 1 :(得分:0)
Mircea的链接是一个选项;如果您的设备上有IOMMU,您也可以使用它来显示内存中一组非连续页面的连续视图。