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的架构。

posted @ 2023-07-17 15:15  太极者  阅读(143)  评论(0)    收藏  举报