同printf函数一样,应用层的malloc和free函数不能在内核态使用。在内核态,最常用的内存申请和释放函数为kmalloc和kfree,其原型为:
void*kmalloc(size_t size,gfp_t flags)
void*kzalloc(size_t size,gfp_t flags);//调用kmalloc分配内存并将内存清零
void kfree(const void*x);
Kmalloc函数分配的地址空间是线性映射的,它一般用来分配小于128KB的内存。kmalloc函数分配的内存必须用kfree函数释放。参数size为申请的内存大小。参数flags的值见表4-1。
表4-1 kmalloc的flags参数
如果要分配大块的内存,应使用面向页的技术。面向页内存分配函数如下:
//返回一个单个的,零填充的页。
unsigned long get_zeroed_page(gfp_t gfp_mask);(www.xing528.com)
//直接获取整页的内存(页数是2的幂)。
unsigned long__get_free_pages(gfp_t gfp_mask,unsigned int order);
//释放面向页分配的函数。
void free_pages(unsigned long addr,unsigned int order);
如果要申请一片连续的虚拟内存,需要使用vmalloc函数。vmalloc返回的虚拟内存虽然是连续的,但是映射到的物理内存是不连续的,而且可能与物理地址不是一一对应的(不同于kmalloc和__get_free_pages)。因此在使用它分配到的内存时,页表的查询比较频繁,所以效率相对较低。申请连续虚拟内存的函数原型如下:
void*vmalloc(unsigned long size);
void*vmalloc_user(unsigned long size);//为用户空间分配内存
void vfree(void*addr);//释放由vmalloc分配的内存
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。