note:此文描述了xen半虚拟化网卡vif机制,梳理作用。
Xen的块设备驱动使用了XEN IO环的机制的。
xen hyprevisor的作用就是说在虚拟机和IO设备之间提供一层保护层,所以对于数据传输机制就是要在数据在系统之间移动的同时带来比较小的开销。两个主要的数据传输机制影响I/O数据传输。一个是资源管理,另外一个数数据传输。Xen使用了最小化开销的两种机制:IO描述符环和事件通道,授权表机制。
对于网络设备是这样的,Xen给虚拟机提供了虚拟网桥,每一个Domain都有一个或者多个虚拟接口VIFs逻辑上连接到了虚拟网桥,一个VIF看起来就像是一个物理网络接口卡NIC一样,但是有两个buffer描述符环,一个是接收的,另外一个是发送的。这两个方向都有各自的rule形式,如果满足的话,相应的动作就会实施(就相当于物理网卡可能会执行的过滤功能那样)。
发送过程
虚拟机操作系统直接把一个buffer 描述符(是对应的(vif driver的)TX buffer?的buffer描述符)放到发送环中(描述符的请求producer)。XEN复制这个描述符并且保证安全性,然后复制数据包的头部进行一些过滤规则(请求 consumer )。(数据包的payload并不复杂,因为我们使用共享内存机制)
这就相当于xen接管了物理网卡部分,但是同时让这个虚拟机的内存buffer和物理网卡buffer是共享的内存,于是减小了开销。
接收过程
当包从虚拟网桥到来的时候,guest OS会使用一个没有用的页面去来交换到来的包,这避免了在XEN和guest OS之间复制包的开销,虽然这需要guest OS的接收buffers在网络接口处排队。当包接收到后,XEN会很快的去查询rules,来决定相应的vif,并且用接收环上的page frame的packet buffer来交换这个数据包。
"if no frame is available,the packet is dropped。" 所以在接收的过程中很可能会丢包,这也就是说如果接收环满了,那么就丢包了。
注意,这个讲的和netmap和vale对比,原理有相似之处,但是vale工作在网桥层面,而IO环工作在网卡和网卡驱动层(XEN的)。
参考文献:
xen and the art of virtualization
p.s.有空再补充