2013-10-10 56 views
2

我想在KVM + Qemu設置中交換客戶和主機之間的「複雜」數據(分層結構)。如何在virtio串行設備中使用in-qemu API

我的想法是使用virtio串行驅動程序來做到這一點。來賓應用程序將使用常規的I/O函數,例如open(2),close(2),read(2)和write(2)將「緩衝區」(=我要發送的結構)發送到virtio串行後端。後端驅動器將裏面的Qemu運行,並通過獲得的指針結構中,QEMU這裏描述主機API:http://www.linux-kvm.org/page/Virtio-serial_API

我現在的問題可能是比較瑣碎,但我環顧四周遍佈谷歌和couldn」 t找到任何東西:如何「掛鉤到qemu」,以便我可以使用virtio串行主機API?

我知道我必須提供一個初始化函數,如void my_init(void) { virtio_serial_port_qdev_register(&myinfo); },並使用device_init(&my_init)將其註冊爲qemu。但是,我不明白我如何將我的模塊與qemu鏈接?我是否必須將我的源文件添加到qemu代碼庫並makefile並重新編譯qemu?或者我可以單獨編譯它並使用一些神奇的qemu命令行選項來加載它?或者完全不同的東西? (注:我知道我可以選擇序列化我的數據,將它發送到主機上的套接字,並在那裏解除序列化,但是我想避免序列化開銷。如果有辦法使用共享內存區域,而不是具有開箱即用的virtIO串行設備的套接字,這也是一種選擇)。

謝謝大家的幫助! Christoph

+2

如果有人遇到同樣的問題:目前爲止我發現的是device_init()機制被type_init()替換。 「類型」,因爲Qemu內部現在使用基於類的機制(對象方向在C中被實現爲一組約定,宏和輔助函數)。另外我認爲其中一個實際上必須將新的設備源添加到Qemu make文件中,而不是動態模塊。這很好。但是,上面的「Virtio-serial_API」信息已經過時:virtio_serial_port_qdev_register()函數不再存在,現在開放問題:我如何註冊新的串行設備? – Christoph

+1

另一個發現:virtio_serial_port_qdev_register()函數不再存在,因爲註冊現在通過Qemu對象模型本地完成(我認爲它被type_register_static()調用所取代)。這在2012年2月3日通過提交5ae1015版本發生在1.1.2版本中。所以看起來,按照我的計劃,只需創建一個類並註冊它,並且該設備應該可用。但是,我仍然留下這個問題,以防有人對此有更多的教育意見。 – Christoph

回答

1

在主機端,可以使用「-chardev」選項將串行端口連接到管道或插座。如果您指定了例如「-chardev套接字,路徑=/tmp/foo.sock,服務器,nowait,id = foo」,則可以使用「-device virtserialport,chardev = foo」將virtio-serial端口連接到該套接字。你不需要修改QEMU(或者我不明白你想要做什麼)。

0

您可以使用

QEMU系統-x86_64的-m 1024 -name MAC -hda〜/文檔/ Ubuntu的-device爲Virtio串行-chardev插座,路徑=/tmp目錄/富,服務器,NOWAIT啓動VM ,ID = FOO -device virtconsole,名字= jobsfoo,chardev = FOO,名字= org.fedoraproject.console.foo

,並通過使用 socat/TMP /富(主機)

socat/TMP傳送數據/ hvc0(guest)

或者你可以在主機和簡單文件上使用套接字程序訪客上的I/O

相關問題