免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2202 | 回复: 2
打印 上一主题 下一主题

请问一个共享页框回收时的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-17 13:04 |只看该作者 |倒序浏览
在读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都是一样大的吗?它们都对应
相同的页框吗?

谢谢!!

论坛徽章:
0
2 [报告]
发表于 2008-10-18 17:46 |只看该作者
没跟过代码.我的理解是进程之间若共享内存,一定是在vm_area_struct中共享,即各进程表示共享内存区域的vm_area_struct的起始线性地址和长度相同

论坛徽章:
0
3 [报告]
发表于 2008-10-20 13:22 |只看该作者
谢谢楼上的回复。
从fork的copy_mm来看,的确是完全复制父进程的vm_area_struct。
不知道其他共享页的情况是怎样的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP