关于Xen Hypercall 关于Xen源码 关于do_memory_op()

问题描述

在Xen源码中,有一个函数longdo_memory_op(unsignedlongcmd,XEN_GUEST_HANDLE(void)arg),里面调用了rc=memory_exchange(guest_handle_cast(arg,xen_memory_exchange_t)),我不明白的是XEN_GUEST_HANDLE和guest_handle_cast这是什么?我看了源码,前者只有一个宏定义,后者虽然有具体内容,但是看不懂。另外,内存地址是怎么传递的?或者说,xen_memory_exchange_t这个结构体是怎么赋值的?拜谢!!

解决方案

解决方案二:
我来尝试回答下内存地址是怎么传递的?或者说,xen_memory_exchange_t这个结构体是怎么赋值的?这个问题把.这个hypercall大多应该是在Dom0的控制台出发的,调用了libxc的接口do_memory_op(xch,XENMEM_exchange,&exchange,sizeof(exchange));在do_memory_op中设置hypercall的值,再调用do_xen_hypercall,代码如下hypercall.op=__HYPERVISOR_memory_op;hypercall.arg[0]=(unsignedlong)cmd;hypercall.arg[1]=HYPERCALL_BUFFER_AS_ARG(arg);ret=do_xen_hypercall(xch,&hypercall);对于支持Xen的linux中,do_xen_hypercall最终调用了linux_privcmd_hypercall,这个函数其实就是对/dev/xen/privcmd设备做了个ioctl(fd,IOCTL_PRIVCMD_HYPERCALL,hypercall)操作(这里其实就可以知道,为啥要给linux内核打Xen补丁才能支持Xen,支持Xen的Linux通过对/dev/xen/privcmd来执行hypercall)再来看/dev/xen/privcmd这个设备驱动中提供的ioctl接口(这里要跳转到linux内核代码xen下,不是xen源代码)staticlongprivcmd_ioctl(structfile*file,unsignedintcmd,unsignedlongdata){intret=-ENOSYS;void__user*udata=(void__user*)data;switch(cmd){caseIOCTL_PRIVCMD_HYPERCALL:ret=privcmd_ioctl_hypercall(udata);break;}继续进入privcmd_ioctl_hypercall(udata)staticlongprivcmd_ioctl_hypercall(void__user*udata){structprivcmd_hypercallhypercall;longret;if(copy_from_user(&hypercall,udata,sizeof(hypercall)))return-EFAULT;ret=privcmd_call(hypercall.op,hypercall.arg[0],hypercall.arg[1],hypercall.arg[2],hypercall.arg[3],hypercall.arg[4]);}hypercall的内容已经被拷贝到内核空间,然后继续跟进privcmd_call这个函数中调用了一段内联汇编__HYPERCALL_DECLS;__HYPERCALL_5ARG(a1,a2,a3,a4,a5);asmvolatile("call*%[call]":__HYPERCALL_5PARAM:[call]"a"(&hypercall_page[call]):__HYPERCALL_CLOBBER5);虽然我看得很迷糊....但通过宏可以猜测到op在eax,arg0-45个参数分别放在了ebx,ecx,edx,esi,edi(x8632)里,然后直接根据hypercallop号调用对应接口(linux3.0代码里直接去调用了??没有通过int0x82???hypercall_page应该在建立Dom0(linux)时候映射的)(如果有高手,请指教....)再回到xen代码ENTRY(compat_hypercall_table).quadcompat_set_trap_table/*0*/.quaddo_mmu_update.quadcompat_set_gdt.quaddo_stack_switch.quadcompat_set_callbacks.quaddo_fpu_taskswitch/*5*/.quaddo_sched_op_compat.quadcompat_platform_op.quaddo_set_debugreg.quaddo_get_debugreg.quadcompat_update_descriptor/*10*/.quadcompat_ni_hypercall.quadcompat_memory_op/*__HYPERVISOR_memory_op=12*/longdo_memory_op(unsignedlongcmd,XEN_GUEST_HANDLE_PARAM(void)arg)想不明白,为啥这里的两个参数可以从寄存器ebx,ecx中取得...即cmd=>arg[0]=>ebx,arg=>arg[1]=>ecx...上面
解决方案三:
如果是通过int0x82来调用hypercall比较好理解,从vm退出进入vmx,调用vmx_asm_vmexit_handler,将寄存器压栈,然后调用vmx_asm_vmexit_handler,根据退出vm的原因应该为EXIT_REASON_VMCALL,继而调用rc=hvm_do_hypercall(regs);reg指向的内容就是就是刚才压栈的那些寄存器最后调用:regs->eax=hvm_hypercall32_table[eax]((uint32_t)regs->ebx,(uint32_t)regs->ecx,(uint32_t)regs->edx,(uint32_t)regs->esi,(uint32_t)regs->edi,(uint32_t)regs->ebp);statichvm_hypercall_t*consthvm_hypercall32_table[NR_hypercalls]={[__HYPERVISOR_memory_op]=(hvm_hypercall_t*)hvm_memory_op_compat32,[__HYPERVISOR_grant_table_op]=(hvm_hypercall_t*)hvm_grant_table_op_compat32,[__HYPERVISOR_vcpu_op]=(hvm_hypercall_t*)hvm_vcpu_op_compat32,[__HYPERVISOR_physdev_op]=(hvm_hypercall_t*)hvm_physdev_op_compat32,COMPAT_CALL(xen_version),HYPERCALL(console_io),HYPERCALL(event_channel_op),COMPAT_CALL(sched_op),COMPAT_CALL(set_timer_op),HYPERCALL(xsm_op),HYPERCALL(hvm_op),HYPERCALL(sysctl),HYPERCALL(domctl),HYPERCALL(tmem_op)};
解决方案四:
上面说错了,不是int0x82,是通过vmcall指令.....
解决方案五:
xen的源码哪里有呀
解决方案六:
还是自己来解答自己的疑问Dom0Linuxhypercalltable里存放的不是具体的hypercallcode,而是staticvoidvmx_init_hypercall_page(structdomain*d,void*hypercall_page){char*p;inti;for(i=0;i<(PAGE_SIZE/32);i++){if(i==__HYPERVISOR_iret)continue;p=(char*)(hypercall_page+(i*32));*(u8*)(p+0)=0xb8;/*movimm32,%eax*/*(u32*)(p+1)=i;*(u8*)(p+5)=0x0f;/*vmcall*/*(u8*)(p+6)=0x01;*(u8*)(p+7)=0xc1;*(u8*)(p+8)=0xc3;/*ret*/}/*Don'tsupportHYPERVISOR_iretatthemoment*/*(u16*)(hypercall_page+(__HYPERVISOR_iret*32))=0x0b0f;/*ud2*/}最终通过vmcall进入vmx,就回到了我之前说的逻辑

时间: 2025-01-22 09:48:38

关于Xen Hypercall 关于Xen源码 关于do_memory_op()的相关文章

centos-CentOS 7.0 上源码安装 Xen 4.5出错,怎么解决

问题描述 CentOS 7.0 上源码安装 Xen 4.5出错,怎么解决 xl info xl: error while loading shared libraries: libxlutil.so.4.3: cannot open shared object file: No such file or directory cd /usr/lib/ ln -s /usr/local/lib/libxlutil.so.4.3.0 libxlutil.so.4.3 ln -s /usr/local/

最新版的CentOS 7.0上源码安装虚拟机Xen 4.5教程

貌似这次 CentOS 没有发布 Minimal 安装版,下面的编译安装步骤在 LiveCD 安装版(CentOS-7.0-1406-x86_64-livecd.iso)上完成. 安装需要的软件包 安装完 CentOS 7.0 后第一件事就是启动 SSH 以便能从另外一台机器访问,新版本的 CentOS 引入了有争议的 systemd 进程管理器替代了 Unix 传统的 init 系统.开启服务使用 systemctl 命令: # systemctl start sshd # systemctl

Eclipse查看Hadoop源码

1.开发环境 1.Hadoop-1.2.1 2.apache-ant-1.8.0 2.新建Java项目 项目叫"Hadoop_sourcecode" 3.拷贝Hadoop中源码 Hadoop包中src文件文件夹下core.hdfs.mapred文件夹拷贝到项目的src中 4.改变目录结构 删除原来的目录结构:   增加新的目录结构:        选定后的目录结构      5.添加Jar包 需要包含进来的jar包: "\hadoop-1.2.1\lib"中所有ja

方法-windows下praat源码编译问题!急急急急急

问题描述 windows下praat源码编译问题!急急急急急 从官网上下载的praat源码进行编译,按照网上说的方法编译,但是总是出现 make (e=2): 系统找不到指定的文件. make[1]: *** [libgsl.a] Error 2 make[1]: Leaving directory `d:/sources_5404/external/gsl' make: *** [all] Error 2 错误!试了各种方法,都没解决,望高手指点一下! 解决方案 你试了哪些方法?下面的方法试过

ubuntu 11.10(32位系统)下编译android源码 make错误解决办法

本文介绍在ubuntu 11.10系统下编译android 2.3.3源码,编译之前请确定上两篇文章(http://www.cnblogs.com/dwayne/archive/2011/11/16/2250732.html和http://www.cnblogs.com/dwayne/archive/2011/11/11/2245383.html)中所需的准备工作已经成功完成.编译完成生成系统镜像文件,并在模拟器中运行. 准备工作完成后,开始编译工作.下载下来的源码有5G多,如果按照我之前写的获

android 4.3 操作源码实现系统截屏(暂无移植性)

感谢网友cjd6568358的帮助,新版的Android系统截屏功能已经实现,需要的朋友请移步项目主页:https://github.com/Android-ScreenShot/AndroidScreenShotService(别忘点个star哦) (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景        android系统的系统截屏功能是google封装起来的,也是大家都很想获得的,经过一个多月的漫长研究,博主终于成功的在android新

RxJava源码初探

一.前言 RxJava是用java实现的ReactiveX(Reactive Extensions)框架开源库.ReactiveX则是大名鼎鼎的响应式编程.而响应式编程和观察者模式紧紧的相关联.在看RxJava的源码中,分析起来会有点麻烦,所以才有了这篇文章,和对这个有兴趣的同学一起窥探一二. 二.观察者模式 2.1 基本原理 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式即让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观

前端-用php和mysql为我们实验室建立一个小网站,请问有没有合适的模板源码?

问题描述 用php和mysql为我们实验室建立一个小网站,请问有没有合适的模板源码? 自己在chinaz上下载了几个,但是不尽人意,希望有路过的朋友能够提供帮助,只有建立一个链接数据库的小网站,不用线上上运行,所以模板不用太复杂,前端有了就好,谢谢 解决方案 你应该说明网站用途,根据用途可以决定里的要用什么,只链接数据库使用phpadmin就好 解决方案二: 这样谁说你更想要的是前端的页面

javaweb异常提示信息统一处理(使用springmvc,附源码)

版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 目录(?)[+] 一.前言 后台出现异常如何友好而又高效地回显到前端呢?直接将一堆的错误信息抛给用户界面,显然不合适. 先不考虑代码实现,我们希望是这样的: (1)如果是页面跳转的请求,出现异常了,我们希望跳转到一个异常显示页面,如下: 当然,这里的界面不够美观,但是理论是这样的. (2)如果是ajax请求,那么我们,希望后台将合理的错误显示返回到ajax的回调函数里面,如下: $.ajax