Folio.index
linear_page_index()
static inline pgoff_t linear_page_index(const struct vm_area_struct *vma,
const unsigned long address)
{
pgoff_t pgoff;
pgoff = (address - vma->vm_start) >> PAGE_SHIFT;
pgoff += vma->vm_pgoff;
return pgoff;
}设置
__handle_mm_fault
vmf.pgoff = linear_page_index(vma, address) // 匿名:虚拟地址;文件:文件内偏移
...
do_anonymous_page
folio_add_new_anon_rmap
__folio_set_anon
folio->index = linear_page_index(vma, address) // 也就是对应的进程虚拟地址
do_fault
...
filemap_fault
index = vmf->pgoff
__filemap_get_folio(, index, ) -> __filemap_get_folio_mpol(, index, )
index = mapping_align_index(mapping, index); // index对齐文件系统最小order
order = __ffs(index); // order是从index对齐地址i中获取的
folio = filemap_alloc_folio(, order, ); // 再用order去分配folio,所以隐含了index和order对齐的信息
filemap_add_folio(folio, index, )
__filemap_add_folio(folio, index, )
XA_STATE_ORDER(xas, &mapping->i_pages, index, folio_order(folio))
folio->index = xas.xa_index; // 实际上就是文件内偏移Last updated