linux内核驱动基础(2)分配内存

linux内核驱动基础(2)分配内存

ID:33876975

大小:57.70 KB

页数:8页

时间:2019-03-01

linux内核驱动基础(2)分配内存_第1页
linux内核驱动基础(2)分配内存_第2页
linux内核驱动基础(2)分配内存_第3页
linux内核驱动基础(2)分配内存_第4页
linux内核驱动基础(2)分配内存_第5页
资源描述:

《linux内核驱动基础(2)分配内存》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、kmalloc()该函数具体接口如下:void*kmalloc(size_tsize,intgfp_mask)该函数返回一个指向内存块的指针,其内存大小为至少size字节,所分配的内存区在物理地址上是连续的,不过不会对所获取的内存清零,出错吋,返回NULL.kmalloc()是一个简单的接口,它可以获得以字节为单位的一块内存,该函数执行的速度很快,除非被阻塞kmalloc()分配的内存必须由kfree()释放,与用户空间malloc()函数类似,分配和冋收要配对使用,以避免内存泄露和其他BUG,注意调用kfree(NULL)是安全的.下面介绍相关参数的使用

2、:gfp_mask表示分配标志符,有如下常用标志:GFP.KERNEL内核中最常用的标志,该标志使用的是普通优先级,同时会引起休眠,因此不能在屮断上下文或者软屮断屮使用.GFP_KERNEL会引起休眠的原因是,系统空闲内存较少的时候会把当前进程转入休眠以等待空闲的页面,比如当前进程休眠吋,内核会交换或者刷新一些页面到硬盘上,以获取空闲的内存页面GFP_ATOMIC这个标志表示不会休眠的内存分配,因此可以在中断上下文或者软中断屮使用.GFP_ATOMIC不会休眠的原因是,内核通常会原子性的预留一些空闲的页面,使用GFP_ATOMIC标志吋,kmalloc()

3、甚至可以用掉最后一个空闲页而,当最后一个空闲页面也没有时,分配就会失败所以相对于GFP_KERNEL标志,GFP_ATOMIC标志分配成功的可能性小一些,尤其在内存短缺时GFP.DMA该标志表示分配器必须从ZONE_DMA屮进行分配,一般在需要使用DMA的驱动程序中调用,这个标志会与GFP_KERNEL和GFP_ATOMIC结合起來使用,比如:(GFP_DMA

4、GFP_KERNEL)需要用于DMA的内存,可以唾眠(GFP_DMA

5、GFP_ATOMIC)需要用于DMA的内存,不可以睡眠GFP.USER该标志用来为用户空间分配内存,可能导致休眠下面介绍kmal

6、loc()函数的变体:void*kzalloc(size_tsize,intgfp_mask)该函数用法和kmalloc()-样,只是分配的内存已经清零get_free_pages()该函数具体接口如下:unsignedint_get_free_pages(unsignedintgfp_mask,unsignedintorder)该函数是基于页的分配函数,因此在分配整数页内存并且物理地址必须连续的时候,使用而向页的分配技术会更好些,这样会减少内存碎片的出现,该函数分配若干物理内存连续的页面,返回值是该内存区第一个页的逻辑地址.内存页释放函数如下:voidf

7、ree_pages(unsignedlongaddr,unsignedlongorder)释放页时要谨慎,只能释放属于你的页,传递错误的地址或者错误的order值,都可能导致系统崩溃.下面介绍相关参数的使用:order表示分配的页数是2的order次方,order可允许最大的值是10(2的10次方即1024页)或者11(2的11次方即2048页),这个依赖于硬件体系结构.超过该值就会返回失败.gfp_mask表示分配标志符,各标志的含义与kmalloc()完全一致,最常用的也是GFP_KERNEL,GFP_ATOMIC,GFP_DMA下面介绍_et_fre

8、e_pages()函数的变体:get_zeroed_page(unsignedintgfp_mask)该函数只分配一个新页面并将该页面清零,使用free_page()释放_get_free_page(unsignedintgfp_mask)该函数只分配一个新页面,但该页面不清零,使用free_page()释放kmalloc()和_get_free_pages()的异同:kmalloc()和_get_free_pages()分配的内存在物理地址上都是连续的,当然虚拟地址也是连续的,该内存与真实的物理内存只有一个固定的偏移,因此存在较为简单的转换关系,硬件设备

9、可以直接使用该内存,比如作为DMA原地址或者口的地址—get_free_pages()®数属于按页分配不会浪费内存相反使用kmalloc()函数因为分配粒度的原因而浪费一定数量的内存vmalloc()该函数具体接口如下:void*vmalloc(unsignedIongsize)该函数返冋一个指针,指向虚拟地址连续的内存空间,大小至少为size.发生错误时,函数返回NULL,该函数可能休眠,因为它的内部实现使用了标志为GFP_KERNEL的kmalloc()函数,因此不能在中断上下文和软中断中调用voidvfree(void*addr)该函数释放vmall

10、oc()获得的内存,无返回值,它也可能休眠,因此也不能在中断上下文

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。