Chinaunix首页 | 论坛 | 博客
  • 博客访问: 692668
  • 博文数量: 33
  • 博客积分: 10032
  • 博客等级: 上将
  • 技术积分: 1383
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-22 18:53
文章分类

全部博文(33)

文章存档

2011年(4)

2010年(10)

2009年(14)

2008年(5)

我的朋友

分类:

2009-03-31 17:39:43

    本文结合Solaris的实现,简单介绍一下paravirtualization网卡驱动。Paravirtualization相对于full virtualization的主要优势在于其性能,前者需要修改Guest OS,而后者则需要模拟真实的网卡设备以利用操作系统上现有的网卡驱动。现在的虚拟机采用了一种叫做IOVM的技术,也就是hypervisor不提供网卡驱动,而是由IOVM提供。IOVM可以是Dom0。这样一来简化了hypervisor,二来可以利用现有的驱动。如果某种型号的网卡Solaris暂不支持,而Linux支持,就可以让Linux作Dom0,Solaris作DomU。
    网卡驱动被拆分为了两部分,前端(backend)和后端(frontend)。Dom0中的驱动是后端,DomU中的驱动是前端。前后端通过event channels机制通讯,并配合基于共享内存(术语叫做grant table)的I/O Rings高效传输。以发送来为例,首先前端将上层传来的包建立DMA映射,将该页面通过grant table共享出去(xnf_send/xnf_send_one),通过event channels通知后断。后端通过grant table将前端共享的页面映射到自己的地址空间,然后通过Dom0 mac层接口(mac_tx)利用自身网卡驱动,例如e1000g,将包发送出去。对Solaris来说后端的实现有两种,一种是类Linux的实现,内核模块是xnbu+xnb,另外一种是结合Crossbow VNIC的实现,内核模块是xnbo+xnb。以前写过一篇文章,是说如何利用openvpn和bridge-utils软件让QEMU虚拟机联网。其原理是一样的,就是说让Dom0和DomU(或者主机和虚拟机)中的网卡通过网桥互联,当然这里的网卡和网桥都是软件模拟的,这样的话xnbu本是就是一个GLDv3网卡驱动。Solaris的另外一种实现xnbo本身不是GLDv3网卡驱动,而是打开Dom0上的网卡驱动,例如e1000g,让后端通过前端驱动间接拥有物理网卡,这样的局限性显而易见,我们不能为每一个domain都分配一个物理网卡,所以可以结合Crossbow的VNIC。
    刚才提到了I/O Rings,这个ring和物理网卡的ring的用法是一样的。是一种生产者消费者的模型。仍以发送为例,前端不断向ring中填充descriptor,其中主要内容包括共享内存页面号(grant table reference),起始offset,大小等。后端被notified后读取其内容,然后将descriptor中所指的DMA buffer发送出去,然后前移指针,直到ring为空。I/O Rings由前端建立,其共享页面号通过XenStore告知后端,然后后端由grant table机制将共享页面映射到自己的地址空间。这些工作都是xnf/xnb驱动在attach的时候由函数xnf_be_connect/xnb_connect_rings完成的。
    Event channel有几种类型,其中一种是interdomain events。这是一种双向的,主要用于PV环境下前后端之间的消息传递机制。Solaris使用中断来实现event channel。以传输为例,前端通知后端有包发送,后端通过中断函数xnb_intr来完成相应的发送任务的。同样,后端接收到网络上传来的包后,通知前端接收,前端通过中断函数xnf_intr来完成接收,然后交给DomU上层的。

http://blog.chinaunix.net/photo/23177_090427170458.png

Dom0
# modinfo | grep xn
294 fffffffff8003220    f48 250   1  xnbo (xnbo driver)
295 fffffffff889b000   5158   -   1  xnb (xnb)
# mdb -k
> ::interrupts
IRQ  Vect Evtchn IPL Bus    Trg Type   CPU Share APIC/INT# ISR(s)
4    0x38 27     12  ISA    Edg Fixed  1   1     0x0/0x4   asyintr
7    0x50 25     5   ISA    Edg Fixed  1   1     0x0/0x7   ecpp_isr
9    0x60 5      9   PCI    Lvl Fixed  0   1     0x0/0x9   acpi_wrapper_isr
16   0xb8 12     9   PCI    Lvl Fixed  1   5     0x0/0x10  drm_irq_handler_wrap, audiohd_intr, iwk_intr, pepb_intr_handler, uhci_intr
17   0xc0 13     1   PCI    Lvl Fixed  0   2     0x0/0x11  uhci_intr, uhci_intr
18   0xa0 8      6   PCI    Lvl Fixed  1   3     0x0/0x12  0, elxl_intr, uhci_intr
21   0xc8 19     6   PCI    Lvl Fixed  1   1     0x0/0x15  e1000g_intr_pciexpress
22   0xa8 10     1   PCI    Lvl Fixed  0   1     0x0/0x16  ehci_intr
23   0xb0 11     1   PCI    Lvl Fixed  1   2     0x0/0x17  uhci_intr, ehci_intr
256  -    I      15  -      Edg ipi    all -     -         xc_serv
257  -    I      13  -      Edg ipi    all -     -         xc_serv
258  -    I      11  -      Edg ipi    all -     -         poke_cpu
259  -    1      15  -      Edg virq   all -     -         xen_debug_handler
260  -    T      14  -      Edg virq   all -     -         cbe_fire
261  -    I      14  -      Edg ipi    all -     -         cbe_fire
262  -    16     3   -      Edg virq   all -     -         gcpu_xpv_virq_intr
263  -    21     1   -      Edg evtchn 0   -     -         xenbus_intr
264  -    D      1   xpvd   Edg device 0   -     -         evtchn_device_upcall
265  -    2      9   xpvd   Edg virq   all -     -         xenconsintr_priv
266  -    28     5   xpvd   Edg evtchn 0   -     -         xdb_intr
267  -    29     6   xpvd   Edg evtchn 1   -     -         xnb_intr

DomU
# modinfo  | grep xnf
148 fffffffff7e6c000   4748 192   1  xnf (Virtual Ethernet driver)
# mdb -k
> ::interrupts
IRQ  Vect Evtchn IPL Bus    Trg Type   CPU Share APIC/INT# ISR(s)
256  -    1      15  -      Edg virq   all -     -         xen_debug_handler
257  -    1      1   -      Edg evtchn 0   -     -         xenbus_intr
258  -    T      14  -      Edg virq   all -     -         cbe_fire
259  -    5      5   xpvd   Edg evtchn 0   -     -         xdf_intr
260  -    2      9   xpvd   Edg evtchn 0   -     -         xenconsintr
261  -    6      6   xpvd   Edg evtchn 0   -     -         xnf_intr

安装DomU
function xen-install
{
        typeset file=/root/xvm/snv102_pv.img
        typeset image=/net/bounty/ftp/pub/CDimages/nv/102/x86/solarisdvd.iso

        /usr/bin/virt-install -p -n domu-102 -r 768 --nographics \
            -f $file -s 10 -m "0:21:9b:cb:ee:c1" -l $image
}
一些基本用法
# virsh list
 Id Name                 State
----------------------------------
  0 Domain-0             running
  - domu-102             shut off
# virsh start domu-102
Domain domu-102 started

# virsh list
 Id Name                 State
----------------------------------
  0 Domain-0             running
  1 domu-102             running
# virsh console domu-102
v3.1.4-xvm chgset 'Mon Oct 13 22:14:51 2008 -0700 15904:94bd0a643efe'
SunOS Release 5.11 Version snv_102 64-bit
Copyright 1983-2008 Sun Microsystems, Inc.  All rights reserved.
Use is subject to license terms.
...

参考文献:
The Definitive Guide to the Xen Hypervisor
Intel® Virtualization Technology for Directed I/O
Xen and the Art of Virtualization
阅读(3959) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~