2

我想在 KVM+Qemu 设置中的来宾和主机之间交换“复杂”数据(分层结构)。

我的想法是使用 virtio 串行驱动程序来做到这一点。来宾应用程序将使用正常的 I/O 函数,例如 open(2)、close(2)、read(2) 和 write(2) 将“缓冲区”(=我要发送的结构)发送到 virtio串行后端。后端驱动程序将在 Qemu 内部运行并通过此处描述的 in-qemu 主机 API 接收指向结构的指针:http ://www.linux-kvm.org/page/Virtio-serial_API

我现在的问题可能相对微不足道,但我在 Google 上四处寻找,却一无所获:如何“连接到 qemu”以便可以使用 virtio 串行主机 API?

我知道我必须提供一个 init 函数void my_init(void) { virtio_serial_port_qdev_register(&myinfo); },并使用 .qemu 向 qemu 注册它device_init(&my_init)。但是,我不明白如何将我的模块与 qemu 链接?我是否必须将我的源文件添加到 qemu 代码库和 makefile 并重新编译 qemu?或者我可以单独编译它并使用一些神奇的 qemu 命令行选项来加载它吗?还是完全不同的东西?

(注意:我知道我可以选择序列化我的数据,将其发送到主机上的套接字,然后在那里反序列化,但我想避免序列化开销。如果有办法使用共享内存区域代替带有开箱即用的 virtIO 串行设备的套接字,这也可能是一个选项)。

谢谢大家的帮助!克里斯托夫

4

2 回答 2

0

在主机端,可以使用“-chardev”选项将串行端口连接到管道或套接字。如果您指定例如“-chardev socket,path=/tmp/foo.sock,server,nowait,id=foo”,您可以使用“-device virtserialport,chardev=foo”将 virtio-serial 端口连接到该套接字。你不需要修改 QEMU(或者我不明白你想做什么)。

于 2014-01-28T16:58:27.040 回答
0

你可以使用启动虚拟机

qemu-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,name=org.fedoraproject.console.foo

并使用 socat /tmp/foo (host) 传输数据

socat /tmp/hvc0(访客)

或者您可以在主机上使用套接字程序,在客户机上使用简单的文件 i/o

于 2014-01-30T08:39:02.120 回答