QEMU的线程模型利用了gmainloop机制,不过仔细阅读主进程这部分代码时会发现qemu并非原封不动使用,qemu也定义了自己的事件源AioContext(本质是GSource的拓展版,看结构体定义是GSource套壳),基于AioContext定义了两个事件源qemu_aio_context和iohandler_ctx。iohandler_ctx用来监听各种事件,qemu_aio_context用来监听块设备的...
aio_handlers:一个链表头,其链表中的数据类型为 AioHandler,所有加入到 AioContext 事件源的文件 fd ...
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_init_main_loop() --- qemu_aio_context = aio_context_new(errp); -> ctx = (AioContext *) g_source_new(&aio_source_funcs, sizeof(AioContext)); ... src = aio_get_g_source(qemu_aio_context); g_source_set_name(src, "aio-context"); g_source_attach(src, NULL); --- qemu...
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...
AioContext结构体是QEMU定制的事件源,实际上它是把GLIB主事件循环的事件源结构体封装在了其第一个字段: source: glib主事件循环的事件源结构体,一个glib主事件循环可以挂接多个事件源,每个事件源都有其对应的处理函数。 aio_handlers:IO处理事件链表,链表的每个成员代代表了一个IO事件,里面集成了要探测的文件描述符...
qemu_aio_context和iohandler_ctx是两个比较特殊的自定义的类型为AioContext的事件源,前者主要用于处理QEMU中块设备相关的异步I/O请求通知,后者用于处理QEMU中各类事件通知,这些事件通知包括信号处理的fd、tap设备的fd以及VFIO设备对应的中断通知等。glib中事件源可以添加多个事件fd,对应的AioContext表示为每一个fd在Aio...
Qemu有2个主处理事件qemu_aio_context和iohandler_ctx 当文件描述符准备就绪、计时器到期、BH被调度时,事件循环将调用响应事件的回调。 我打断点qemu_bh_new进行了捕获,然后能看到qemu_bh_new的初始化cb函数为arm_timer_tick。于是为其也打断点。但是缺少了设置事件呢!然后看了下代码,于是在event_notifier_set函数...
tap_read_poll用于将fd添加到Qemu的AioContext中,用于异步响应,当有数据来临时,捕获事件并进行处理; 以上就是Tap后端的创建过程,下文将针对前端创建了。 4. virtio-net创建 这是一个复杂的流程。 4.1 数据结构 Qemu中用C语言实现了面向对象的模型,用于对设备进行抽象,精妙!
tap_read_poll用于将fd添加到Qemu的AioContext中,用于异步响应,当有数据来临时,捕获事件并进行处理; 以上就是Tap后端的创建过程,下文将针对前端创建了。 4. virtio-net创建 这是一个复杂的流程。 4.1 数据结构 Qemu中用C语言实现了面向对象的模型,用于对设备进行抽象,精妙!