我想在kvm+qemu设置中在来宾和主机之间交换“复杂”数据(层次结构)。
我的想法是使用virtio串行驱动程序。来宾应用程序将使用常规的I/O功能,如打开(2)、关闭(2)、读取(2)和写入(2),将“缓冲区”(=要发送的结构)发送到virtio串行后端。后端驱动程序将在qemu内部运行,并通过这里描述的in-qemu主机api接收指向结构的指针:http://www.linux-kvm.org/page/Virtio-serial_API
我现在的问题可能相对来说很简单,但我在google上到处找了找,什么也找不到:如何“钩住qemu”,以便使用virtio串行主机api?
我知道我必须提供一个类似于void my_init(void) { virtio_serial_port_qdev_register(&myinfo); }
的init函数,并使用device_init(&my_init)
向qemu注册它。但是,我不理解如何将模块与qemu链接?我需要将源文件添加到qemu代码库中,生成文件并重新编译qemu吗?或者我可以单独编译它并使用一些神奇的qemu命令行选项来加载它吗?还是完全不同的?
(注意:我知道我可以选择序列化我的数据,将它发送到主机上的套接字,然后在那里反序列化它,但是我想避免序列化开销。如果有一种方法可以使用共享内存区域,而不是带有现成virtio串行设备的套接字,这也可以是一个选项)。
谢谢大家的帮助!
克里斯托夫
最佳答案
在主机端,可以使用“-chardev”选项将串行端口连接到管道或套接字。如果指定例如“-chardev socket,path=/tmp/foo.sock,server,nowait,id=foo”,则可以使用“-device virtserialport,chardev=foo”将virtio串行端口连接到该套接字。你不需要修改qemu(或者我不明白你想做什么)。