- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
8.3. get_free_page 和其友
8.3. get_free_page 和其友
如果⼀个模块需要分配⼤块的内存, 它常常最好是使⽤⼀个⾯向页的技术. 请求整个页
也有 他的优点, 这个在 15 章介绍.
为分配页, 下列函数可⽤:
get_zeroed_page(unsigned int flags);
返回⼀个指向新页的指针并且⽤零填充了该页.
__get_free_page(unsigned int flags);
类似于 get_zeroed_page , 但是没有清零该页.
__get_free_pages(unsigned int flags, unsigned int order);
分配并返回⼀个指向⼀个内存区第⼀个字节的指针, 内存区可能是⼏个(物理上连续)页
长但是没有清零.
flags 参数同 kmalloc 的⽤法相同; 常常使⽤ GFP_ ERNEL 或者 GFP_ATOMIC , 可能带
有 __GFP_DMA 标志( 给可能⽤在 ISA DMA 操作的内存 ) 或者 __GFP_HIGHMEM 当
可能使⽤⾼端内存时. [29]order 是你在请求的或释放的页数的以 2 为底的对数(即,
log2N) . 例如, 如果你要⼀个页 order 为 0 , 如果你请求 8 页就是 3. 如果 order 太⼤(没有
那个⼤⼩的连续区可⽤), 页分配失败. get_order 函数, 它使⽤⼀个整数参数, 可以⽤来
从⼀个 size 中提取 order(它必须是 2 的幂)给主机平台. order 允许的最⼤值是 10 或者
11 (对应于 1024 或者 2048 页), 依赖于体系. 但是, ⼀个 order-10 的分配在除了⼀个刚刚
启动的有很多内存的系统中成功的机会是⼩的.
如果你好奇, /proc/buddyinfo 告诉你系统中每个内存区中的每个 order 有多少块可⽤.
当⼀个程序⽤完这些页, 它可以使⽤下列函数之⼀来释放它们. 第⼀个函数是⼀个落回
第⼆个函数的宏:
void free_page(unsigned long addr);
void free_pages(unsigned long addr, unsigned long order);
如果你试图释放和你分配的页数不同的页数, 内存图变乱, 系统在后⾯时间中有⿇烦.
值得强调⼀下, __get_free_pages 和 他的函数可以在任何时候调⽤, 遵循我们看到的
kmalloc 的相同规则. 这些函数不能在某些情况下分配内存, 特别当使⽤ GFP_ATOMIC
时. 因此, 调⽤这些分配函数的程序必须准备处理分配失败.
尽管 kmalloc( GFP_ ERNEL )有时失败当没有可⽤内存时, 内核尽⼒满⾜分配请求. 因
此, 容易通过分配太多的内存降低系统的响应. 例如, 你可以通过塞⼊⼀个 scull 设备⼤
量数据使计算机关机; 系统开始爬⾏当它试图换出尽可能多的内存来满⾜ kmalloc 的请
求. 因为每个资源在被增长的设备所吞⾷, 计算机很快就被说⽆法⽤; 在这点上, 你甚⾄
不能启动⼀个新进程来试图处理这个问题. 我们在 scull 不解释这个问题, 因为它只是
⼀个例⼦模块并且不是⼀个真正的放⼊多⽤户系统的⼯具. 作为⼀个程序员, 你必须⼩
⼼, 因为⼀个模块是特权代码并且可能在系统中开启新的安全漏洞(最可能是⼀个服务
拒绝漏洞好像刚刚描述过的.)
8.3.1. ⼀个使⽤整页的 scull: scullp
为了真实地测试页分配, 我们已随 他例⼦代码发布了 scullp 模块. 它是⼀个简化的
scull , 就像前⾯介绍过的 scullc .
scullp 分配的内存量⼦是整页或者页集合: scullp_order 变量缺省是 0 , 但是可以在编译
或加载时改变.
下列代码⾏显⽰了它如何分配内存:
/* Heres the allocation of a single quantum */
if (!dptr- data[s_pos])
{
dptr- data[s_pos] =
(void *)__get_free_pages(GFP_KERNEL, dptr- order);
if (!dptr- data[s_pos])
goto nomem;
memset(d
您可能关注的文档
最近下载
- 申请劳动仲裁委员会调查取证申请书.doc VIP
- 3098.1紧固件机械性能.pdf VIP
- 沥青混凝土路面实施性施工组织设计.pdf VIP
- 《论语》(Word打印版).doc VIP
- CHINA-POWER中电强能智能配电箱QN-PLC通用说明书.pdf
- 冀教-初中数学八上速记-第十二章 分式和分式方程压轴训练(6类压轴)(原卷版).pdf VIP
- 2024年贵州省中考语文试题(含答案解析).docx VIP
- 中国偏头痛诊断与治疗指南(中华医学会神经病学分会第一版).pptx VIP
- 2023-2024学年上海市延安中学高二上学期期末考试物理试卷(等级)含详解.docx VIP
- 2011比亚迪M6维修手册含电路图.pdf VIP
原创力文档


文档评论(0)