摘要:XenStore的初始化完全在用户空间的libxl中实现。Dom0包办了所有的操作,使DomU一启动,就可以与Dom0进行xenstore通信,但是程序非常的复杂和难以维护。Xen核心仅仅为xenstore提供了两个辅助数据项,其余的完全在xen已有的架构下实现。
XenStore所进行的域间通信,在底层仍然是通过共享内存和事件通道机制进行的。但是前面已经提到,想要共享内存或者建立事件通道,必须事先进行通信。那么XenStore自身是怎样建立起这些通道的呢?有必要研究一下Xenstore的启动过程。
我们一般使用命令行新建domu。例如:sudo xl create –c ubuntu.cfg 所以我们从xl所在的程序库libxl开始,仔细分析虚拟机启动过程中xenstore的初始化过程。
其中核心的步骤就是:Dom0的libxl调用libxc,替新创建的domu分配了属于DomU的共享页面和事件通道,并且通知Xenstored建立domu的管理数据结构;在分配好以后再由XenStore映射回来。这样DomU一启动,就可以从start_info结构体中获取共享内存的地址,与Dom0进行通信了。然而,这样做就意味着Dom0包办了所有的操作,并且要考虑架构相关的因素,精确地控制DomU的内存分布,同时还要避免C语言的内存泄漏;所以程序变得非常的复杂和难以维护。
这种做法的另一个特点是:实现代码完全在用户空间的libxl和libxc中,完全在xen已有的架构下实现。Xen核心唯一需要做的,就是在start_info结构体中增加两个数据项store_mfn和store_port。这也说明xen与kvm相比,核心提供更多的功能。