Xen前后端设备

前端设备驱动从Guest OS内核中接收IO请求,由于它不能访问硬件平台的物理设备,所以前端将所有的IO请求转发到后端。后端设备驱动在接收到前端转发的IO请求后,检查该请求是否合法,并通过本地设备驱动访问真实的硬件设备。后端设备驱动是虚拟机DomU中Guest OS内核的功能。在IO请求完成后,后端设备驱动通知前端数据已经准备就绪,前端向DomU中Guest OS内核报告IO操作完成。在整个IO设备访问的过程中,后端设备驱动是所有前端访问真实物理设备的代理。
设备IO环

    设备IO环中并不包含真实的数据,而是Xen和Guest OS的请求和响应。当多个请求响应到来时,就形成了请求队列和相应队列。在虚拟机的前端设备接收中断事件并进行处理时,在请求队列中加入一个请求作为请求的生产者。这个请求将更新虚拟机和Xen全局共享的请求指针。Xen作为请求消费者进行处理并移除这些请求,更新Xen私有的请求消费者指针。Xen作为响应生产者把请求的响应放在响应队列中,同时更新共享的响应指针。发出IO请求的虚拟机作为响应消费者更新私有响应指针。

实现步骤
前端

    ① 分配共享环. SHARED_RING_INIT()
    ② 分配前端环. FRONT_RING_INIT()
    ③ 分配事件通道evtchn,并绑定中断处理函数. bind_listening_port_to_irqhandler()
    ④ 授权共享环给后端,并产生授权引用ref. Xenbus_grant_ring()
    ⑤ 将evtchn和ref写入XenStore. xenbus_printf()
    ⑥ 改变前端状态,触发后端回调函数进行处理. Xenbus_switch_state()

后端

    ① 后端回调函数被触发,从XenStore中获取ref和evtchn. Xenbus_gather()
    ② 将ref指向的页面映射到自己的虚拟地址空间. Xenbus_map_ring_valloc()
    ③ 分配后端环. BACK_RING_INIT()
    ④ 根据evtchn绑定域间通道. bind_interdomain_evtchn_to_irqhandler()
    ⑤ 改变后端状态,触发前端回调函数进行处理. Xenbus_switch_state()

你可能感兴趣的:(Xen虚拟化技术)