qemu_init_main_loop 函数的主要逻辑如下: 首先调用 qemu_signal_init 将一个 fd 与一组信号关联起来,qemu_signal_init 调用 qemu_set_fd_handler 函数将该 signalfd 对应的可读回调函数设置为 sigfd_handler。 qemu_set_fd_handler 在首次调用时会调用 iohandler_init 创建一个全局的 iohandler_ctx 事件源,这...
qemu_opts_foreach(qemu_find_opts("device"), device_init_func) 补充1:qemu中有两个全局的AddressSpace (address_space_memory + address_space_io),他俩分别包含两个root指针,指向两个全局memory region (system_memory + system_io),这两个MR会有alias MR和sub MR,代码中的pc_memory_init()围绕这块展开。
qemu_init_main_loop intqemu_init_main_loop(void) {intret; GSource*src; init_clocks(); ret=qemu_signal_init();if(ret) {returnret; }//malloc a globle fd arraygpollfds= g_array_new(FALSE, FALSE,sizeof(GPollFD));//create a aio contextqemu_aio_context=aio_context_new();//get e...
a) module_call_init(MODULE_INIT_QOM);--设备驱动初始化和注册 type_init(x86_cpu_register_types)(target-i386/cpu.c) b) module_call_init(MODULE_INIT_MACHINE); -- 机器类型注册初始化 machine_init(pc_machine_init) c) socket_init d) qemu_init_cpu_loop e) configure_accelerator--tcg对KVM而言...
http://tux.iar.unlp.edu.ar/~fede/manuales/glib/glib-The-Main-Event-Loop.html TM.4 AIO TM.4.1 aio驱动模型 aio是通过什么驱动运转起来的? qemu存在一个基本的aio实例,qemu_aio_context,我们看下它是如何运行的; 初始化,参考如下代码qemu_init_main_loop() --- qemu_aio_context = aio_context_...
int qemu_init_main_loop(Error **errp) { int ret; GSource *src; init_clocks(qemu_timer_notify_cb); ret = qemu_signal_init(errp); if (ret) { return ret; } qemu_aio_context = aio_context_new(errp); if (!qemu_aio_context) { return -EMFILE; } qemu_set_current_aio_context(qemu...
qemu_init_main_loop函数接着会调用aio_context_new创建一个全局的qemu_aio_context事件源,这个事件源主要用于处理BH和块设备层的同步使用。最后,该函数调用aio_get_g_source和iohandler_get_g_source分别获取qemu_aio_context和iohandler_ctx的GSource,以GSource为参数调用g_source_attach两个AioContext加入到glib...
net_init_tap_one 后端tap设备初始化 (vhost即虚拟机网卡IO数据通过一个内核线程在内核中直接处理而不需要经过qemu) vhost设备初始化--与内核交互,拉起vhost内核线程。 On 32-bit hosts, QEMU is limited by virtual address space 磁盘设备初始化,与磁盘热插流程类似。把设备fd加入main_loop,注册read和write的回...
int qemu_init_main_loop(void) { int ret; GSource *src; init_clocks(); ret = qemu_signal_init(); if (ret) { return ret; } gpollfds = g_array_new(FALSE, FALSE, sizeof(GPollFD)); qemu_aio_context = aio_context_new(); src = aio_get_g_source(qemu_aio_context); g_source...
qemu_tcg_init_vcpu -> qemu_tcg_cpu_thread_fn -> (初始化后,在这里等信号 qemu_cond_wait(first_cpu->halt_cond, &qemu_global_mutex);) tcg_cpu_exec -> cpu_exec -> cpu-exec.c cpu_exec -> cpu_loop_exec_tb 是指令执行的主要流程...