在前面四篇文章介绍过Xen的事件通道机制后,设计一个简单的通讯样例,并进行原理说明
1、建立dom时完成事件通道的建立与初始化(vcpu绑定)
1.1 事件通道的初始化
domain_create中调用 evtchn_init完成事件通道初始化,evtchn_init中关键函数为get_free_port。在第一次初始化过程中,get_free_port()通过memset()将分配的结构体数组全部清零,其中包括结构体evtchn成员state的值。成员state值为0,意味着初始化后事件通道都处于未分配状态(ECS_FREE),并且notify_vcpu_id也为0,即所有的事件通道默认都和dom中vcpu 0进行绑定。
1.2 对xen的修改
为了实现事件通道的预分配,在创建domain时会对domain的事件通道初始化,函数为evtchn_init,对该函数进行修改如下:
int evtchn_init(struct domain *d)
{
//struct evtchn *lchn,*rchn;
//int i,j;
spin_lock_init(&d->event_lock);
if( get_free_port(d) != 0 )
return -EINVAL;
evtchn_from_port(d, 0)->state = ECS_RESERVED;
if(d->domain_id==0)
{
evtchn_from_port(d, 121)->state = ECS_UNBOUND;
evtchn_from_port(d, 121)->u.unbound.remote_domid =1;
evtchn_from_port(d, 122)->state = ECS_UNBOUND;
evtchn_from_port(d, 122)->u.unbound.remote_domid =2;
evtchn_from_port(d, 123)->state = ECS_UNBOUND;
evtchn_from_port(d, 123)->u.unbound.remote_domid =3;
evtchn_from_port(d, 124)->state = ECS_UNBOUND;
evtchn_from_port(d, 124)->u.unbound.remote_domid =4;
evtchn_from_port(d, 125)->