Chinaunix首页 | 论坛 | 博客
  • 博客访问: 165962
  • 博文数量: 4
  • 博客积分: 502
  • 博客等级: 下士
  • 技术积分: 56
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-22 14:42
个人简介

请多多关照

文章分类

全部博文(4)

文章存档

2012年(1)

2011年(3)

分类: LINUX

2012-03-15 15:29:07

摘要:XenStoreXen提供的一个域间共享的存储系统,它以字符串形式存放了管理程序和前、后端驱动程序的配置信息。Dom0管理所有的数据,而DomU通过共享内存,向Dom0请求与自己相关的键值,以此实现域间通信。Xen提供了多种接口用来操作XenStore:命令行的xenstore-*命令、用户空间的xs_系列函数、内核的XenBus接口,都可以用来方便地操作XenStore的数据。




0. 动机

Xen的半虚拟化(PV)系统中,各个虚拟机(Domain)之间可以利用Xen核心提供的授权表(Grant Table)和事件通道(Event Channel)机制进行域间通信。但是在实际使用中有这样的问题:

  •   Alice使用授权表共享了一个页面,但是Sanae想要拿来用,必须事先知道它的授权引用(gref);
  •   Alice打开一个事件通道(unbound evtchn),但是Sanae想要绑定这个通道,必须事先知道Alice使用的端口号(remote port)。

显然,想要解决这两个问题,需要AliceSanae之间,在建立自定义的授权表、事件通道之前就能够互相通信。

使用XenStore可以很方便地实现这种通信。

1. 快速入门

XenStoreXen提供的一个域间共享的存储系统,它以字符串形式存放了管理程序和前、后端驱动程序的配置信息。Dom0管理所有的数据,而DomU通过共享内存,向Dom0请求与自己相关的键值,以此实现域间通信。

XenStore的存储结构类似于Dom树:每一个节点(Node)有一个字符串值(Value),并且可以有多个子节点。在Dom0启动后,XenStore的结构如下:

/

vm

{uuid}

local

domain

0

vm

device

control

memory

console

limit

type

name

......

1

tool

xenstored

在根(/)下有三个子目录,vmlocal(实际上是/local/domain)和toolvm存放虚拟机管理信息。tool暂时没有数据。而/local/domain存放了活动虚拟机配置和驱动信息。/local/domain中每一个目录项代表一个活动的虚拟机,例如/local/domain/0代表dom0Dom0可以读写XenStore的全部数据,而Dom-x只能访问/local/domain/x的内容。需要在dom0domx之间共享的内容,一般都写在这个目录下,所以/local/domain是最常用的目录。

Xen提供了多种接口用来操作XenStore:命令行的xenstore-*命令、用户空间的xs_系列函数、内核的XenBus接口,都可以用来方便地操作XenStore的数据。

操作

命令行

用户空间

  1. #include    
  2. -lxenstore  

内核空间

  1. #include “xen/xenbus.h”  

列目录

xenstore-ls(递归)

xenstore-list(不递归)

xs_directory

xenbus_directory

读写

xenstore-read

xenstore-write

xs_read

xs_write

xenbus_read

xenbus_write

xenbus_scanf

xenbus_printf

建立/删除目录

xenstore-mkdir

xenstore-rm

xs_mkdir

xs_rm

xenbus_mkdir

xenbus_rm

监视

xenstore-watch

xs_watch

xs_unwatch

xs_read_watch

xenbus_watch

xenbus_unwatch


例子

命令行

  1. xenstore-write example/Alice hello!  

用户空间

  1. struct xs_handle *xh = xs_open(0);  
  2. int xt=xs_transaction_begin(xh);  
  3. xs_write(xh,xt,"/local/domain/0/example/Alice""hello!"sizeof("hello!"));  
  4. xs_transaction_end(xh, xt, 0);  
  5. xs_close(xh);  

内核空间

  1. struct xenbus_transaction trans;  
  2. xenbus_transaction_start(&trans);  
  3. xenbus_printf(trans, "example""Alice""Hello! trans_id = %d", trans.id);  
  4. xenbus_transaction_end(trans, 0);  
Note: example/Alice相当于/local/domain/{当前domain}/example/Alice

具体的使用方法,可以查看相应的头文件
阅读(11565) | 评论(0) | 转发(1) |
0

上一篇:DES算法的程序设计与实现

下一篇:没有了

给主人留下些什么吧!~~