一.启动页和共享页
启动页:由Xen映射到GuestOS内存空间的一个页面,包括内核启动所需的所有信息。
页框地址,首个加载模块的地址,内存页面数等信息。
共享页:收集与全局状态相关的信息。用于Xen与GuestOS间共享数据。
VCPU状态(是否有未处理的事件),Guest OS状态,Xen的事件通道。
XenStore:文件系统相似的树形结构,存储设备信息和Domain相关信息。
二.Hypercall
1.利用INT0x82陷阱。Hypercall调用号,Hypercall Table。
Xen3.0之前,直接利用以上信息完成Hypercall。
Xen3.0以后,利用 封装例程 + 超级调用页。
2.封装例程(根据调用号(名字),在超级调用页中找到正确的位置,CALL它 == INT 0x82陷阱)
超级调用页是Xen为Guest OS准备的一个页 ==> 可以做到不同GuestOS有不同的超级调用页内容。
3.Hypercall只能有Kernel调用。User使用的流程是:
User --> ioctl() -->根据不同的参数,找到不同的privcmd --> privcmd -->Hypercall --> Xen
privcmd是一个内核驱动,以特殊文件的形式挂在/proc文件下。
4.Xen提供了一些lib给User使用,lib提供具体的应用(例如Create Domain),
但内部还是要去调用do_privcmd,去发行37个Hypercall中的一个。
三.事件通道
发送发和接收方先绑定。
一个事件通道 = local port ---link---remote port
发送消息 = 通过本地port找到reomteport,置remote port的pending位为1.
四.Grant Table + XenStore + Ring Data Structure(local in sharedmemory pages)
FE--mitializes--> Memory page with a ring datastructrue
--export it via Grant Table--> store intoXenStore
BE --retrive it fromXenStore--> Map it into its own address space
FE -->read/write from/into it <-- BE
FE -->event_channel <-- BE
五.疑问
1.NEX中有Xend吗?
没有了,已经被Agent替代了。
二.Hypercall
三.事件通道
四.Grant Table + XenStore + Ring Data Structure(local in sharedmemory pages)
五.疑问