- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
黄松青 现实驱动中的问题 如何使用系统内存? 如何使用外设内存/IO或寄存器? 并发和竞争如何处理? 如何进行中断处理? 如何调试驱动程序? … … 使用系统内存 系统内存作为重要的资源受系统内存管理的子系统的统一管理 由于MMU的存在,我们不能直接的使用物理内存 外设和驱动程序对内存有不同的要求,如连续性和硬件对地址的要求 要避免内存碎片的产生 使用系统内存 kmalloc() 原型 #include linux/slab.h void *kmalloc(size_t size, int flags); 特性 --与用户程序中malloc有相似之处 --分配的区也是在物理内存中连续 --分配的内存要求不能大于128K --分配过程中有可能阻塞,这取决于参数 --这个函数快(除非它阻塞)并且不清零它获得的内存 --成功返回一个虚拟地址, 失败返回NULL 使用系统内存 Kmalloc()参数解释 size --是要分配的块的大小 flags –分配的指示,解释如下 GFP_ATOMIC 用来从中断处理和进程上下文之外的其他代码中分配内存. 从不睡眠. GFP_KERNEL 内核内存的正常分配. 可能睡眠. GFP_USER 用来为用户空间页来分配内存; 它可能睡眠. GFP_HIGHUSER 如同 GFP_USER, 但是从高端内存分配 GFP_NOIO GFP_NOFS --这个标志功能如同 GFP_KERNEL, 但是它们增加限制到内核能做的来满足请求. 一个 GFP_NOFS 分配不允许进行任何文件系统调用, 而 GFP_NOIO 根本不允许任何 I/O 初始化. 它们主要地用在文件系统和虚拟内存代码, 那里允许一个分配睡眠, 但是递归的文件系统调用会是一个坏注意. 使用系统内存 kmalloc()参数解释 上面列出的这些分配标志可以是下列标志的相或来作为参数, 这些标志改变这些分配如何进行: __GFP_DMA 这个标志要求分配在能够 DMA 的内存区. 确切的含义是平台依赖的 __GFP_HIGHMEM 这个标志指示分配的内存可以位于高端内存. __GFP_COLD 正常地, 内存分配器尽力返回缓冲热的页 -- 可能在处理器缓冲中找到的页. 相反, 这个标志请求一个冷页, 它在一段时间没被使用. __GFP_NOWARN 这个很少用到的标志,当一个分配无法满足阻止内核来发出警告(使用 printk ). __GFP_HIGH 这个标志标识了一个高优先级请求, 它被允许来消耗甚至被内核保留给紧急状况的最后的内存页. __GFP_REPEAT __GFP_NOFAIL __GFP_NORETRY 这些标志修改分配器如何动作, 当它有困难满足一个分配. __GFP_REPEAT 意思是 更尽力些尝试 通过重复尝试 -- 但是分配可能仍然失败. __GFP_NOFAIL 标志告诉分配器不要失败; 它尽最大努力来满足要求. 使用 __GFP_NOFAIL 是强烈不推荐的; 可能从不会有有效的理由在一个设备驱动中使用它. 最后, __GFP_NORETRY 告知分配器立即放弃如果得不到请求的内存. 使用系统内存 进程的空间 使用系统内存 内存区 -- linux将物理内存分三个区:DMA,NORMAL,HIGHMEM区, 如何分是与平台相关的 -- DMA区,外设可以在这里进行 DMA 存取. 在大部分的健全 的平台, 所有的内存都在这个区. 在 x86, DMA 区用在 RAM 的前 16 MB, 这里传统的 ISA 设备可以进行 DMA; PCI 设备没有这个限制 -- NORMAL区,linux内核能访问的地址的物理内存区域, 1G以下 -- HIGHMEM区,linux不能直接映射访问的1G以上的区域 使用系统内存 kfree() #include linux/slab.h void kfree(void *obj); 释放kmalloc分配的内存, obj参数是kmalloc返回的指针 使用系统内存 vmalloc()和vfree() 原形: #include linux/vmalloc.h void *vmalloc(unsigned long size); void vfree(void * addr); 特性:
文档评论(0)