我想在KVM + Qemu设置中在来宾和主机之间交换“复杂”数据(分层结构)。
我的想法是使用virtio串行驱动程序来实现这一目标。来宾应用程序将使用常规I / O函数(如open(2),close(2),read(2)和write(2))将“buffer”(=我要发送的结构)发送到virtio串行后端。后端驱动程序将在Qemu内部运行,并通过此处描述的in-qemu主机API接收指向结构的指针:http://www.linux-kvm.org/page/Virtio-serial_API
我现在的问题可能相对微不足道,但我一直在寻找谷歌并找不到任何东西:我如何“挂入qemu”以便我可以使用virtio串行主机API?
我知道我必须提供类似void my_init(void) { virtio_serial_port_qdev_register(&myinfo); }
的初始化函数,并使用device_init(&my_init)
将其注册到qemu。但是,我不明白我如何将我的模块与qemu链接?我是否必须将源文件添加到qemu代码库并生成文件并重新编译qemu?或者我可以单独编译它并使用一些神奇的qemu命令行选项来加载它?还是完全不同的东西?
(注意:我知道我可以选择序列化我的数据,将其发送到主机上的套接字,并在那里反序列化,但我想避免序列化开销。如果有办法使用共享内存区域而不是具有开箱即用的virtIO串行设备的套接字,这也是一个选项。
谢谢大家的帮助! 克里斯托弗
答案 0 :(得分:1)
在主机端,可以使用" -chardev"将串行端口连接到管道或插槽。选项。如果指定例如" -chardev socket,path = / tmp / foo.sock,server,nowait,id = foo",则可以使用"将virtio-serial端口连接到该套接字.- device virtserialport,chardev = foo"。您无需修改QEMU(或者我不了解您想要做什么)。
答案 1 :(得分:0)
你可以使用
启动vmqemu-system-x86_64 -m 1024 -name mac -hda~ / Documents / ubuntu -device virtio-serial -chardev socket,path = / tmp / foo,server,nowait,id = foo -device virtconsole,name = jobsfoo,chardev = FOO,名字= org.fedoraproject.console.foo
并使用传输数据 socat / tmp / foo(主持人)
socat / tmp / hvc0(嘉宾)
或者您可以在主机上使用套接字程序,在访客上使用简单文件i / o