在一台机器上运行多个操作系统挑战在于:
1
操作系统相互之间不能互相影响
2
需要支持不同的操作系统同时运行
3
虚拟化带来的性能上的影响应该尽可能的小
Xen
设计的目标是:
1
修改应用程序对于用户来说是不能接受的。否则用户不会去使用
xen,
因此
xen
必须虚拟出
ABIs
要求的所有的体系结构特征
2
支持多任务的操作系统。
3
为了达到高的性能和资源的隔离性,
paravirtualization
是必须的
Xen
和
Denali
的区别:
1 Denali
目标不在于
ABIs
的虚拟,所以在
VM
接口里可以不用某些体系特征,比如
x86
里面的段结构
2 Denali
的设计没有考虑在单
OS
里支持多任务和多地址空间,实际上虚拟的是一个单用户单任务无保护的“操作系统”
3 Denali
结构里,
VMM
页的管理使用的是磁盘,可能是因为在虚拟层缺少内存管理的支持。
Xen
里,每个客户
OS
的页面管理使用的是自己的保留的内存地址
4 Denali
虚拟了所有机器资源的
namespaces
,
VM
不能
access
没有命名的资源。但是,
hypervisor
能提供足够的保证,让物理的资源对于客户
OS
可见也能保证强正确性和性能。
1 Xen
的内存管理:
每次当客户
OS
需要新的页表,就从自己的内存空间里面分配和初始化一个页,并向
xen
注册,客户
OS
放弃写入特权到页表内存里去,后继的更新由
Xen
来完成。每个地址空间起始的
64M
分配给
Xen
,客户
OS
不能
access
或是从新映射这段空间。一般的
x86 ABIs
不需要这段地址空间。所以不会破坏程序的兼容性。
2 xen
的
CPU
:
内存的虚拟是最难的部分。大多数处理器只提供两个优先级,这样客户
OS
只好和应用程序享用同一个优先级。用户
OS
为了保护自己需要让自己运行在单独的地址空间里面。用户
OS
需要通过
hypervisor
来设定虚拟的优先级,修改自己的地址空间
在
x86
里面,有
4
个优先级,
hypervisor
优先级为
0
,客户
OS
为
1
,应用程序为
3
,这样即可以保证客户
OS
优先级低于
hypervisor,
又能保证客户
OS
和应用程序间的隔离性。
异常,包括内存错误和陷阱。用很简单的方式虚拟出来。用一个表来描述在
Xen
里面注册的异常对应的
handle
。
Xen
的设计细节:
1
控制转移:
domain
同步
call Xen
使用
hypercall
,
Xen
传递
notification
到
domain
使用异步事件机制。
Hypercall
允许
domain
产生一个同步
trap
到
hypervisor
以执行特权操作(例如页表的更新)。异步的事件机制替代传统的设备中断使用的传递机制,允许重要事件的轻量
notification
。
Pending
事件被存储在每个
domain
的
bitmask
里面,
Xen
在调用客户
OS
的事件回调
handler
之前更新
bitmask
。回调
handler
负责处理重置
pending
事件集。
2
数据传递,
I/O
环:
hypervisor
意味着在客户
OS
和
I/O
设备间添加了保护
domain
。系统垂直传递机制的开销应该尽可能小。
异步
I/O
环是个圆型的
descriptor
队列,
descripter
由
domain
分配,由
Xen
来使用。
Descripter
不直接包含数据,它只是一个指向数据
buffer
的指针。通过两对
producter-consumer
指针来
Access to
环。
Domain
放置一个
request
到环上去,
advance a request producer
指针。
Xen remove requests
,然后处理这些
requests
,
advance
相关
request consumer
指针。
3
子系统的虚拟化:
CPU
策略:
BVT
(
Borrowed Virtual Time
)
provides low-latency dispatch by using virtual-time warping, a mechanism which temporarily violates `ideal' fair sharing to favor recently-woken domains. However,other scheduling algorithms could be trivially implemented over our generic scheduler abstraction. Per-domain scheduling parameters can be adjusted by management software running in Domain0.
虚地址转换:
Vmware
的做法是为每个客户
OS
提供虚拟页表,
Xen
的做法是将每个客户
OS
的页表直接向
MMU
注册,限制客户
OS
只允许它们以只读的方式访问页表,使用
hypercall
让
Xen
执行页表的更新,执行前必须验证请求。
物理内存:每个
domain
被生成时初始化内存分配,如果某个
domain
内存不足时,可以向
Xen
申请更多的内存。
网络:
Xen
提供
VFR
(
virtual firewall-router
)抽象,每个
domain
拥有一个或多个网络接口(
VIFs
)与
VFR
连接。
VIF
有些类似于网卡。
磁盘:
Only Domain0 has direct unchecked access to physical (IDE and SCSI) disks.
其他的
domains
通过
VBDs
(
virtual block devices
)访问磁盘。在
Xen
里面为每个
VBD
维护
translation table