承接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根据收到的分辨率信息等修改虚拟机的本地分辨率。