日期:2014-05-16  浏览次数:20650 次

如何写个吃内存的demo,让内核直接分配大块物理页面?
我试了下,不论是用for循环一个个字节的写入malloc所申请的线性地址还是用memset,内核里都是单次最多给order为零的4KB的页面,即使我写入总共为512MB的数据也是如此,每次都是从大空闲页块中分裂出4KB的最小页面,而不是直接分配大页面写入。

------解决方案--------------------
因为内核在工作的时候也会有大量的小对象分配和使用,buddy算法正是适合它的。至于用户空间的,内核只管分配4KB的虚拟内存页,至于怎么管理,用什么堆都是应用程序和库文件的工作。
2楼说的很对,如果你需要大块连续物理内存,必然就会和分页内存冲突,这部分内存不能进入虚拟内存,不能分页,也不能交换到硬盘,类似Windows里的AWE
再说虚拟内存已经很好的掩盖了物理内存地址,再说不同内存地址的访问速度通常也不会有差异。对于应用程序来说虚拟内存地址连续就已经可以了,没有必要再要求物理连续。

------解决方案--------------------
探讨

引用:

lz既然知道了干嘛还问呢
buddy算法只对kmallc和alloc_pages 有效
buddy算法最大只能分配2^MAX_ORDER个连续的物理页,也就是2^11*4KB=8MB 而已

哦,那就是说用户空间的应用的下面在调用alloc_pages时只能传入order为0的参数对吧?