spice server qxl worker 及memslot

本文详细介绍了QXL设备中内存槽(MemSlot)结构的作用及其在物理地址转换为虚拟地址过程中的应用。同时,深入探讨了相关函数如red_process_commands()、red_push()等的功能与调用流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.

结构memslot

typedef struct MemSlot {
    int generation;                                            // 生成个数??
    unsigned long virt_start_addr;                             //虚地址开始 
    unsigned long virt_end_addr;                               //虚地址结束
    long address_delta;                                        // 地址偏移
} MemSlot;

暂且称为内存槽结构,在后面物理地址变为虚拟地址的过程中,该结构起了很大的作用。

2.

typedef struct RedMemSlotInfo {
    MemSlot **mem_slots;                                       // 元素为memslot的二维数组
    uint32_t num_memslots_groups;                              //一维个数  
    uint32_t num_memslots;                                     //二维个数
    uint8_t mem_slot_bits;                                     // 表示memslot的位
    uint8_t generation_bits;                                   // 表示生成的位
    uint8_t memslot_id_shift;                                  // id移动
    uint8_t memslot_gen_shift;                                 // gen移动
    uint8_t internal_groupslot_id;                             // 插入组id
    unsigned long memslot_gen_mask;                           //gen掩码
    unsigned long memslot_clean_virt_mask;                     //清楚虚拟掩码
} RedMemSlotInfo;

RedMemSlotInfo 结构在获取命令的虚拟地址用到


3.red_process_commands() 函数

   主要功能:1)调用get_command函数从全局命令树中获取一个命令,如果获取不到,那么调用req_cmd_notification函数重新往命令树中添加命令

                       2)如果获取到了,那么判断获取的命令是什么类型的

                       3)如果是QXL_CMD_DRAW类型的,定义一个新的RedDrawable结构,并为它申请内存

                       4)通过命令ext_cmd 的参数信息获取命令的实际内容

                       5)

                          

4.red_push()函数

   主要功能:1)

 

5.qxl interface   函数调用及功能

   (1)get_init_info 在red_dispatcher_init函数调用的  在创建通道之前调用

               主要功能:就是利用这个函数获取memslot的初始化信息放到QXLDevInitInfo  这个结构体成员info中

   (2) attache_worker   在red_dispatcher_init函数调用的 创建通道之后调用

               主要功能:是 把qxl worker注册到qxl instance中,然后在red_worker中添加add_memslot ,并且在red_worker中建立主显示表面,并调用start函数

   (3)get_command  在red_worker_main中的red_process_commands函数中调用

              主要功能:是从全局命令树commands中获取一个命令

   (4)req_cmd_notification 在red_process_commands函数中调用

             主要功能:生成新的命令,往全局命令树中添加命令

6.qxl worker 函数调用的地方及它们的功能(这些函数都是在red_dispatcher_init中初始化的)

   (1) create_primary_surface(对应handle_dev_create_primary_surface_async函数) 

                调用位置:在qxl interface中的 attach_worker函数中调用

                                    在产生命令的函数produce_command中调用 

                主要功能:是在red_worker中创建主显示表面

                                    (主表面是什么东西呢,还有后面要建立的从表面,这些都是什么啊,主表面就是屏幕上可以看到的显示记忆体,图像画在上面就可以显示在屏幕上,还有后备表面,这是和主表面做显示切换的表面,离屏表面是屏幕上看不见的表面它用来存放图像数据。 用另一句话说就是:一般设立一个主表面、后备表面和若干个离屏表面,主表面就是用户看到的显示图像的表面,也就是当前显示的表面,后备表面是主表面的附带缓冲表面,用来存储、处理即将显示的图像,离屏表面用来装载最初的图像数据,)

   (2)add_memslot 也是在qxl interface中的 attach_worker函数中调用

               主要功能:是在red_worker中添加memslot

   (3)del_memslot

               主要功能:

   (4)start 也是在qxl interface中的 attach_worker函数中调用

               主要功能:是判断是否处于迁移的状态,设置red_worker中的参数runing为true 使red_worker的工作标志位为真

   (5) wakeup在do_wakeup函数中调用的,do_wakeup是test中wakeup_timer定时器的执行函数  ( 对应red_worker_main的handle_dev_wakeup函数)

              主要功能:清楚worker->pending的某一位 ,并且对wakeup_counter计数器加1

   (6)oom函数  未调用

              主要功能:

   (7)stop         未调用  (对应red_worker_main的 handle_dev_stop函数)

              主要功能:把worker->runing置为true,  还有许多其他工作  待更新,,,,,,

   (8)destroy_surface

              主要功能:

   (9)destory_primary_surface

              主要功能:

   (10)create_primary_surface

              主要功能:

   (11)update_area

              主要功能:

   (12)reset_image_cache

               主要功能:

   (13)reset_cursor

                主要功能:

   (14)destory_surface_wait

                主要功能:

   (15)loadvm_commands

               主要功能:

  

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值