XEN do_hvm_op流程分析

来源:互联网 发布:电脑地图软件 编辑:程序博客网 时间:2024/05/18 16:19

用户态代码:

我在xc_domain_save.c这个文件里自己写一个函数,就是传递一个标志到内核里面:

 

static int set_save_flag(xc_interface *xch,int saveflag, uint32_t dom){    DECLARE_HYPERCALL;    //固定写法,就是声明一个hvm_save_flag类型的arg。Hvm_save_flag这个结构体是在hvm_op.h里面自己定义的,后面再细说。    DECLARE_HYPERCALL_BUFFER(structhvm_save_flag, arg);    int rc;     arg = xc_hypercall_buffer_alloc(xch, arg, sizeof(*arg));//分配空间    if ( arg == NULL )    {       PERROR("Could not allocate memory for xc_hvm_set_mem_accesshypercall");       return -1;    }

        //下面的这两行就是传参,saveflag和dom这两个参数是用户态的数据,我们把这俩数//赋值给arg。

    arg-> save_flag = saveflag;    arg->save_domid=dom;     hypercall.op     =__HYPERVISOR_hvm_op;    hypercall.arg[0] = HVMOP_hvm_save_flag;//自定义的标识字段,内核态通过case判断    hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg);     rc = do_xen_hypercall(xch, &hypercall);     xc_hypercall_buffer_free(xch, arg);     return rc;}

上面基本就是用户态调用do_hvm_op的固定格式,内核态需要自定义一些数据结构和宏,还需要在do_hvm_op函数里添加一个case判断。

 

内核态代码:

Hvm_op.h里面自定义结构体和标识字段:

//这里可以在hvm_Op.h里面找到类似的定义,模仿着写就可以,注意我这里用的19,只要不跟源码里已经定义的数值冲突就可以。

#define HVMOP_hvm_save_flag        19 struct hvm_save_flag{   int save_flag;   domid_t  save_domid;};typedef struct hvm_save_flag  hvm_save_flag_t;DEFINE_XEN_GUEST_HANDLE(hvm_save_flag_t); 然后在do_hvm_op函数里并列的添加一个case语句:case HVMOP_hvm_save_flag:{     struct hvm_save_flag a;      if ( copy_from_guest(&a, arg, 1) )         return -EFAULT;      //saveinstance.save_flag是我在内核态里面自己定义的一个全局变量,a.saveflag     //就是用户态传过来的saveflag的值,自己想怎么使用就随意了     saveinstance.save_flag = a.save_flag;      //add by gao--catch page modify     printk("hvm.c--hvm_save_flag--save_flag=%d\n",saveinstance.save_flag);      break;}


0 0