->qemu_init_vcpu(cs); ->qemu_kvm_start_vcpu(cpu);//if (kvm_enabled()) ->qemu_thread_create(cpu->thread, thread_name, qemu_kvm_cpu_thread_fn, cpu, QEMU_THREAD_JOINABLE); ->cpu_reset(cs); 4 qemu_kvm_cpu_thread_fn static void *qemu_kvm_cpu_thread_fn(void *arg) { CPUState ...
外部硬件中断发生在IO线程,发生硬件中断时会经由平台的模拟中断控制器一堆复杂的逻辑以后最终调用如下函数通知vcpu: void mttcg_kick_vcpu_thread(CPUState *cpu) { cpu_exit(cpu); } void cpu_exit(CPUState *cpu) { qatomic_set(&cpu->exit_request, 1); /* Ensure cpu_exec will see the exit reques...
qemu中一个tcg线程可以模拟多个vcpu,也可以多个tcg线程每个对应模拟一个vcpu,后者称为Multi-Threaded TCG (MTTCG),是否为MTTCG由全局变量bool mttcg_enabled决定。对于此处的示例MTTCG是开启状态,不过简单起见这里假设机器只有一个vcpu。 先来看一下TCG的一些重要数据结构: ...
qemu_cpu_kick_thread(first_cpu); qemu_mutex_lock(&qemu_global_mutex); } atomic_dec(&iothread_requesting_mutex); qemu_cond_broadcast(&qemu_io_proceeded_cond); } } 这个函数在vcpu线程里使用: intkvm_cpu_exec(CPUState *) { ... qemu_mutex_unlock_iothread(); run_ret = kvm_vcpu_ioctl(...
* we store some rarely used information in the CPU context. */ uintptr_t mem_io_pc; vaddr mem_io_vaddr; //与kvm相关的变量 int kvm_fd; //kvm在创建CPU时,给每个CPU分配eventfd,该变量用于保存这个文件描述符 bool kvm_vcpu_dirty;
main_impl()//vl.cmachine_class->init()::pc_init1()//pc_piix.cpc_new_cpu()//pc_piix.cx86_cpu_realizefn()//cpu.cqemu_init_vcpu()//cpus.cqemu_hax_start_vcpu()//cpus.cqemu_hax_cpu_thread_fn()//cpus.chax_init_vcpu()//hax-all.chax_vcpu_creat()//hax-all.chax_host_create...
kernel_bootstrap_thread/bsd 中,主要是启动其他的系统维护线程构筑 MacOS 的运行时环境,如初始化 I/O Kit 框架,初始化 BSD 子系统。其间还会根据 DTB 的配置来设置 SMP,唤醒其他 VCPU;其中, I/O Kit 是MacOS XNU 内核为设备驱动程序提供的完整的运行时环境,用户可以基于 I/O Kit 提供的面向对象能力来快速...
QEMU在主机用户态模拟虚拟机的硬件设备,vCPU对硬件的操作结果会在用户态进行模拟,如虚拟机需要将数据写入硬盘,实际结果是将数据写入到了主机中的一个镜像文件中。 三、创建及使用虚拟机 使用qemu-img创建虚拟机镜像,虚拟机镜像用来模拟虚拟机的硬盘,在启动虚拟机之前需要创建镜像文件。
上面是qemu效仿glib 实现的主循环,但主循环存在一些缺陷,比如在主机使用多CPU的情况下伸缩性受到限制,同时主循环使用了qemu全局互斥锁,从而导致vCPU线程和主循环存在锁竞争,导致性能下降。为了解决这个问题,qemu引入了iothread 事件循环,把一些IO操作分配给iothread,从而提高IO性能。
* we don't spend time creating many threads in a loop holding a mutex or * starving the current vcpu. * * If there are no idle threads, ask the main thread to create one, so we * inherit the correct affinity instead of the vcpu affinity. ...