1 kmalloc和 vmalloc
都是以字节为单位分配内存
kmalloc分配的内存都是位于3GB~high memory之间,这段内核空间与物理内存一一映射,即差为一固定值,vmalloc 分配的内存空间在VMALLOC_START~4GB之间,虚拟地址上连续物理地址上不一定连续.
一般情况下,只有硬件设备才需要物理地址连续的内存,因为硬件设备往往存在于MMU之外,不了解虚拟内存,但为了性能上的考虑,内核中一般使用kmalloc只有需要获得较大的内存时用vmalloc(kamalloc分配内存小于128kb),例如模块被动态加载到内核当中时,就把模块装载到vmalloc分配的内存上。
使用kmalloc需使用GFP_标识,kmalloc会通过__get_free_pages进行,类型如下
GFP_KERNEL 用于进程上下文,内存不足时可以睡眠,等待空闲页的出现。
GFP_ATOMIC 用于不可以睡眠进程的上下文,如中断,或软中断
GFP_DMA从ZONE_DMA进行分配,常和第一二个标识一起使用。
GFP_USER为用户空间分配内存,可能睡眠
GFP_HIGHUSER首先试图从ZONE_HIGHMEM分配,若分配不到,尝试从ZONE_NORMAL和ZONE_DMA分配
GFP_NOIO类同于GFP_KERNEL但在试图获取内存时不允许进行任何I/O操作
GFP_NOFS类同于GFP_KERNEL,但在试图获取内存时不允许进行文件系统调用
GFP_NOWAIT分配过程不会睡眠。
标示符在linux/gfp.h
2 按页分配
get_zeroed_page(unsigned int flags);
__get_free_page(unsigned int flags);
__get_free_pages(unsigned int flags,ubsigned int order);
释放页void free_page(unsigned long addr);
void free_pages(unsigned long addr,unsigned long order);