在虛擬機中加入了一個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定義的相關結構體。