在虚拟机中加入了一个unix socket的virtio serial,Host端数据发送频繁后,Guest端Windows程序读取不能同步,不可能性能这个差吧,有必要了解一下virtio serial在Qemu中是个什么架构。
virtio serial最原始的状况就是下面这个样子:
-chardev socket,id=charchannel0,path=/var/lib/libvirt/qemu/idv.agent,server,nowait
-device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=gk.idv.0
可以看到virtio serial由两个元素构成:chardev,virtserialport。
首先看chardev部分的初始化:
在vl.c中,发现传入的参数中有QEMU_OPTION_chardev,将相关的字符参数转成结构体:QemuOptsList,后面利用这个结构体,调用函数chardev_init_func,初始化一个Chardev。
virtserialport的初始化也是一个类似的流程:
发现有QEMU_OPTION_device, 转成对应的QemuOptsList,通过调用qemu_find_opts("device"),获取这个结构体,通过这个关键词,可以看到初始化device依次调用了这几个函数:default_driver_check,device_help_func,device_init_func。最终会初始化name为virtserialport的TypeInfo定义的相关结构体。