承接KVM-QEMUvdagent實現機制分析(2),在qemu將vdagent通過虛擬串口打開字符設備的事件傳給spice server之後,spice server的處理是怎麼樣的呢?還是用圖來說明比較形象一點:
上圖中的步驟解釋:
1. 當在虛擬機裏啓動vdagent,qemu的spice_chr_guest_open被觸發,調用spice server 的spice_server_add_interface方法添加vdagent這個字符設備;
2. spice_server_add_interface 調用 attach_to_red_agent,在attach_to_red_agent
裏首先一系列的char dev回調函數被設置,用來在接下來的消息交互中被調用;
3. 然後,attach_to_red_agent調用reds_update_mouse_mode,邏輯是如果原來鼠標模式是SPICE_MOUSE_MODE_CLIENT的話,如果因爲vdagent關閉而且沒有定義tablet就需要修改將鼠標模式改爲SPICE_MOUSE_MODE_SERVER。這個以spiceserver發送RED_WORKER_MESSAGE_SET_MOUSE_MODE 這個消息給spice client的方式來實現;
4. 接下來,attach_to_red_agent又調用main_channel_push_agent_connected方法以發送SPICE_MSG_MAIN_AGENT_CONNECTED這個消息的形式通知spiceclient vdagent已經啓動並連接的消息;
5. Spice client收到SPICE_MSG_MAIN_AGENT_CONNECTED消息以後,調用handle_agent_connected(red_client.cpp裏面)這個方法進行處理:發送REDC_MAIN_AGENT_START消息給spiceserver作爲獲知vdagent已經啓動的應答;調用send_agent_announce_capabilities
發送 VD_AGENT_ANNOUNCE_CAPABILITIES給spice server 自己的capabilities;調用send_agent_monitors_config
發送VD_AGENT_MONITORS_CONFIG給spice server通知自身的監視器分辨率信息等;
6. Spice server 再將上述消息轉給qemu,然後qemu通過上一篇文章介紹的與虛擬機vdagent通信的數據輸出隊列發送給vdagent;
7. 最後 vdagent根據收到的分辨率信息等修改虛擬機的本地分辨率。