免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1902 | 回复: 2

[Xen] 关于libvmi的问题 [复制链接]

论坛徽章:
0
发表于 2013-09-26 15:00 |显示全部楼层
libvmi是谷歌的一个开源项目,用于查看虚拟机内部情况,如在Xen虚拟化环境下,可以在Dom0中,通过libvmi查看其它虚拟机的内存情况,如获取模块链表、进程链表等,我在这个库的一个初始化地方有点疑问,希望可以和大家一起探讨下。
  1. status_t linux_init (vmi_instance_t vmi)
  2. {
  3.     status_t ret = VMI_FAILURE;

  4.     if (vmi->cr3){
  5.         vmi->kpgd = vmi->cr3;
  6.     }
  7.         //如果vmi->cr3=0时,将执行这个分支
  8.     else if (VMI_SUCCESS == linux_system_map_symbol_to_address(vmi, "swapper_pg_dir", &vmi->kpgd)){//此时,从System.map文件中获取到了swapper_pg_dir的虚拟地址,并赋值给了vmi->kpgd
  9.         dbprint("--got vaddr for swapper_pg_dir (0x%.16llx).\n", vmi->kpgd);
  10.         if (driver_is_pv(vmi)){
  11.             vmi->kpgd = vmi_translate_kv2p(vmi, vmi->kpgd);       //这里通过 vmi_translate_kv2p函数将虚拟地址转化为物理地址,转到vmi_translate_kv2p函数
  12.             if (vmi_read_addr_pa(vmi, vmi->kpgd, &(vmi->kpgd)) == VMI_FAILURE){
  13.                 errprint("Failed to get physical addr for kpgd.\n");
  14.                 goto _exit;
  15.             }
  16.         }
  17.         else{
  18.             vmi->kpgd = vmi_translate_kv2p(vmi, vmi->kpgd);
  19.         }
  20.     }
  21.     else{
  22.         errprint("swapper_pg_dir not found and CR3 not set, exiting\n");
  23.         goto _exit;
  24.     }

  25.     vmi->kpgd = vmi->cr3;
  26.     dbprint("**set vmi->kpgd (0x%.16llx).\n", vmi->kpgd);

  27.     addr_t address = vmi_translate_ksym2v(vmi, "init_task");
  28.     address += vmi->os.linux_instance.tasks_offset;
  29.     if (VMI_FAILURE == vmi_read_addr_va(vmi, address, 0, &(vmi->init_task))){
  30.         errprint("Failed to get task list head 'init_task'.\n");
  31.         goto _exit;
  32.     }

  33.     ret = VMI_SUCCESS;
  34. _exit:
  35.     return ret;
  36. }
复制代码
  1. addr_t vmi_translate_kv2p(vmi_instance_t vmi, addr_t virt_address)
  2. {
  3.     reg_t cr3 = 0;
  4.     if (vmi->kpgd){//由于在“linux_init”函数中,vmi->kpgd已经被赋值为"swapper_pg_dir"的虚拟地址,所以将执行此分支
  5.         cr3 = vmi->kpgd;            //cr3被赋值为vmi->kpgd
  6.     }
  7.     else{
  8.         driver_get_vcpureg(vmi, &cr3, CR3, 0);
  9.     }
  10.     if (!cr3){
  11.         dbprint("--early bail on v2p lookup because cr3 is zero\n");
  12.         return 0;
  13.     }
  14.     else{
  15.         return vmi_pagetable_lookup(vmi, cr3, virt_address);   //在这里面进行页表查找操作,此时的cr3为swapper_pg_dir的虚拟地址
  16.     }
  17. }
复制代码

想问下大家,觉得最后那一步vmi_pagetable_lookup,它以此时cr3的值为页全局目录地址,能够查找到对应虚拟地址的物理地址吗?

论坛徽章:
29
技术图书徽章
日期:2013-09-02 19:59:502015元宵节徽章
日期:2015-03-06 15:51:332015小元宵徽章
日期:2015-03-06 15:57:20操作系统版块每日发帖之星
日期:2015-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17操作系统版块每日发帖之星
日期:2015-09-21 06:20:002015亚冠之水原三星
日期:2015-10-30 00:06:07数据库技术版块每日发帖之星
日期:2015-12-24 06:20:0015-16赛季CBA联赛之上海
日期:2016-01-07 10:32:07操作系统版块每日发帖之星
日期:2016-01-08 06:20:00操作系统版块每日发帖之星
日期:2016-05-18 06:20:00IT运维版块每日发帖之星
日期:2016-07-23 06:20:00
发表于 2013-09-27 20:29 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2013-09-29 16:21 |显示全部楼层
回复 2# Hongqiyaodao


    哈哈,如果这边没人回答就只能去那边也问问,谢谢回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP