继续 上一篇 的研究,结合 xen4.2.3 的代码分析,发现 xen4.2.3 的应用层工具库 tools 包含一个工具叫 libvchan ,其头文件描述如下:

*  This is a library for inter-domain communication.  A standard Xen ring
* buffer is used, with a datagram-based interface built on top. The grant
* reference and event channels are shared in XenStore under the path
* /local/domain/<srv-id>/data/vchan/<cli-id>/<port>/{ring-ref,event-channel}

说明这个库是用于domain间交互数据用的,其控制信息放在 xenstore里。 下面就是基于这个库,我在两台 centos domain 之间的实验。

需要的文件:

CentOS-6.2-x86_64-minimal.iso  : centos minimal iso 镜像

kernel-3.10.20-11.el6.centos.alt.x86_64.rpm  : xen4centos6 项目 维护的rpm包,这些rpm包已经配置为可以用作 xen domain0

domain0 : 先用 minimal 的 iso 安装系统,然后用 xen4centos6 项目的内核rpm包安装第二个内核,并重启为xen内核,作为domain0

domainU : 先用 minimal 的 iso 安装系统到 qcow2 文件,然后用 xen4centos6 项目的内核rpm包安装第二个内核,并重启3.10.20的内核

需要的配置:

domain0 重启为xen内核,grub.conf  配置如下:

title CentOS (3.10.-.el6.centos.alt.x86_64)
root (hd0,)
kernel /xen.gz dom0_mem= loglvl=all guest_loglvl=all dom0_max_vcpus= dom0_vcpus_pin
module /vmlinuz-3.10.-.el6.centos.alt.x86_64 ro root=/dev/mapper/VolGroup00-LogVol--ROOT rd_NO_LUKS rd_LVM_LV=VolGroup00/LogVol-ROOT rd_LVM_LV=VolGroup00/LogVol-SWAP rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM LANG=en_US.UTF-
module /initramfs-3.10.-.el6.centos.alt.x86_64.img

然后配置http服务器,domainU 通过wget 从domainO 获取需要的文件。

domainU 重启为kernel3.10.20 后,需要做下面的配置:

modprobe xenfs
modprobe xen_gntdev
modprobe xen_evtchn
modprobe xen_privcmd
modprobe xen_gntalloc

安装的几个驱动为应用层提供libvchan需要的内核接口

代码的修改:

tools/libvchan/init.c: init_xs_srv 函数,修改如下:

#if 0
domid_str = xs_read(xs, , "domid", NULL);
domid_str = xs_read(xs, , buf, NULL);
printf("%s:%d,domid=%s\n",__func__,__LINE__,domid_str);
if (!domid_str)
goto fail_xs_open;
// owner domain is us
perms[].id = atoi(domid_str);
#endif
perms[].id = ;

这是因为在我的测试里,

domid_str = xs_read(xs, 0, "domid", NULL); 这句会失败,其读xenstore的domid节点,会找不到节点。所以我直接将 perms[0].id 写死为 0, 这样 vchan_node/vchan_node2 测试例子的server 端只能用 domain0

接下去我新建了一个目录 tools/test-vchan , 然后执行下面的脚本,将需要的头文件和测试文件拷贝进来,并建立静态库的软连接,之所以要这么搞,主要是想静态编译 xc 库, xs 库 , vchan库
到测试代码,这样修改调试的时候不需要每次都拷贝一堆so文件,只需要拷贝最终的可执行文件即可
mkdir lib
ln -s ../libxc/libxenctrl.a lib/libxenctrl.a
ln -s ../xenstore/libxenstore.a lib/libxenstore.a
ln -s ../libvchan/libxenvchan.a lib/libxenvchan.a mkdir include
ln -s ../include/xen include/xen
cp ../libvchan/libxenvchan.h include/
cp ../xenstore/xenstore.h include/
cp ../xenstore/xenstore_lib.h include/
cp ../libxc/xenctrl.h include/ cp ../libvchan/node-select.c .
cp ../libvchan/node.c .
tools/test-vchan 的 Makefile 文件如下:
  all:
gcc -o vchan-node1 node.c -L./lib -I./include -lxenvchan -lxenstore -lxenctrl -lpthread -ldl
gcc -o vchan-node2 node-select.c -L./lib -I./include -lxenvchan -lxenstore -lxenctrl -lpthread -ldl clean:
rm -f vchan-node1
rm -f vchan-node2

执行 make 之后生成 vchan-node2. 将 vchan-node2 拷贝到 doman0,将 vchan-node2 和 xenctrl_osdep_linux.so ,libxenctrl.so 两个动态库拷贝到 domainU ,libxenctrl.so 库提供操作xen hypervisor的接口,xenctrl_osdep_linux.so这是linux平台相关的操作接口。然后 domainU 执行 vchan-node2 之前需要设置环境变量

export XENSTORED_PATH="/dev/xen/xenbus"
export XENCTRL_OSDEP="/usr/lib64/xenctrl_osdep_linux.so"

domain0 启动为 server , 它会映射内存,并将共享内存的引用信息记录在xenstore , 然后监听 eventchannel , 如果有client发来的数据,则打印出来

domainU 启动为 client, 它从Xenstore得到共享内存的引用信息,mmap共享内存,然后往内存里写入数据

至此,一个基于libvchan的 inter-domain (domain is linux)数据交互例子就完成了。

基于Xen实现一种domain0和domainU的应用层数据交互高效机制 - 3的更多相关文章

  1. 基于Xen实现一种domain0和domainU的应用层数据交互高效机制 - 2

    继续昨天的思路,今天先google了类似的实现domain0和domainU之间数据传输的方案 [Xen-devel] XenStore as a data transfer path?  这篇帖子讨 ...

  2. 基于Xen实现一种domain0和domainU的应用层数据交互高效机制

    项目里有一个需求,domain0的应用层需要定时给domainU(hvm windows)的应用层传递一块数据,原来的方案是在domainU的应用层架设一个http服务器,监听在某个端口,然后需要塞数 ...

  3. html5-websocket实现基于远程方法调用的数据交互

    html5-websocket实现基于远程方法调用的数据交互   一般在传统网页中注册用户信息都是通过post或ajax提交到页面处理,到了HTML5后我们有另一种方法就是通过websocket进行数 ...

  4. 【腾讯Bugly干货分享】基于RxJava的一种MVP实现

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57bfef673c1174283d60bac0 Dev Club 是一个交流移动 ...

  5. 基于MVC4+EasyUI的Web开发框架经验总结(12)--利用Jquery处理数据交互的几种方式

    在基于MVC4+EasyUI的Web开发框架里面,大量采用了Jquery的方法,对数据进行请求或者提交,方便页面和服务器后端进行数据的交互处理.本文主要介绍利用Jquery处理数据交互的几种方式,包括 ...

  6. Android上掌纹识别第一步:基于OpenCV的6种肤色分割 源码和效果图

    Android上掌纹识别第一步:基于OpenCV的6种肤色分割 源码和效果图 分类: OpenCV图像处理2013-02-21 21:35 6459人阅读 评论(8) 收藏 举报   原文链接  ht ...

  7. Spring WebFlux, 它是一种异步的, 非阻塞的, 支持背压(Back pressure)机制的Web 开发WebFlux 支持两种编程风(姿)格(势) 使用@Controller这种基于注解

    概述 什么是 Spring WebFlux, 它是一种异步的, 非阻塞的, 支持背压(Back pressure)机制的Web 开发框架. 要深入了解 Spring WebFlux, 首先要了知道 R ...

  8. 基于Redis的三种分布式爬虫策略

    前言: 爬虫是偏IO型的任务,分布式爬虫的实现难度比分布式计算和分布式存储简单得多. 个人以为分布式爬虫需要考虑的点主要有以下几个: 爬虫任务的统一调度 爬虫任务的统一去重 存储问题 速度问题 足够“ ...

  9. (转)基于MVC4+EasyUI的Web开发框架经验总结(12)--利用Jquery处理数据交互的几种方式

    http://www.cnblogs.com/wuhuacong/p/4085682.html 在基于MVC4+EasyUI的Web开发框架里面,大量采用了Jquery的方法,对数据进行请求或者提交, ...

随机推荐

  1. python——闰年的判断

    写一个程序,判断给定年份是否为闰年. 这样定义闰年的:能被4整除但不能被100整除,或者能被400整除都是闰年. while(1): year = input("请输入一个年份,让我判断一下 ...

  2. [Codeforces958A2]Death Stars (medium)(字符串+hash)

    Description 题目链接 Solution 这里用类似hash的方法将判断2个矩阵是否相同的时间降为O(m),总时间复杂度为O(m3) Code #include <cstdio> ...

  3. perl语言入门总结-第5章-输入输出

    读取标准输入 chomp($line = <STDIN>); #去掉后面的换行 while (defined($line = <STDIN>)) { print "I ...

  4. python基础之正则表达式和re模块

    正则表达式 就其本质而言,正则表达式(或 re)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 ...

  5. 20145202马超 《Java程序设计》第九周学习总结

    JDBC 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找. JDBC(Java DataBase Connectivity)是Java联机数据库 ...

  6. div+css实现双飞翼布局

    本例通过div+css实现HTML金典布局双飞翼布局,该布局结构为上中下结构,上:header头:下:footer尾:中:内容,将内容分为了三个结构,左中右 下图是效果图 我们来看下代码 <!D ...

  7. ios交叉编译dylib

    ios交叉编译dylib 因多个静态库,libes,libffmpeg,libmt. libpcap 使用不方便 在封装一层接口,生成动态库(c代码),由IOS app上层调用. IOS_BASE_S ...

  8. 无限小数转分数POJ1930分析

    将无限小数化为分数,有一套简单的公式.使其轻松表示出来. 循环节 例如:0.121212…… 循循环节为12.   公式 这个公式必须将循环节的开头放在十分位.若不是可将原数乘10^x(x为正整数) ...

  9. Android学习记录(1)—Android中XML文件的序列化生成与解析

    xml文件是非常常用的,在android中json和xml是非常常用的两种封装数据的形式,从服务器中获取数据也经常是这两种形式的,所以学会生成和解析xml和json是非常有用的,json相对来说是比较 ...

  10. Pascal小游戏 打飞机

    一个经典的打飞机游戏(1)Pascal代码 十分经典,有一种街机的感觉 奇葩青年的又一控制台神作. uses crt; type list=record         ty,ax:integer;  ...