Ø 簡介
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[128];
} u;
};
typedef struct xen_sysctl xen_sysctl_t;