如果你真的需要一个大的物理上连续的缓冲, 最好的方法是在启动时请求内存来分配它. 在启动时分配是获得连续内存页而避开 get_free_pages 施加的对缓冲大小限制的唯一 方法, 不但最大允许大小还有限制的大小选择. 在启动时分配内存是一个"脏"技术, 因为 它绕开了所有的内存管理策略通过保留一个私有的内存池. 这个技术是不优雅和不灵活的, 但是它也是最不易失败的. 不必说, 一个模块无法在启动时分配内存; 只有直接连接到内 核的驱动可以这样做.

启动时分配的一个明显问题是对通常的用户它不是一个灵活的选择, 因为这个机制只对连 接到内核映象中的代码可用. 一个设备驱动使用这种分配方法可以被安装或者替换只能通 过重新建立内核并且重启计算机.

当内核被启动, 它赢得对系统种所有可用物理内存的存取. 它接着初始化每个子系统通过 调用子系统的初始化函数, 允许初始化代码通过减少留给正常系统操作使用的 RAM 数量, 来分配一个内存缓冲给自己用.

启动时内存分配通过调用下面一个函数进行:

#include <linux/bootmem.h>

void *alloc_bootmem(unsigned long size); void *alloc_bootmem_low(unsigned long size);

void *alloc_bootmem_pages(unsigned long size); void *alloc_bootmem_low_pages(unsigned long size);

这些函数分配或者整个页(如果它们以 _pages 结尾)或者非页对齐的内存区. 分配的内存 可能是高端内存除非使用一个 _low 版本. 如果你在为一个设备驱动分配这个缓冲, 你可 能想用它做 DMA 操作, 并且这对于高端内存不是一直可能的; 因此, 你可能想使用一个

_low 变体.

很少在启动时释放分配的内存; 你会几乎肯定不能之后取回它,
如果你需要它. 但是, 有 一个接口释放这个内存:

void
free_bootmem(unsigned long addr, unsigned long size);

注意以这个方式释放的部分页不返回给系统 -- 但是, 如果你在使用这个技术, 你已可能 分配了不少数量的整页来用.

如果你必须使用启动时分配, 你需要直接连接你的驱动到内核. 应当如何完成的更多信息 看在内核源码中
Documentation/kbuild 下的文件.

最新文章

  1. ReSharper详解Index0
  2. Mybatis学习记录
  3. CE程序
  4. 深入理解C语言的函数调用过程
  5. 关于Eclipse的unsupported major minor version 51.0 错误
  6. .net(C#)操作文件的几种方法汇总
  7. 最简单的视音频播放示例5:OpenGL播放RGB/YUV
  8. HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))
  9. JavaScript入门(2)
  10. 高效算法——E - 贪心-- 区间覆盖
  11. SDUT 1124-飞跃荒野(三维BFS)
  12. [tarjan] hdu 3836 Equivalent Sets
  13. centos-php安装
  14. 读书笔记 effctive c++ Item 20 优先使用按const-引用传递(by-reference-to-const)而不是按值传递(by value)
  15. 微信JS初始化--微信JS系列文章(一)
  16. getMemory的经典例子
  17. Caravel–一款开源OLAP+数据可视化分析前端工具,支持Druid和Kylin
  18. Hello2 source analysis
  19. Tomcat 下配置一个ip绑定多个域名
  20. 匿名函数lambda,过滤函数filter,映射类型map

热门文章

  1. iOS将image转90,180,270度的方法
  2. oracle-17113错误
  3. SPARK-SQL内置函数之字符串函数
  4. Project configuration is not up-to-date with pom.xml. Run Maven-&gt;Update Project or use Quick Fix
  5. sqlite数据库文件导入到sqlserver 2016-03-26 21:55 1292人阅读 评论(1) 收藏
  6. 原生js复习1.0
  7. Java练习 SDUT-1211_英文金曲大赛
  8. Python基础:06条件和循环
  9. shell爬虫
  10. 解决pip is configured with locations that require TLS/SSL问题