在Linux内核编程中内存的申请不同于系统编程,她有自己的一套机制。
1. kmalloc
函数原型:void *kmalloc( size_t size, int flags )
参数说明:size --- 要分配的内存块大小
flags --- 分配标志,常用的有GFP_KERNEL(会引起睡眠),GFP_ATOMIC(不引起睡眠,分配不到,立即返回)
函数特点:申请的内存位于内核物理内存映射区域,物理上连续,与真实的物理地址只有一个固定偏移值,通过不同的分配标志可控制分配动作。
底层依赖:__get_free_page()
释放函数:free_page(),free_pages()
2.__get_free_page()
函数原型:__get_free_page(unsigned int flags)
参数说明: flags --- 分配标志,常用的有GFP_KERNEL(会引起睡眠),GFP_ATOMIC(不引起睡眠,分配不到,立即返回)
函数特点:用于获取一个空闲的新页,该函数实际是个宏,定义为__get_free_pages( (gfp_mask),0 )。该函数还有一系列类似的函数可使用。
底层依赖:__get_free_pages()
释放函数:kfree()
3. vmalloc()
函数原型:void *vmalloc( unsigned long size );
参数说明:size --- 要分配的内存块大小
函数特点:用于分配大块的内存,开销很大,需建立新的页表。
底层依赖:kmalloc
释放函数:vfree()