KVM-QEMU vdagent实现机制分析(三)

承接KVM-QEMUvdagent实现机制分析2,在qemuvdagent通过虚拟串口打开字符设备的事件传给spice server之后,spice server的处理是怎么样的呢?还是用图来说明比较形象一点:

KVM-QEMU vdagent实现机制分析(三)_第1张图片

上图中的步骤解释:

1. 当在虚拟机里启动vdagent,qemuspice_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根据收到的分辨率信息等修改虚拟机的本地分辨率。

你可能感兴趣的:(agent)