Xen中的工具libxc
libxc 是一个C语言库,它提供了一些简单易用的API,使用户程序可以方便的和Hypervisor进行通信。它的工作原理很简单,主要封装了dom0中的/proc/xen/privcmd,/dev/xen/evtchn以及/dev/xen/gntdev提供的IOCTL接口。也就是说,我们本来可以直接通过上面这些内核级设备驱动进行相关的操作控制,但有了libxc之后,只需要调用其相应接口函数,由它负责数据结构的解析/封装,然后再与底层hypervisor通信。这就是为什么说xm发出命令之后,到达xend,而xend需要调用libxc再处理后才与底层hypervisor通信:libxc是一个接口库。看到有这样的解析,借鉴一下:/proc/xen/privcmd
1. xc_interface_open()
打开/proc/xen/privcmd,获得文件描述符。
2. xc_sysctl()
填充xen_sysctl结构体,发送ioctl请求。
3. xc_interface_close()
关闭1中打开的文件描述
/dev/xen/evtchn
1. xc_evtchn_open
2. xc_evtchn_notify等函数
evtchn的操作比较简单,不需要填充结构体,一般指明远程Dom id,port即可
3. xc_evtchn_close
/dev/xen/gntdev
1. xc_gnttab_open
2. xc_gnttab_map_grant_ref等
3. xc_gnttab_close
用来控制Xen内核的库,位于xen-../tools/libxc。包括两个部分:
一个是libxenctrl,封装了各种Hypercall提供的功能,其函数列表在xenctrl.h中列出;另一个是libxenguest,提供在内核中创建domain的方法,其函数列表在xenguest.h中列出。
若在内核中通过修改hypercall的方式为Xen添加功能,需要在libxenctrl中进行封装。libxc中的函数的第一个参数均为int xc_handler,这其实是一个句柄,这个句柄对应着dom0中与guest kernel进行交互的proc文件,即/proc/xen/privcmd。libxc中进行Hypercall的调用可以利用do_domctl这个函数,这个函数的定义在xc_private.h中。do_domctl的第二个参数struct xen_domctl封装了一个hypercall的number and arguments。
如要在其中加入自己的新接口,需要在libxc目录下执行make install命令,之后,可以自己编写一个小型C程序,并引用<xenctrl.h>,在编译时加入参数-lxenctrl就可以了。
页:
[1]