Qemu中重要流程整理
以下流程都以TCG为主,不考虑其他加速器的场景 OPS创建流程:由于其只是接口,因此并不创建对象,仅仅是从hash中获取到类 main -> qmp_x_exit_preconfig -> qemu_init_board -> machine_run_board_init -> accel_init_interfaces -> accel_init_ops_interfaces -> # 当前语句是在函数accel_init_interfaces中的ifndef的预编译语句中,其中会根据AccelClass来生成Ops的类名(accel的类名称后面加上 -ops) object_class_get_name # 根据accel的名称获取到ops的名称 ACCEL_OPS_CLASS(module_object_class_by_name(ops_name)) # 根据accel名称在hash中找到ops的类 ops->ops_init # 其中会对ops->create_vcpu_thread进行赋值 CPU对象创建流程,一般都是在machine_class->init函数中:这里以connex板子为例进行说明,其他machine类型都类似 main qemu_init -> qemu_x_exit_preconfig -> qemu_init_board -> machine_run_board_init -> machine_class->init(machine) # machine的init函数指针,一般是在类的class_init函数中进行赋值的,而class_init函数是在type_initialize中被调用 connex_init -> # 这里的connex_init即为上行的init函数指针调用。 pxa255_init -> ARM_CPU(cpu_create(ARM_CPU_TYPE_NAME("pxa255"))) -> object_new # 根据CPU的类型名称,生成cpu对象,并在其中调用了instance_init qdev_realize # 其中会调用cpu对象的realize函数接口,其中的调用很隐秘,是根据属性调用的 CPU对象的realize函数指针赋值过程,CPU类型的继承关系 TYPE_OBJECT | TYPE_DEVICE | TYPE_CPU | TYPE_ARM_CPU | ... # 以TYPE_ARM_CPU类型为父类的类型很多,比如上面的connex arm_cpu_class_init -> # TYPE_ARM_CPU的类初始化函数 device_class_set_parent_realize(dc, arm_cpu_realizefn, &acc->parent_realize); # 这里的arm_cpu_realizenfn会在CPU创建流程中的qdev_realize中被调用 create_vcpu_thread调用流程:以arm为例 创建CPU时,会通过qdev_realize调用到 arm_cpu_realizefn -> qemu_init_vcpu -> cpus_accel->create_vcpu_thread # create_vcpu_thread的赋值的地方,在OPS创建流程中有详细说明 # 此函数当中会创建vcpu线程,对于模拟飞i386平台,需要详细了解tcg线程流程 # 仿真新硬件平台的核心:大致流程为 加载image -> 反汇编(不通平台的反汇编在qemu中都有单独的目录targer/arm/tcg) -> 将汇编代码转为IR(使用C模拟arm汇编指令的执行)
要理解上面的内容,先需要了解QOM的架构。
                    
                
                
            
        
浙公网安备 33010602011771号