xen 中的libxc(libxenctrl)库

本文详细介绍了libxc与libxenctrl作为C语言库,如何简化用户程序与Xen Hypervisor之间的通信过程。通过封装内核级设备驱动接口,如/proc/xen/privcmd、/dev/xen/evtchn及/dev/xen/gntdev提供的ioctl接口,这些库使得开发者能够更便捷地进行操作控制,减少了直接与底层hypervisor交互的复杂性。

Ø         简介

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 idport即可

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;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值