Xen和IA-32的保护模式(Xen and IA32 Protection Modes)
在IA32的高级保护模型(classical protection model)中,有4个特权层级(privilege level);最高层为ring 0,内核运行其上(该层也被称为Supervisor Mode)。最底层为ring 3,用户的应用运行其上(该层也被称为User Mode)。在除了ring 0的其他ring上调用特权指令(privilege instructions),会导致一般性保护错误(General Protection Fault)。
近些年,ring 1,2没有被使用(除了OS/2)。Xen在运行的时候,hypervisor运行在ring 0而guest OS运行在ring 1。用户应用则运行在ring 3。
Xend守护进程(The Xend Daemon)
Xend守护进程处理来自dom0的请求,请求可以是:创建一个新的domain("xm create")或者显示现有domain列表("xm list"),关闭某个domain("xm destroy")等。运行"xm help"可以显示更多能够处理的请求。
你可以在dom0启动之后运行"xend start"来启动xend守护进程。"xend start"启动了两个守护进程:xenstored和xenconsoled(详情见 tools/misc/xend)。同时,也创建了一个python的SrvDaemon类实例,并用了它的start()方法(详情见 tools/python/xen/xend/server/SrvDaemon.py)。事实上,SrvDaemon的start()方法才是xend的主程序。
在过去的版本中,start()方法最终会开启一个Http socket(8000)对http请求进行监听。而现在的版本中却没有这么做。
Note: 取而代之的方案是使用一个免费API——libvirt(详情见 http://libvirt.org)。
Xen Store(The Xen Store)
Xen store守护进程实现了一个简单树形结构数据库(simple tree-like database),有了它,我们可以对值方便地进行读写。Xen store的主要源码存放于tools/xenstore下。
它的出现替代了XCS——一个曾经用来处理控制信息的守护进程。
Xen store的物理数据存放于单个文件中: /var/lib/xenstored/tdb。(之前是被存放在多个文件中的,经过整合存放在单个文件可以提高性能)
User space(Xen术语中的"tools")和内核代码都可以对XenStore进行写操作。其中,内核代码通过XenBus对XenStore进行写操作。
Python脚本(在tools/python下)通过使用lowlevel/xs.c对XenStore进行读写。
Xen Store Daemon在xenstored_core.c中被启动。启动过程中,若检测到设备文件("/dev/xen/evtchn")没有被创建,则创建之,并且开启该设备(见 : domain_init() ,file tools/xenstore/xenstored_domain.c)。
它开启了2个TCP socket(UNIX socket)。其中一个是只读socket,位于/var/run/xenstored/socket_ro之下。另一个则位于/var/run/xenstored/socket。
在这些socket之上的连接被表示为connection结构体。
一个connection可以有3种状态:
- BLOCKED (由于某transaction而阻塞)
- BUSY (正在进行某些活动)
- OK (完成了相关事物处理)
connection结构体在tools/xenstore/Xenstored_core.h中被定义;若某个socket是只读的,那么它的"can_write"成员属性为false。
之后,我们开启一个无限循环用来从三个来源处获得input/output:上述的两个socket、event channel。