[关闭]
@ljm 2016-09-03T21:47:36.000000Z 字数 706 阅读 1467

__split_huge_page函数的分析

内存管理


该函数主要就分为3大步:

  1. 在映射的每一个pmd项中设定splitting标志(__split_huge_page_splitting())表明该大页正在被分割
  2. 分割大页为普通的4K页(__split_huge_page_refcount())
  3. 为分割开来的4K页建立页表映射(__split_huge_page_map())

此处输入图片的描述

__split_huge_page_splitting

如果查找页表找到的MM中地址对应pmd项是一个大页映射项(page_check_address_pmd()),那么就在该pmd项中设定_PAGE_BIT_SPLITTING标志,向VM其它部分表明该pmd项映射的大页正在被分割。

设定_PAGE_BIT_SPLITTING标志而不是简单的情况pmd项的理由:因为pmd项必须一直被标记为大页表项,否则vm的其它部分就不会检测到这是一个大页,这导致它不会等待保护大页拆分的anon_vma->root->rwsem。

此处输入图片的描述

__split_huge_page_refcount

该函数最主要的就是对拆分后页的引用计数的处理,对拆分后页的标志的处理和页本身的处理。

尾页的引用计数包含进程对其的映射引用(存放在首页的__mapcount)加上内核对它自身的pin引用计数(存放在它自己的__mapcount)。

首页的引用计数中要减去所有累积在它身上的各个尾页的pin引用计数。

此处输入图片的描述

__split_huge_page_map

将pmd项重新映射指向页表,页表中的每一个pte重新映射拆分后的普通4K页。同时注意设置pte中的标志位

此处输入图片的描述


参考资料:
1. codeweblog

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注