xen 中的libxc(libxenctrl)库
Ø 简介libxc是在/xen/tools/中的名称,在许多地址看到的是libxenctrl,其实是一个意思,但与libxen不同。libxc是一个C语言库,它提供了一些简单易用的API,使用户程序可以方便的和Hypervisor进行通信。
它的工作原理很简单,主要封装了dom0中的/proc/xen/privcmd,/dev/xen/evtchn以及/dev/xen/gntdev提供的IOCTL接口。也就是说,我们本来可以直接通过上面这些内核级设备驱动进行相关的操作控制,但有了libxc之后,只需要调用其相应接口函数,由它负责数据结构的解析/封装,然后再与底层hypervisor通信。这就是为什么说xm发出命令之后,到达xend,而xend需要调用libxc再处理后才与底层hypervisor通信:libxc是一个接口库。
libxenctrl是一个C库,它提供了一些简单易用的API,使用户程序可以方便的和Hypervisor进行通信。
它的工作原理很简单,封装了dom0中的/proc/xen/privcmd,/dev/xen/evtchn以及/dev/xen/gntdev提供的IOCTL接口。
Ø 编程步骤:
² /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
Ø 编程示例
以/proc/xen/privcmd提供的接口为例,节选自tools/xenmon/setmask.c
int main(int argc, char * argv[])
{
struct xen_sysctl sysctl;
int ret;
int xc_handle = xc_interface_open();
sysctl.cmd = XEN_SYSCTL_tbuf_op; //由cmd决定sysctl(structxen_sysctl)中的union
sysctl.interface_version = XEN_SYSCTL_INTERFACE_VERSION;
sysctl.u.tbuf_op.cmd= XEN_SYSCTL_TBUFOP_get_info;
ret = xc_sysctl(xc_handle, &sysctl);
if ( ret != 0 )
{
perror("Failure to get event mask from Xen");
exit(1);
}
else
{
printf("Current event mask: 0x%.8x\n", sysctl.u.tbuf_op.evt_mask);
}
...snip...
xc_interface_close(xc_handle);
return 0;
}
² XEN_SYSCTL Command (IOCTL的主命令为IOCTL_PRIVCMD_HYPERCALL)
No.
Command
Comment
Struct
1
XEN_SYSCTL_readconsole
Read console content from Xen buffer ring.
xen_sysctl_readconsole
2
XEN_SYSCTL_tbuf_op
Get trace buffers machine base address
xen_sysctl_tbuf_op
3
XEN_SYSCTL_physinfo
Get physical information about the host machine
xen_sysctl_physinfo
4
XEN_SYSCTL_sched_id
Get the ID of the current scheduler.
xen_sysctl_sched_id
5
XEN_SYSCTL_perfc_op
Interface for controlling Xen software performance counters.
xen_sysctl_perfc_op
6
XEN_SYSCTL_getdomaininfolist
-
xen_sysctl_getdomaininfolist
7
XEN_SYSCTL_debug_keys
Inject debug keys into Xen.
xen_sysctl_debug_keys
8
XEN_SYSCTL_getcpuinfo
Get physical CPU information.
xen_sysctl_getcpuinfo
9
XEN_SYSCTL_availheap
-
xen_sysctl_availheap
10
XEN_SYSCTL_get_pmstat
-
xen_sysctl_get_pmstat
11
XEN_SYSCTL_cpu_hotplug
-
xen_sysctl_cpu_hotplug
12
XEN_SYSCTL_pm_op
Get/set xen power management, include cpufreq governors and related parameters
xen_sysctl_page_offline_op
13
-
-
-
14
XEN_SYSCTL_page_offline_op
-
xen_sysctl_page_offline_op
15
XEN_SYSCTL_lockprof_op
-
xen_sysctl_lockprof_op
struct xen_sysctl {
uint32_t cmd;
uint32_t interface_version; /* XEN_SYSCTL_INTERFACE_VERSION */
union {
struct xen_sysctl_readconsole readconsole;
struct xen_sysctl_tbuf_op tbuf_op;
struct xen_sysctl_physinfo physinfo;
struct xen_sysctl_sched_id sched_id;
struct xen_sysctl_perfc_op perfc_op;
struct xen_sysctl_getdomaininfolist getdomaininfolist;
struct xen_sysctl_debug_keys debug_keys;
struct xen_sysctl_getcpuinfo getcpuinfo;
struct xen_sysctl_availheap availheap;
struct xen_sysctl_get_pmstat get_pmstat;
struct xen_sysctl_cpu_hotplug cpu_hotplug;
struct xen_sysctl_pm_op pm_op;
struct xen_sysctl_page_offline_op page_offline;
struct xen_sysctl_lockprof_op lockprof_op;
uint8_t pad;
} u;
};
typedef struct xen_sysctl xen_sysctl_t;
页:
[1]