linux 在启动时获得专用的缓冲
如果你真的需要一个大的物理上连续的缓冲, 最好的方法是在启动时请求内存来分配它. 在启动时分配是获得连续内存页而避开 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 下的文件.
最新文章
- ReSharper详解Index0
- Mybatis学习记录
- CE程序
- 深入理解C语言的函数调用过程
- 关于Eclipse的unsupported major minor version 51.0 错误
- .net(C#)操作文件的几种方法汇总
- 最简单的视音频播放示例5:OpenGL播放RGB/YUV
- HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))
- JavaScript入门(2)
- 高效算法——E - 贪心-- 区间覆盖
- SDUT 1124-飞跃荒野(三维BFS)
- [tarjan] hdu 3836 Equivalent Sets
- centos-php安装
- 读书笔记 effctive c++ Item 20 优先使用按const-引用传递(by-reference-to-const)而不是按值传递(by value)
- 微信JS初始化--微信JS系列文章(一)
- getMemory的经典例子
- Caravel–一款开源OLAP+数据可视化分析前端工具,支持Druid和Kylin
- Hello2 source analysis
- Tomcat 下配置一个ip绑定多个域名
- 匿名函数lambda,过滤函数filter,映射类型map
热门文章
- iOS将image转90,180,270度的方法
- oracle-17113错误
- SPARK-SQL内置函数之字符串函数
- Project configuration is not up-to-date with pom.xml. Run Maven->;Update Project or use Quick Fix
- sqlite数据库文件导入到sqlserver 2016-03-26 21:55 1292人阅读 评论(1) 收藏
- 原生js复习1.0
- Java练习 SDUT-1211_英文金曲大赛
- Python基础:06条件和循环
- shell爬虫
- 解决pip is configured with locations that require TLS/SSL问题