- 论坛徽章:
- 0
|
在读ulk,十七章时有个反向映射的问题请教大家:
当内核在回收共享页框时,要定位指向同一页框的所有页表的过程。
要定位页表项就应该先确定虚拟地址
在try_to_unmap_one()中,它根据包含这个页框的线性区vm_area_struct,和页描述符page来找到对应
的页表项:
static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma,
int migration)
{
...
address = vma_address(page, vma);
...
}
|
static inline unsigned long
vma_address(struct page *page, struct vm_area_struct *vma)
{
pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT);
unsigned long address;
address = vma->vm_start + ((pgoff - vma->vm_pgoff) << PAGE_SHIFT);
if (unlikely(address < vma->vm_start || address >= vma->vm_end)) {
/* page should be within @vma mapping range */
return -EFAULT;
}
return address;
}
|
对应于包含同一个页框的不同的vm_area_struct,这段代码怎么能分别找到他们的虚拟地址呢?
这样看上去,难道每个共享页框对应的那些vm_area_struct都是一样大的吗?它们都对应
相同的页框吗?
谢谢!! |
|