首页 理论教育 Linux驱动程序开发实例:内存分配与释放技巧

Linux驱动程序开发实例:内存分配与释放技巧

时间:2023-10-19 理论教育 版权反馈
【摘要】:kmalloc函数分配的内存必须用kfree函数释放。表4-1 kmalloc的flags参数如果要分配大块的内存,应使用面向页的技术。面向页内存分配函数如下://返回一个单个的,零填充的页。void free_pages;如果要申请一片连续的虚拟内存,需要使用vmalloc函数。vmalloc返回的虚拟内存虽然是连续的,但是映射到的物理内存是不连续的,而且可能与物理地址不是一一对应的。申请连续虚拟内存的函数原型如下:void*vmalloc;void*vmalloc_user;//为用户空间分配内存void vfree;//释放由vmalloc分配的内存

Linux驱动程序开发实例:内存分配与释放技巧

同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参数

978-7-111-56706-6-Chapter04-3.jpg

如果要分配大块的内存,应使用面向页的技术。面向页内存分配函数如下:

//返回一个单个的,零填充的页。

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分配的内存

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈