很重要!!请教Xen共享内存、超级调用和授权表的问题!!
别的话不多说,直接将我的疑问说出来向各位大侠请教一下。
在项目中需要用到Xen的共享内存进行Domain之间的通信。查了一下资料,要用到授权表,所以就想先把授权表的基础操作搞明白。不过手上的一本《Xen虚拟化技术》(石磊等编著,华中科技大学出版社)对授权表操作涉及到的函数介绍得不详细。例如:
long grant_table_op(unsigned int cmd, XEN_GUEST_HANDLE(void) uop, unsigned int count);
这个超级调用的第二个参数具体是什么类型?
然后,我想写个小程序来执行查询授权表的操作。我初步猜测对于查询授权表来说,上面那个函数的第二个参数可能是gnttab_query_size_t结构体指针,于是那个测试小程序就写成这样:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <xen/grant_table.h>
#include <xen/arch-x86/xen.h>
#include <xenctrl.h>
#include <xen/sys/privcmd.h>
int main(int argc, char **argv)
{
gnttab_query_size_t *pGntQuery = (gnttab_query_size_t *)malloc(sizeof(gnttab_query_size_t));
int fd, ret;
privcmd_hypercall_t hcall = {__HYPERVISOR_grant_table_op, {GNTTABOP_query_size, pGntQuery, 1, 0, 0}};
printf("Before operation, domid_t: %d\n", pGntQuery->dom);
fd = open("/proc/xen/privcmd", O_RDWR);
if (fd < 0)
{
perror("Open privcmd failed");
exit(1);
}
ret = ioctl(fd, IOCTL_PRIVCMD_HYPERCALL, &hcall);
if (ret == -1)
{
perror("ioctl failed");
exit(1);
}
printf("After operation, domid_t: %d\n", pGntQuery->dom);
free(pGntQuery);
pGntQuery = NULL;
return 0;
}
上面这个程序主要是想在一下 Dom U 里查询它的授权表信息,将它的domid打印出来。由于在用户空间里不能使用超级调用,所以就借助privcmd内核驱动程序和ioctl系统调用。
在Xen方面我是一个菜鸟,而且目前貌似这方面的资料不多,例程就更少,所以很多东西都是靠猜,比如上面那个小程序。另外,这个问题与公司云计算项目有点关系,姑且把它发在IBM云计算论坛里,有不妥之处请各位见谅!
当然,最希望的是各位大侠能不吝赐教,万分感谢!!!