我想在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
如果有人遇到同樣的問題:目前爲止我發現的是device_init()機制被type_init()替換。 「類型」,因爲Qemu內部現在使用基於類的機制(對象方向在C中被實現爲一組約定,宏和輔助函數)。另外我認爲其中一個實際上必須將新的設備源添加到Qemu make文件中,而不是動態模塊。這很好。但是,上面的「Virtio-serial_API」信息已經過時:virtio_serial_port_qdev_register()函數不再存在,現在開放問題:我如何註冊新的串行設備? – Christoph
另一個發現:virtio_serial_port_qdev_register()函數不再存在,因爲註冊現在通過Qemu對象模型本地完成(我認爲它被type_register_static()調用所取代)。這在2012年2月3日通過提交5ae1015版本發生在1.1.2版本中。所以看起來,按照我的計劃,只需創建一個類並註冊它,並且該設備應該可用。但是,我仍然留下這個問題,以防有人對此有更多的教育意見。 – Christoph