免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: kikanjuu
打印 上一主题 下一主题

请问完全内存虚拟化处理缺页异常的流程是什么? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-02-26 09:08 |只看该作者

回复 #20 sirouni 的帖子

谢谢!可以把您注释过的整个Shadow.c作为附件贴在这里吗?

论坛徽章:
0
22 [报告]
发表于 2008-02-26 09:55 |只看该作者
你在博客里说的有问题可以问Xen的邮件列表是指  xen-devel@lists.xensource.com 这个邮件列表吗?
它里面都是强人,不适合我问小白问题。
请问有没有适合初级Xen开发者的邮件列表呢?

论坛徽章:
0
23 [报告]
发表于 2008-02-26 10:32 |只看该作者
我也没提过问,但是可以通过搜索邮件列表得到很多问题的答案。
附件是整个shaodw目录的注释。

shadow.rar

174.46 KB, 下载次数: 221

论坛徽章:
0
24 [报告]
发表于 2008-02-26 10:42 |只看该作者
万分感谢!
3x!

论坛徽章:
0
25 [报告]
发表于 2008-02-26 10:45 |只看该作者
弱问什么是super page啊?

论坛徽章:
0
26 [报告]
发表于 2008-02-26 10:50 |只看该作者
原帖由 kikanjuu 于 2008-2-26 10:45 发表
弱问什么是super page啊?

就是大页面,2MB/4MB的页面

论坛徽章:
0
27 [报告]
发表于 2008-02-26 10:58 |只看该作者
另外,为什么要在guest_walk_tables()中把Guest Page Table (GPT)设为只读?
并且,当前这次将GPT设为只读所在的Page Fault又是如何触发的呢?

[ 本帖最后由 kikanjuu 于 2008-2-26 12:32 编辑 ]

论坛徽章:
0
28 [报告]
发表于 2008-02-26 13:17 |只看该作者
原帖由 kikanjuu 于 2008-2-26 10:58 发表
另外,为什么要在guest_walk_tables()中把Guest Page Table (GPT)设为只读?
并且,当前这次将GPT设为只读所在的Page Fault又是如何触发的呢?

监控客户操作系统对客户页表的写操作,一旦客户操作系统试图修改客户页表,Xen回捕获#PF,模拟这个指令的执行同时同步GPT与SPT

论坛徽章:
0
29 [报告]
发表于 2008-02-26 14:14 |只看该作者
是不是客户操作系统修改客户页表会引发两次Page Fault?

第一次:
因为还没有建立起客户页表对应的影子页表,即客户页表的guest physical frame还没有对应的machine frame for guest page table,所以引起Page Fault
在这次PF中VMM为客户页表页分配machine frame,并在影子页表中相应地建立起虚拟地址到machine frame的映射。
并且在这次PF中,在guest_walk_pagetables()中将客户页表中对应PF的虚拟地址的pde和pte写保护。

接着,系统从ring0回到ring1,客户操作系统再次执行企图修改客户页表的指令。因为客户页表在第一次PF中对应虚拟地址的pde/pte已被写保护,所以再次发生PF。
第二次:
在第二次PF中,VMM模拟执行客户操作系统修改该客户页表,并同步相应的影子页表。

以上是我的理解,客户操作系统修改客户页表需要如上的两次Page Fault吗?

[ 本帖最后由 kikanjuu 于 2008-2-26 14:20 编辑 ]

论坛徽章:
0
30 [报告]
发表于 2008-02-26 19:06 |只看该作者
原帖由 kikanjuu 于 2008-2-26 14:14 发表
是不是客户操作系统修改客户页表会引发两次Page Fault?

第一次:
因为还没有建立起客户页表对应的影子页表,即客户页表的guest physical frame还没有对应的machine frame for guest page table,所以引起Pa ...


以32位下4KB页面及HVM为例:
初始情况下HVM运行在virtual 8086模式用于模拟实地址模式,
这时SPT指针位于P2M表,
此时客户操作系统引导代码会准备页表,
此时客户操作系统对页表的操作无法进行监控。
当客户操作系统页表准备完毕准备切换的保护模式时,
客户操作系统会使用mov to cr3指令,此指令由VT捕获,
被传递到影子页表的sh_update_cr3()函数,
这个函数负责所有HVM中客户操作系统更改CR3时的处理。

这个函数会首先会查询客户页表对应的机器地址
        gmfn = pagetable_get_mfn(v->arch.guest_table);

之后会扫描domain所有的shadow page table,将gmfn对应的shadow页面设置为只读,如果没有对应的shadow,则创建一个
代码来自sh_update_cr3()
#if GUEST_PAGING_LEVELS == 2
    if ( sh_remove_write_access(v, gmfn, 2, 0) != 0 )
        flush_tlb_mask(v->domain->domain_dirty_cpumask);
    sh_set_toplevel_shadow(v, 0, gmfn, SH_type_l2_shadow);
#elif GUEST_PAGING_LEVELS == 3

由此保证了当前domain所有顶级页表对应的页面,在SPT中只读。
之后每次捕获#PF进行的客户页表遍历时,Xen总是同时将遍历客户页表对应的机器页面设置为只读,
代码来自guest_walk_tables():
    if ( guest_op && sh_remove_write_access(v, gw->l2mfn, 2, va) != 0 )
        flush_tlb_mask(v->domain->domain_dirty_cpumask);

通过这种渐进的方式确保了所有客户页表所在页面在SPT中的映射项都是只读的,
之后如果客户操作系统试图修改客户页表会引发#PF,
此时由Xen捕获并模拟其执行,在模拟的同时同步SPT与GPT:
代码来自sh_page_fault()
    /* Need to emulate accesses to page tables */
    /* 需要模拟对客户页表的写操作 */
    if ( sh_mfn_is_a_page_table(gmfn) )
    {
        if ( ft == ft_demand_write )
        {
            perfc_incr(shadow_fault_emulate_write);
            goto emulate;
        }
        else if ( shadow_mode_trap_reads(d) && ft == ft_demand_read )
        { /* Xen  暂时不支持读页表的模拟 */
            perfc_incr(shadow_fault_emulate_read);
            goto emulate;
        }
    }

由此可见,客户操作系统修改客户页表仅会产生一次#PF,
Xen捕获#PF并模拟其执行,同时进行同步.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP