为完整起见, 我们介绍另一个内存分配的接口, 尽管我们不会准备使用它直到 15 章. 现 在, 能够说 struct page 是一个描述一个内存页的内部内核结构. 如同我们将见到的, 在内核中有许多地方有必要使用页结构; 它们是特别有用的, 在任何你可能处理高端内存 的情况下, 高端内存在内核空间中没有一个常量地址.

Linux 页分配器的真正核心是一个称为 alloc_pages_node 的函数:

struct page *alloc_pages_node(int nid, unsigned int flags, unsigned int order);

这个函数页有 2 个变体(是简单的宏); 它们是你最可能用到的版本:

struct page *alloc_pages(unsigned int flags, unsigned int order); struct page *alloc_page(unsigned int flags);

核心函数, alloc_pages_node, 使用 3 个参数, nid 是要分配内存的 NUMA 节点 ID[30]30, flags 是通常的 GFP_ 分配标志, 以及 order 是分配的大小. 返回值是一个指向描述分 配的内存的第一个(可能许多)页结构的指针, 或者, 如常, NULL 在失败时.

alloc_pages 简化了情况, 通过在当前 NUMA 节点分配内存( 它使用 numa_node_id 的返 回值作为 nid 参数调用 alloc_pages_node). 并且, 当然, alloc_pages 省略了 order 参数并且分配一个单个页.

为释放这种方式分配的页, 你应当使用下列一个: void   free_page(struct page *page);

void free_pages(struct page *page, unsigned int order); void free_hot_page(struct page *page);

void free_cold_page(struct page *page);

如果你对一个单个页的内容是否可能驻留在处理器缓存中有特殊的认识, 你应当使用 free_hot_page (对于缓存驻留的页) 或者 free_cold_page 通知内核. 这个信息帮助内 存分配器在系统中优化它的内存使用.

最新文章

  1. 安装完成后在命令行运行bash时报错0x80070057
  2. October 27th Week 44th Thursday 2016
  3. BZOJ4262: Sum
  4. RabbitMQ原理与相关操作(二)
  5. DICOM图像像素值(灰度值)转换为CT值
  6. 2.Visual FoxPro内存变量显示和清除命令
  7. Android Library Project 使用问题总结
  8. iOS CoreData 的级联删除等操作
  9. 学习WordPress必须知道的函数(转)
  10. My First Django Project (2)
  11. Qt中使用QProcess备份和恢复Mysql数据库
  12. caffe源码阅读(1)-数据流Blob
  13. Ext.Net学习笔记11:Ext.Net GridPanel的用法
  14. delphi倒计时按钮写法
  15. pc app 桌面打包
  16. Python基础之re模块(正则表达式)
  17. php,vue,vue-ssr 做出来的页面有什么区别?
  18. JS获取当前星期几的简易写法
  19. Tkernel Package NCollection哈希基础的类
  20. springboot 中使用事务

热门文章

  1. 在APPfuse中配置log4j进行定位
  2. React 入门笔记
  3. 小爬爬1:开篇&&简单介绍启动
  4. 介绍配置管理工具SVN的使用
  5. 使用UITextView的dataDetectorTypes实现超链接需要注意的事项!
  6. python 解释器编码
  7. el标签 2016-06-05 21:39 477人阅读 评论(15) 收藏
  8. 预警| Confluence 高危漏洞被大规模利用,阿里云WAF接入即可防护,支持免费应急服务
  9. __defineGetter__和__defineSetter__在日期中的应用
  10. 2016 Asia Jakarta Regional Contest J - Super Sum UVALive - 7720 【快速幂+逆元】