xen 中的libxc(libxenctrl)庫

來源:互聯網
上載者:User

Ø         簡介

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;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.