1、判断page是匿名页面,还是文件页面
struct page {
struct address_space *mapping;
pgoff_t index;
}
mapping用于区分物理页面的类型(文件页,匿名页其他页)
mapping不为NULL,且第一位置位,该页为匿名页,mapping指向ano_vma结构
mapping不为NULL,且第一位为0,该页为文件页,mapping指向address_space结构
mapping为NULL其他页
2、获取到page,怎么获取到物理地址?
PHYS_OFFSET - the physical address of the start of memory. */
3、page大小是4K,vma的范围可能是大于4k的,怎么根据page根据page找到vma对应的虚拟地址范围?
#define PAGE_MAPPING_ANON 1
static void __page_set_anon_rmap(struct page *page,
struct vm_area_struct *vma, unsigned long address, int exclusive)
{
struct anon_vma *anon_vma = vma->anon_vma;
anon_vma = (void *) anon_vma + PAGE_MAPPING_ANON;
page->mapping = (struct address_space *) anon_vma;
page->index = linear_page_index(vma, address);
}
static inline pgoff_t linear_page_index(struct vm_area_struct *vma,
unsigned long address)
{
pgoff_t pgoff;
if (unlikely(is_vm_hugetlb_page(vma)))
return linear_hugepage_index(vma, address);
pgoff = (address - vma->vm_start) >> PAGE_SHIFT;
pgoff += vma->vm_pgoff;
return pgoff >> (PAGE_CACHE_SHIFT - PAGE_SHIFT);
}
匿名页面首地址对应的虚拟地址为:
viraddress = VMA->vm_start +(page->index - VMA->vm_pgoff)<< PAGE_SHIFT
参考:
[内核内存] 反向映射详解
Linux内存管理之RMAP
暑期编程PK赛 得CSDN机械键盘等精美礼品!


