qemu_set_fd_handler iohandler_init 【2】//分配一个名为iohandler_ctx的AioContext变量(gsource套壳) aio_context_new aio_set_fd_handler 【3】//将signal的fd添加给iohandler_ctx,并设置其sigfd读事件的回调为sigfd_handler,写事件回调为NULL g_source_add_poll //可见底层还是gmainloop机制的API 上面我...
3. aio_ctx_dispatch 调用aio_dispatch,依次执行就绪的bh、fd和timer,完成依次主循环。 qemu会在初始化的过程中通过g_source_new 函数把 aio_source_funcs 注册到AioContext。 Qemu中常用的 AioContext 实例有四个, qemu_aio_context, iohandler->ctx,iothread 中的AioContext,描述磁盘镜像的BlockDriverState 中...
QEMU主线程在qemu_init_main_loop函数里创建了运行在默认上下文的事件源qemu_aio_context,因此这个事件源会被QEMU主线程监听,作为主事件循环。这个主事件循环的上下文包含QEMU中绝大部分服务的fd,比如VNC server和QMP monitor服务端的socket等,QEMU对外暴露的服务,通过这个机制进行处理。具体的事件源创建函数如下: struct...
aio_handlers:一个链表头,其链表中的数据类型为 AioHandler,所有加入到 AioContext 事件源的文件 fd ...
struct AioContext { GSource source; RFifoLock lock; QLIST_HEAD(, AioHandler) aio_handlers; int walking_handlers; uint32_t notify_me; QemuMutex bh_lock; struct QEMUBH *first_bh; int walking_bh; bool notified; EventNotifier notifier; ...
Qemu AIO: structLinuxAioState { AioContext*aio_context;/*在event_notifier_init中初始化,第一个参数是允许的最大的异步IO的个数*/io_context_t ctx;/*这个可以是eventfd或是pipe两种形式。只是对这两种形式的一个简单封装。在event_notifier_init中初始化*/EventNotifier e;/*io queue for submit at batch...
tap_read_poll用于将fd添加到Qemu的AioContext中,用于异步响应,当有数据来临时,捕获事件并进行处理; 以上就是Tap后端的创建过程,下文将针对前端创建了。 4. virtio-net创建 这是一个复杂的流程。 4.1 数据结构 Qemu中用C语言实现了面向对象的模型,用于对设备进行抽象,精妙!
qemu_aio_context和iohandler_ctx是两个比较特殊的自定义的类型为AioContext的事件源,前者主要用于处理QEMU中块设备相关的异步I/O请求通知,后者用于处理QEMU中各类事件通知,这些事件通知包括信号处理的fd、tap设备的fd以及VFIO设备对应的中断通知等。glib中事件源可以添加多个事件fd,对应的AioContext表示为每一个fd在Aio...
tap_read_poll用于将fd添加到Qemu的AioContext中,用于异步响应,当有数据来临时,捕获事件并进行处理; 以上就是Tap后端的创建过程,下文将针对前端创建了。 4. virtio-net创建 这是一个复杂的流程。 4.1 数据结构 Qemu中用C语言实现了面向对象的模型,用于对设备进行抽象,精妙!
AioContext *qemu_get_aio_context(void) { return qemu_aio_context; } void qemu_notify_event(void) { if (!qemu_aio_context) { return; } qemu_bh_schedule(qemu_notify_bh); } static GArray *gpollfds; int qemu_init_main_loop(Error **errp) { int ret; GSource *src; init_clocks(qem...