@ljm
2016-09-03T21:47:36.000000Z
字数 706
阅读 1467
内存管理
该函数主要就分为3大步:
如果查找页表找到的MM中地址对应pmd项是一个大页映射项(page_check_address_pmd()),那么就在该pmd项中设定_PAGE_BIT_SPLITTING标志,向VM其它部分表明该pmd项映射的大页正在被分割。
设定_PAGE_BIT_SPLITTING标志而不是简单的情况pmd项的理由:因为pmd项必须一直被标记为大页表项,否则vm的其它部分就不会检测到这是一个大页,这导致它不会等待保护大页拆分的anon_vma->root->rwsem。
该函数最主要的就是对拆分后页的引用计数的处理,对拆分后页的标志的处理和页本身的处理。
尾页的引用计数包含进程对其的映射引用(存放在首页的__mapcount)加上内核对它自身的pin引用计数(存放在它自己的__mapcount)。
首页的引用计数中要减去所有累积在它身上的各个尾页的pin引用计数。
将pmd项重新映射指向页表,页表中的每一个pte重新映射拆分后的普通4K页。同时注意设置pte中的标志位
参考资料:
1. codeweblog