- 1、本文档共22页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux设备驱动程序学习(8)-分配内存
内核为设备驱动提供了一个统一的内存管理接口,所以模块无需涉及分段和分页等问题。 我已经在第一个scull模块中使用了 kmalloc 和 kfree 来分配和释放内存空间。
kmalloc 函数内幕
kmalloc 是一个功能强大且高速(除非被阻塞)的工具,所分配到的内存在物理内存中连续且保持原有的数据(不清零)。原型:
#include linux/slab.h void *kmalloc(size_t size, int flags); size 参数
内核管理系统的物理内存,物理内存只能按页面进行分配。kmalloc 和典型的用户空间 malloc 在实际上有很大的差别,内核使用特殊的基于页的分配技术,以最佳的方式利用系统 RAM。Linux 处理内存分配的方法:创建一系列内存对象集合,每个集合内的内存块大小是固定。处理分配请求时,就直接在包含有足够大内存块的集合中传递一个整块给请求者。
必须注意的是:内核只能分配一些预定义的、固定大小的字节数组。kmalloc 能够处理的最小内存块是 32 或 64 字节(体系结构依赖),而内存块大小的上限随着体系和内核配置而变化。考虑到移植性,不应分配大于 128 KB的内存。若需多于几个 KB的内存块,最好使用其他方法。
flags?参数
内存分配最终总是调用 __get_free_pages 来进行实际的分配,这就是 GFP_ 前缀的由来。
所有标志都定义在 linux/gfp.h ,有符号代表常常使用的标志组合。
主要的标志常被称为分配优先级,包括:
GFP_KERNEL
最常用的标志,意思是这个分配代表运行在内核空间的进程进行。内核正常分配内存。当空闲内存较少时,可能进入休眠来等待一个页面。当前进程休眠时,内核会采取适当的动作来获取空闲页。所以使用 GFP_KERNEL 来分配内存的函数必须是可重入,且不能在原子上下文中运行。
GFP_ATOMIC
内核通常会为原子性的分配预留一些空闲页。当当前进程不能被置为睡眠时,应使用 GFP_ATOMIC,这样kmalloc 甚至能够使用最后一个空闲页。如果连这最后一个空闲页也不存在,则分配返回失败。常用来从中断处理和进程上下文之外的其他代码中分配内存,从不睡眠。
GFP_USER
用来为用户空间分配内存页,可能睡眠。
GFP_HIGHUSER
类似?GFP_USER,如果有高端内存,就从高端内存分配。
GFP_NOIO
GFP_NOFS
功能类似 GFP_KERNEL,但是为内核分配内存的工作增加了限制。具有GFP_NOFS 的分配不允许执行任何文件系统调用,而 GFP_NOIO 禁止任何 I/O 初始化。它们主要用在文件系统和虚拟内存代码。那里允许分配休眠,但不应发生递归的文件系统调。
Linux 内核把内存分为 3 个区段: 可用于DMA的内存(位于一个特别的地址范围的内存, 外设可以在这里进行 DMA 存取)、常规内存和高端内存(为了访问(相对)大量的内存而存在的一种机制)。目的是使每中计算机平台都必须知道如何将自己特定的内存范围归类到这三个区段中,而不是所有RAM都一样。
当要分配一个满足kmalloc要求的新页时, 内核会建立一个内存区段的列表以供搜索。若指定了 __GFP_DMA, 只有可用于DMA的内存区段被搜索;若没有指定特别的标志, 常规和 可用于DMA的内存区段都被搜索; 若 设置了 __GFP_HIGHMEM,所有的 3 个区段都被搜索(注意:kmalloc 不能分配高端内存)。
内存区段背后的机制在 mm/page_alloc.c 中实现, 且区段的初始化时平台相关的, 通常在 arch 目录树的 mm/init.c中。 有的标志用双下划线做前缀,他们可与上面标志“或”起来使用,以控制分配方式:
__GFP_DMA
要求分配可用于DMA的内存。
__GFP_HIGHMEM
分配的内存可以位于高端内存.
__GFP_COLD
通常,分配器试图返回“缓存热(cache warm)”页面(可在处理器缓存中找到的页面)。 而这个标志请求一个尚未使用的“冷”页面。对于用作 DMA 读取的页面分配,可使用此标志。因为此时页面在处理器缓存中没多大帮助。
__GFP_NOWARN
当一个分配无法满足,阻止内核发出警告(使用 printk )。
__GFP_HIGH
高优先级请求,允许为紧急状况消耗被内核保留的最后一些内存页。
__GFP_REPEAT
__GFP_NOFAIL
__GFP_NORETRY
告诉分配器当满足一个分配有困难时,如何动作。__GFP_REPEAT?表示努力再尝试一次,仍然可能失败; __GFP_NOFAIL 告诉分配器尽
您可能关注的文档
- linux教程 第08课_内存和设备管理.ppt
- 附录A表2 工程施工资料归档范围与组卷目录.pdf
- 附英语专业论文写作规范与模版.doc
- linux教程.第3节 存储管理.ppt
- Linux进程管理-兄弟连PHP视频教程课件下载解析.pdf
- UL588圣诞灯串测试要点详解(UL588 lighting chain)知识.ppt
- Linux课程实验指导书教案.doc
- Linux命令符教案.doc
- Linux命令基础_IT168文库教材.ppt
- UL基本知识课件.pdf
- 金融产品2024年投资策略报告:积极适应市场风格,行为金融+机器学习新发现.pdf
- 交运物流2024年度投资策略:转型十字路,峰回路又转(2023120317).pdf
- 建材行业2024年投资策略报告:板块持续磨底,重点关注需求侧复苏.pdf
- 宏观2024年投资策略报告:复苏之路.pdf
- 光储氢2024年投资策略报告:复苏在春季,需求的非线性增长曙光初现.pdf
- 公用环保2024年投资策略报告:电改持续推进,火电盈利稳定性有望进一步提升.pdf
- 房地产2024年投资策略报告:聚焦三大工程,静待需求修复.pdf
- 保险2024年投资策略报告:资产负债匹配穿越利率周期.pdf
- 政策研究2024年宏观政策与经济形势展望:共识与分歧.pdf
- 有色金属行业2024年投资策略报告:新旧需求共振&工业原料受限,构筑有色大海星辰.pdf
文档评论(0)