当前位置: 技术问答>linux和unix
如何写个吃内存的demo,让内核直接分配大块物理页面?
来源: 互联网 发布时间:2017-03-14
本文导语: 我试了下,不论是用for循环一个个字节的写入malloc所申请的线性地址还是用memset,内核里都是单次最多给order为零的4KB的页面,即使我写入总共为512MB的数据也是如此,每次都是从大空闲页块中分裂出4KB的最小页面,...
我试了下,不论是用for循环一个个字节的写入malloc所申请的线性地址还是用memset,内核里都是单次最多给order为零的4KB的页面,即使我写入总共为512MB的数据也是如此,每次都是从大空闲页块中分裂出4KB的最小页面,而不是直接分配大页面写入。
|
应用程序只能申请虚拟地址,malloc --> glibc --> sys_brk 。我还不能理解sys_brk的实现,只能确定映射到物理页肯定是一页一页的,不保证物理地址连续。不知道sys_brk是否会调alloc_pages
应用程序的mmap 能得到物理地址连续的缓冲区,但是需要驱动程序的配合,本质还是驱动来申请的大块连续的物理内存,那么也会受到buddy的限制。
所以应用程序是无法得到大于一页的连续的物理内存。
|
因为内核在工作的时候也会有大量的小对象分配和使用,buddy算法正是适合它的。至于用户空间的,内核只管分配4KB的虚拟内存页,至于怎么管理,用什么堆都是应用程序和库文件的工作。
2楼说的很对,如果你需要大块连续物理内存,必然就会和分页内存冲突,这部分内存不能进入虚拟内存,不能分页,也不能交换到硬盘,类似Windows里的AWE
再说虚拟内存已经很好的掩盖了物理内存地址,再说不同内存地址的访问速度通常也不会有差异。对于应用程序来说虚拟内存地址连续就已经可以了,没有必要再要求物理连续。
2楼说的很对,如果你需要大块连续物理内存,必然就会和分页内存冲突,这部分内存不能进入虚拟内存,不能分页,也不能交换到硬盘,类似Windows里的AWE
再说虚拟内存已经很好的掩盖了物理内存地址,再说不同内存地址的访问速度通常也不会有差异。对于应用程序来说虚拟内存地址连续就已经可以了,没有必要再要求物理连续。