开源夏令营中期报告

来源:互联网 发布:java应用开发框架 编辑:程序博客网 时间:2024/05/16 23:41

知识总结

通过几周对于linux kernel和qemu代码的深入阅读,在不断code和debug过程中总算对于virtio-net以及虚拟机工作原理有了清晰的认识。
先介绍kvm基本结构,如图所示:



Qemu通过Kvm提供的LibKvm应用程序接口,借助ioctl系统调用创建和运行虚拟机。原有的Linux在用户模式和内核模式的基础上,增加了客户模式。虚拟机作为host的一个进程运行。在虚拟机运行下,三种模式分工为:
客户模式:执行非I/O客户代码。虚拟机运行在客户模式下。
内核模式:实现客户模式的切换。处理因为I/O或者其他指令引起的从客户模式的退出。Kvm Driver运行在这种模式。
用户模式:代表客户执行I/O指令,Qemu运行在这种模式。
三种模式之间的切换过程如下图所示:



关于virtio-net,作为guest驱动,关系到如何与host通信,以及借助host联网,可从下图看出:



当数据包到达主机物理网卡后,调用物理网卡的驱动程序,其中利用Linux内核中的软件网桥实现数据转发。在软件网桥这一层,会判断数据包是发往那个设备的,同时调用网桥的发送函数,相对应的端口发送数据包。如果数据包是发往虚拟机的,则通过tap进行转发,tap设备由两部分组成,网络设备和字符设备。网络设备负责接收和发送数据包,字符设备负责将数据包往内核空间和用户空间转发。

已实现功能

按照预定计划,为virtio-net编写ethtool支持,实现selftest,以测试virtio-net网卡的各项功能。到目前为止,已初步完成收发包、功能协商和重置功能测试。

后期工作展望

  1. 针对以往发现的CVE(包括qemu, vhost_net, tun, host kernel network core等其它)的回归测试例。
  2. 能够用ethtool检测到virtio-net设备的故障,例如通过修改QEMU的代码,在设备响应中注入错误,能够在ethtool中捕获到。

0 0