复合页(Compound Page)就是将物理上连续的两个或多个页看成一个

     独立的大页,它能够用来创建hugetlbfs中使用的大页(hugepage)。

     也能够用来创建透明大页(transparent huge page)子系统。可是

     它不能用在页缓存(page cache)中,这是由于页缓存中管理的都是

     单个页。





     分配一个复合页的方式是:使用alloc_pages函数,參数order至少为1,

     且设置__GFP_COMP标记。由于依据复合页的定义,它通常包含2个或多

     个连续的物理内存页,这是由它的实现决定的,因而order參数不可能

     为0。





     通常调用alloc_pages的内存分配方式例如以下:

     p = alloc_pages(GFP_KERNEL, 2);

可是这样的方式和创建一个复合页有什么不同呢?不同点就是在创建复合

     页的时候会创建与这个复合页相关的元数据(metadata)。

表示复合页的元数据都存在于Page结构体中,Page页中的flag标记用来

     识别复合页。

在复合页中,打头的第一个普通页成为“head page”,用

     PG_head标记,而后面的全部页被称为“tail pages”,用PG_tail标记。

     在64位系统中,能够有多余的标记来表示复合页的页头和页尾;可是在

     32位系统中却没有那么多的标记,因此採用了一种复用其它标记的方案,

     即将复合页中的全部页都用PG_compound标记,然后,对于尾页同一时候也

     使用PG_reclaim标记。这是由于PG_reclaim仅仅有在页缓存中会用到,而

复合页根本就不会在页缓存中使用。

能够使用PageCompound函数来检測一个页是否是复合页,另外函数PageHead

     和函数PageTail用来检測一个页是否是页头或者页尾。

在每一个尾页的page

     结构体中都包括一个指向头页的指针 - first_page,能够使用compound_head

     函数获得。





     那么当一个复合页不再被系统使用时,我们怎样知道该复合页包括多少

     个普通页。又怎样知道该复合页的析构函数(destructor)存在哪里呢?

     首先,人们可能会觉得这些信息存在于头页的page结构体中,可是非常不

     幸,在这个结构体中已经没有可用的空间了。

因此,这些信息所有存储

     在第一个尾页的lru字段中,将该复合页的大小(order)首先强制转换

     为指针类型,然后存储在lru.prev中,将析构函数存储在lru.next中。

这里就解释了为什么复合页必须至少是两个页。





     在内核中生命了两个复合页的析构函数。默认情况下会调用free_compound_page

     来将全部的页返回给系统的页框分配器。而hugetlbfs子系统会调用free_huge_page

     来做一些统计并释放。





     使用复合页的最经典的一个样例就是THP(transparent huge page)。

     另外一些驱动使用复合页来方便缓存的管理。





ref

===

1. https://lwn.net/Articles/619514/

最新文章

  1. 【Python】str类方法说明
  2. vb小程序浅析
  3. Linux mint 14输入法问题
  4. 1.系统生命开发周期(SDLC)
  5. ECshop鼠标划过弹出 微信扫一扫代码
  6. List 中对象属性排序
  7. KMP算法的C++实现
  8. python解析AMF协议
  9. PPI是什么?如何计算?
  10. VS2008 error C2470
  11. cocos2d-x 背景音乐播放
  12. [BJOI 2010]次小生成树Tree
  13. SDCC2013大会笔记整理
  14. 洛谷p1586四方定理题解
  15. jQuery学习(1)猜数字游戏
  16. 关于CSS的一些基础内容
  17. python中进程间通讯——文件锁之fcntl模块的使用
  18. [spark 快速大数据分析读书笔记] 第一章 导论
  19. The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 解决方法
  20. 『OpenCV3』简单图片处理

热门文章

  1. url编码函数encodeURI和encodeURIComponent
  2. IIS添加更改默认页面
  3. 20181225模拟赛 T1 color (转化思想,分拆思想)
  4. buf.swap16()
  5. Python之turtl库-玫瑰花
  6. Python Pandas库的学习(二)
  7. admin源码之url设计
  8. linux & chmod & 777
  9. CSU 1258 异或运算的线段树
  10. 使用谷歌Z生成条形码以及二维码