分类: LINUX
2013-07-31 23:52:11
1.vmalloc
kmalloc 是用来分配内核空间内存的,malloc是用来分配用户空间的内存的
2.kmalloc分配的页在物理地址上是连续的(虚拟地址自然也是连续的)
vmalloc只确保页在虚拟地址空间内是连续的。它通过非连续的物理内存块,再“修正”页表,把内存映射到逻辑地址空间是连续的区域内。
malloc 返回的也在进程的虚拟地址空间内是连续的,但是在物理地址上不一定是连续的。
3 用于kmalloc可分配的内存大小范围在32~131027(128k)字节,并且由于它用slab分配器来分配内存的,所以,得到的内存大小可能比你申请的要大一些(它向上取2的N次幂整数)。而且如果开启了CONFIG_LARGE_ALLOCS选项,这个值可以更大,可以达到了32M。
一般申请较大的内存才使用vmalloc,例如当模块被动态加载到内核当中时,就把模块装载到由vmalloc()分配 的内存上
4.vmalloc是会睡眠的,因此不能在中断上下文中使用
kmalloc可以通过配置flags配置为可睡眠或者不可睡眠,GFP_KERNEL可以睡眠 ,GFP_ATOMIC不可以睡眠。
5.内核中vmalloc,kmalloc分配都是以字节为单位,若想以页为单位用alloc_pages类函数
当然,内核进行内存管理(MMU干的)是以物理页为基本单位的。
参考《Linux内核设计与实现》