设为首页 收藏本站
查看: 1811|回复: 0

[经验分享] xen 中的libxc(libxenctrl)库

[复制链接]

尚未签到

发表于 2015-10-12 02:14:34 | 显示全部楼层 |阅读模式
  Ø         简介

  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;  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-125553-1-1.html 上篇帖子: xen网络前后端交互 下篇帖子: CentOS 5.4下使用yum安装Xen
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表