xen-trap

news2024/11/18 15:42:36

Xen-Trap

xen的虚拟化实现有一个很重要的机制就是tarp,中文可以暂且叫做陷入。在ARMv8中,trap就是异常等级的一个切换。

当发生trap的时候,就会进入设定好的异常向量表中,硬件自动判断属于哪种类型的异常。
在这里插入图片描述

一、异常处理

ARM v8有4个异常级别,每一个异常级别对应一个 VBAR(Vector Base Address Register) 寄存器,用来指向异常向量表的基地址,每一个异常向量表的大小为128个字节,也即可以存放32条指令(ARM v8指令集里一条指令的位宽是32bit的,而不是64bit);同时每一个异常向量表会分为4组,每一组包含4 种异常,如图所示:

在这里插入图片描述

这里的图对应上面的hyp_traps_vector

整理了一下,xen对于发生的异常,最后会调用如下函数进行处理:

functionaction
do_trap_hyp_syncbrk指令处理、当前异常等级产生的数据abort(用于由数据访问产生的 MMU 故障、由堆栈指针未对齐引起的对齐故障以及同步外部中止,包括同步奇偶校验或 ECC 错误)、当前异常等级产生的指令abort(用于指令访问和同步外部中止生成的 MMU 故障)
do_trap_hyp_serror在EL2,发生了Serror是不安全的,直接输出panic信息
do_trap_guest_syncWFI/WFE指令、cp15/cp14/cp10协处理访问、SVE相关指令、SMC指令、HVC指令、访问系统寄存器、从低异常等级产生的数据&指令abort
do_trap_guest_serror通过置位HCR_EL2的VSE(bit 8)来产生Virtual SError interrupt,由EL1的异常向量表做进一步处理
do_trap_irq处理中断

二、trap处理的事情(挑重点)

1. guest os的同步异常 — do_trap_guest_sync(关注点)

①SMC调用

functionaction
do_trap_smc:处理来自EL1的SMC指令(由于xen修改了dom的dts,所以os的开核方式不是使用smc)
monitor_smc
vsmccc_handle_call(handle SMC/HVC call according to ARM SMCCC)handle_existing_apis —> do_vpsci_0_1_call
handle_sssc —> do_vpsci_0_2_call

②HVC调用

functionaction
do_trap_hvc_smccc:执行vsmccc_handle_call(handle SMC/HVC call according to ARM SMCCC),xen修改了dts,让每个dom的psci开核方法为hvc:method = “hvc”;
handle_existing_apisdo_vpsci_0_1_call
handle_arch
handle_hypervisor
handle_ssscdo_vpsci_0_2_call:PSCI_0_2_FN64_CPU_ON
platform_smc
do_trap_hypercall:
do_memory_opXENMEM_increase_reservation对应balloon的放气,增加guest的内存
XENMEM_decrease_reservation对应balloon的吹气,减少guest的内存
XENMEM_populate_physmap,给page分配mfn
XENMEM_exchange,内存交换
XENMEM_maximum_ram_page,获取最大的页数
XENMEM_current_reservation,获取当前预留内存总页数
XENMEM_maximum_reservation,获取预留内存最大总页数
XENMEM_maximum_gpfn,获取最大guest pfn数
XENMEM_add_to_physmap,增加页面映射
XENMEM_add_to_physmap_batch,增加页面映射,不支持iommu?
XENMEM_remove_from_physmap,删除页面映射
XENMEM_access_op,内存访问权限设置&获取
XENMEM_claim_pages,检查页的权限等信息
XENMEM_get_vnumainfo,获取vNUMA的拓扑信息
XENMEM_reserved_device_memory_map,获取外设预留的内存情况?看代码arm并没有实现相关的函数
XENMEM_acquire_resource,获取内存资源情况
do_domctlXEN_DOMCTL_setvcpucontext,设置vcpu的上下文
XEN_DOMCTL_pausedomain,暂停domain,调用domain_pause
XEN_DOMCTL_unpausedomain,取消暂停domain,调用domain_unpause
XEN_DOMCTL_resumedomain,恢复domain,也会调用domain_pause和domain_unpause,涉及vcpu的操作
XEN_DOMCTL_createdomain,创建domain
XEN_DOMCTL_max_vcpus,设置vcpu数量为max_vcpus
XEN_DOMCTL_soft_reset,domain软复位
XEN_DOMCTL_destroydomain,销毁domain
XEN_DOMCTL_setnodeaffinity,设置与guest具有亲和力的 NUMA 节点
XEN_DOMCTL_getnodeaffinity,获取与guest具有亲和力的 NUMA 节点
XEN_DOMCTL_setvcpuaffinity,设置vpu的亲和度
XEN_DOMCTL_getvcpuaffinity,获取vcpu的亲和度
XEN_DOMCTL_scheduler_op,调整domain的调度参数
XEN_DOMCTL_getdomaininfo,获取domain的相关信息
XEN_DOMCTL_getvcpucontext,获取vcpu的上下文信息
XEN_DOMCTL_getvcpuinfo,获取vcpu的信息
XEN_DOMCTL_max_mem,设置max_pages最大内存数
XEN_DOMCTL_setdomainhandle,设置domain操作句柄
XEN_DOMCTL_setdebugging,设置debugger_attached标志位,判断guest是否被dom0调试中
XEN_DOMCTL_irq_permission,设置domain对于给定irq的访问权限
XEN_DOMCTL_iomem_permission,设置domain对应给定io内存的访问权限
XEN_DOMCTL_memory_mapping,映射memory
XEN_DOMCTL_settimeoffset,设置domain的timeoffset(CNTVOFF_EL2?)
XEN_DOMCTL_set_target,设置该guest对给定guest的特权
XEN_DOMCTL_subscribe,设置suspend_evtchn
XEN_DOMCTL_set_access_required,设置p2m表的访问权限
XEN_DOMCTL_set_virq_handler,设置虚拟中断的中断服务函数
XEN_DOMCTL_setvnumainfo,设置vNUMA的拓扑信息
XEN_DOMCTL_monitor_op,启用/禁用监视各种 VM 事件
do_sched_op调度相关的操作(yeiled、shutdown等操作),这里不一一列举了,直接看代码
do_console_ioCONSOLEIO_write,guest对于console的写操作
CONSOLEIO_read,guest对于console的读操作
do_xen_version获取xen版本
do_xsm_opxen的Xen Security Modules(安全模块)相关操作,是个钩子
do_event_channel_opxen事件通道的相关操作
do_physdev_op这是是对于一些物理外设的具体操作,目前只实现了pci_physdev_op:pci_device_add、pci_device_remove
do_sysctlXEN_SYSCTL_readconsole,读取console
XEN_SYSCTL_tbuf_op,trace buffers上的 sysctl 操作
XEN_SYSCTL_sched_id,获取当前调度程序的 ID
XEN_SYSCTL_getdomaininfolist,获取所有domain的信息
XEN_SYSCTL_debug_keys,设置debug_key,模拟在xen按下按键,产生对应的调试信息
XEN_SYSCTL_getcpuinfo,获取cpu信息
XEN_SYSCTL_availheap,获取可用的heap内存信息
XEN_SYSCTL_page_offline_op,设置page的状态,online或者offline
XEN_SYSCTL_cpupool_op,做 cpupool 相关的 sysctl 操作
XEN_SYSCTL_scheduler_op,调度相关的sysctl操作
XEN_SYSCTL_physinfo,获取当前的一些物理信息:cpu数量、内存node数量、总页数等等
XEN_SYSCTL_numainfo,获取numa的相关信息
XEN_SYSCTL_cputopoinfo,获取xen_sysctl_cputopo结构体信息
XEN_SYSCTL_coverage_op,@TODO,没看懂
XEN_SYSCTL_livepatch_op,@TODO,没看懂
XEN_SYSCTL_overlay,在给定的设备树目标节点做add或者remove节点操作
do_hvm_opHVMOP_set_param,设置xen_hvm_param结构体参数
HVMOP_get_param,获取xen_hvm_param结构体参数
do_grant_table_op (Xen通过提供grant_table_op一系列hypercall以供DomU使用来实现内存共享)GNTTABOP_map_grant_ref,映射一个gref
GNTTABOP_unmap_grant_ref,取消gref的映射
GNTTABOP_unmap_and_replace,撤销对gref的映射,并替换为其他的映射
GNTTABOP_setup_table,建立grant table
GNTTABOP_transfer,移交一个页
GNTTABOP_copy,拷贝一些页/gref对应的页
GNTTABOP_query_size,查询grant table的当前/最大大小
GNTTABOP_set_version,设置grant table的版本
GNTTABOP_get_status_frames,获取用于存储dom授权状态的帧列表
GNTTABOP_get_version,获取grant table的版本
GNTTABOP_swap_grant_ref,交换gref
GNTTABOP_cache_flush,刷cache(gref对应的mfn)
do_multicall调用arch_do_multicall_call来执行多次hypcall
do_platform_op目前只实现了XENPF_settime64,设置墙上时钟(wall clock)
do_vcpu_opVCPUOP_initialise,初始化vcpu
VCPUOP_up,上线vcpu
VCPUOP_down,下线vpcu
VCPUOP_is_up,判断vpcu是否上线
VCPUOP_get_runstate_info,获取vcpu的运行状态信息
VCPUOP_set_periodic_timer,设置周期定时器
VCPUOP_stop_periodic_timer,停止周期定时器
VCPUOP_set_singleshot_timer,设置单次定时器
VCPUOP_stop_singleshot_timer,停止单次定时器
VCPUOP_register_vcpu_info,在客户地址空间中为vcpu_info结构注册一个内存位置
VCPUOP_register_runstate_memory_area,注册一个共享内存区域

③访问系统寄存器

functionaction
do_sysregHSR_SYSREG_ACTLR_EL1:EL1阶段访问ACTLR_EL1寄存器
HSR_SYSREG_DCISW:EL1阶段访问DCISW、DCCSW、DCCISW寄存器(三个都是和cache相关的)
EL1阶段访问SCTLR_EL1、TTBR0_EL1、TTBR1_EL1、TCR_EL1、ESR_EL1、FAR_EL1、AFSR0_EL1、AFSR1_EL1、MAIR_EL1、AMAIR_EL1、CONTEXTIDR_EL1寄存器
HSR_SYSREG_MDRAR_EL1:EL1阶段访问MDRAR_EL1寄存器:Monitor Debug ROM Address Register
HSR_SYSREG_OSLAR_EL1:EL1阶段访问OSLAR_EL1寄存器:OS Lock Access Register
HSR_SYSREG_OSDLR_EL1:EL1阶段访问OSDLR_EL1寄存器:OS Double Lock Register
HSR_SYSREG_OSLSR_EL1:EL1阶段访问OSLSR_EL1寄存器:OS Lock Status Register
HSR_SYSREG_MDSCR_EL1:EL1阶段访问MDSCR_EL1寄存器:Monitor Debug System Control Register
HSR_SYSREG_MDCCSR_EL0:EL0阶段访问MDCCSR_EL0寄存器:Monitor DCC Status Register
下面是关于性能监视器相关的寄存器:
HSR_SYSREG_PMINTENSET_EL1:EL1阶段访问PMINTENSET_EL1寄存器:Performance Monitors Interrupt Enable Set register
HSR_SYSREG_PMINTENCLR_EL1:EL1阶段访问PMINTENCLR_EL1寄存器:Performance Monitors Interrupt Enable Clear register
HSR_SYSREG_PMUSERENR_EL0:EL0阶段访问PMUSERENR_EL0寄存器:Performance Monitors User Enable Register
HSR_SYSREG_PMCR_EL0:EL0阶段访问PMCR_EL0寄存器:Performance Monitors Control Register
HSR_SYSREG_PMCNTENSET_EL0:EL0阶段访问PMCNTENSET_EL0寄存器:Performance Monitors Count Enable Set register
HSR_SYSREG_PMCNTENCLR_EL0:EL0阶段访问PMCNTENCLR_EL0寄存器:Performance Monitors Count Enable Clear register
HSR_SYSREG_PMOVSCLR_EL0:EL0阶段访问PMOVSCLR_EL0寄存器:Performance Monitors Overflow Flag Status Clear Register
HSR_SYSREG_PMSWINC_EL0:EL0阶段访问PMSWINC_EL0寄存器:Performance Monitors Software Increment register
HSR_SYSREG_PMSELR_EL0:EL0阶段访问PMSELR_EL0寄存器:Performance Monitors Event Counter Selection Register
HSR_SYSREG_PMCEID0_EL0:EL0阶段访问PMCEID0_EL0寄存器:Performance Monitors Common Event Identification register 0
HSR_SYSREG_PMCEID1_EL0:EL0阶段访问PMCEID1_EL0寄存器:Performance Monitors Common Event Identification register 1
HSR_SYSREG_PMCCNTR_EL0:EL0阶段访问PMCCNTR_EL0寄存器:Performance Monitors Cycle Count Register
HSR_SYSREG_PMXEVTYPER_EL0:EL0阶段访问PMXEVTYPER_EL0寄存器:Performance Monitors Selected Event Type Register
HSR_SYSREG_PMXEVCNTR_EL0:EL0阶段访问PMXEVCNTR_EL0寄存器:Performance Monitors Selected Event Count Register
HSR_SYSREG_PMOVSSET_EL0:EL0阶段访问PMOVSSET_EL0寄存器:Performance Monitors Overflow Flag Status Set register
下面是和定时器相关的寄存器:
HSR_SYSREG_CNTP_CTL_EL0:EL0阶段访问CNTP_CTL_EL0寄存器:Counter-timer Physical Timer Control register
HSR_SYSREG_CNTP_TVAL_EL0:EL0阶段访问CNTP_TVAL_EL0寄存器:Counter-timer Physical Timer TimerValue register
HSR_SYSREG_CNTP_CVAL_EL0:EL0阶段访问CNTP_CVAL_EL0寄存器:Counter-timer Physical Timer CompareValue register
下面是和GIC中断控制器相关的寄存器:
HSR_SYSREG_ICC_SGI1R_EL1:EL1阶段访问ICC_SGI1R_EL1寄存器:Interrupt Controller Software Generated Interrupt Group 1 Register Generates Group 1 SGIs for the current Security state
HSR_SYSREG_ICC_ASGI1R_EL1:EL1阶段访问ICC_ASGI1R_EL1寄存器:Interrupt Controller Alias Software Generated Interrupt Group 1 Generates Group 1 SGIs for the Security state that is not the current Security state
HSR_SYSREG_ICC_SGI0R_EL1:EL1阶段访问ICC_SGI0R_EL1寄存器:Interrupt Controller Software Generated Interrupt Group 0 Register Generates Secure Group 0 SGIs
HSR_SYSREG_ICC_SRE_EL1:EL1阶段访问ICC_SRE_EL1寄存器:Interrupt Controller System Register Enable register (EL1)
下面是guest os用来识别处理器功能的大多数Identification寄存器:
ID_PFR0_EL1 ~ ID_PFR2_EL1:AArch32 Processor Feature Register 0、1、2
ID_DFR0_EL1、ID_DFR1_EL1:AArch32 Debug Feature Register 0、1
ID_AFR0_EL1:AArch32 Auxiliary Feature Register 0
ID_MMFR0_EL1 ~ ID_MMFR5_EL1:AArch32 Memory Model Feature Register 0、1、2、3、4、5
ID_ISAR0_EL1 ~ ID_ISAR6_EL1:AArch32 Instruction Set Attribute Register 0、1、2、3、4、5、6
MVFR0_EL1 ~ MVFR2_EL1: AArch32 Media and VFP Feature Register 0、1、2
ID_AA64PFR0_EL1、ID_AA64PFR1_EL1:AArch64 Processor Feature Register 0、1
ID_AA64DFR0_EL1、ID_AA64DFR1_EL1:AArch64 Debug Feature Register 0、1
ID_AA64ISAR0_EL1、ID_AA64ISAR1_EL1:AArch64 Instruction Set Attribute Register 0、1
ID_AA64MMFR0_EL1 ~ ID_AA64MMFR2_EL1:AArch64 Memory Model Feature Register 0、1、2
ID_AA64AFR0_EL1、ID_AA64AFR1_EL1:AArch64 Auxiliary Feature Register 0
ID_AA64ZFR0_EL1:AArch64 SVE Feature ID register 0
EL1访问 group 3 ID registers:

在这里插入图片描述

④低异常等级产生的数据&指令abort

functionaction
do_trap_stage2_abort_guest(数据&指令abort都是调用这个函数)FSC_FLT_PERM:0b0011xx:L1/L2/L3页表访问权限错误
p2m_mem_access_check,这里会去配置页表项,设置权限位
FSC_FLT_TRANS:0b0001xx:L0/L1/L2/L3页表翻译错误,IPA —> PA的页表没有正确配置(VA —> IPA的翻译已经在guest os的EL1处理了)
check_p2m —> p2m_resolve_translation_faul或者try_map_mmio
try_decode_instruction —> 指令abort
try_handle_mmio(IO trap or Device emulation,解决多个guest os访问一个外设的情况)

2. hypervisor同步异常 — do_trap_hyp_sync

functionaction
do_trap_hyp_syncHSR_EC_BRK:断点指令异常,调试用
HSR_EC_DATA_ABORT_CURR_EL:同异常等级产生的数据abort:dump_hyp_walk。xen的页表错误
HSR_EC_INSTR_ABORT_CURR_EL:同异常等级产生的指令abort:dump_hyp_walk

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1018164.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

天然气跟踪监管系统信息更新

天然气跟踪监管系统信息更新 ① 新增仓库,第一步,“编辑仓库”对话框新增栏第二步,提交jQuery序列化新增仓库的form表单第三步,新增仓库成功第一步,创建编辑对象第二步,获取仓库修改后的几何图形及面积数据…

学习计算机网络中的一些疑问及解答

文章目录 前言一、为什么要进行三次握手二、三次握手的流程三、三次握手中seq和ack的值四、四次挥手流程五、四次挥手中seq和ack的值六、为什么要等待才回复七、为什么等待2MSL总结 前言 一个本硕双非的小菜鸡,备战24年秋招,在学习计算机网络的过程中遇…

CLR via C#(三)垃圾回收

一、资源生命周期 每个程序运行都需要各种资源,如文件、内存缓冲区、数据库等。要使用这些资源,就必须为代表资源的类型分配内存。访问一个资源所需的步骤如下: 调用IL指令newobj,为代表资源的类型分配内存(在C#中一…

NSS [HNCTF 2022 WEEK2]ohmywordpress(CVE-2022-0760)

NSS [HNCTF 2022 WEEK2]ohmywordpress(CVE-2022-0760) 题目描述:flag在数据库里面。 开题: 顺着按钮一直点下去会发现出现一个按钮叫安装WordPress 安装完之后的界面,有一个搜索框。 F12看看network。 又出现了这个…

在 Android 设备或仿真器上进行测试

🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 Windows Defender 概述 如何将排除项添加到 Windows Defender Android 开发时要考虑的排除项 本指南介绍如何在 W…

JavaScript逆向循环和嵌套循环

逆向循环 ● 我们还是使用以下这个数组进行演示 const ITshareArray ["张三","二愣子",2033 - 1997,"程序员",["李四", "王五", "牛二"], ];● 现在我们还是想循环的列出数组的值,但是我们倒着来&a…

l14 IO模型

一、基本概念 I/O即数据的读取&#xff08;接收&#xff09;或写入&#xff08;发送&#xff09;操作 通常用户进程中的一个完整I/O分为两个阶段 1.用户进程空间<-->内核空间 2.内核空间<-->设备空间&#xff08;磁盘、网卡等&#xff09; I/O分为内存I/O、网络…

Bash脚本学习 - 条件句、数组、for循环,函数

1. 条件测试 [ 和 ] 是一个用于执行条件测试的命令。它们必须用空格分隔开&#xff0c;并且在 [ 后面和 ] 前面必须有空格。-eq 是一个比较运算符&#xff0c;表示等于&#xff08;equal&#xff09;。它用于比较两个值是否相等。 2. 条件句 在 ifelseifelse.sh 文件中&#…

Acwing 827. 双链表

Acwing 827. 双链表 题目要求思路讲解初始化在第k个点右边插入&#xff1a;如果想在k的左边插入x&#xff0c;只要这样调用就可以了&#xff1a;删除怎么做&#xff1a; 代码展示 题目要求 思路讲解 初始化 在第k个点右边插入&#xff1a; 如果想在k的左边插入x&#xff0c;只…

【算法训练-二叉树 一】【遍历二叉树】前序遍历、中序遍历、后续遍历、层序遍历、锯齿形层序遍历、二叉树右视图

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【二叉树的遍历】&#xff0c;使用【二叉树】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为…

如何实现一个IO口读取多个设备信息

前言 &#xff08;1&#xff09;今天遇到一个有意思的问题一个IO口如何读取多个电机的堵转问题。之后他就发了一张图片 &#xff08;2&#xff09;看到这个问题&#xff0c;之前先说一个简单的。我们如何实现一个IO读取多个按键&#xff0c;了解了这个之后&#xff0c;对于多个…

Python 变量

视频版教程 Python3零基础7天入门实战视频教程 变量 无论使用什么语言编程&#xff0c;总要处理数据&#xff0c;处理数据就需要使用变量来保存数据。变量就像一个个小容器&#xff0c;用于“盛装”程序中的数据。 再说说&#xff0c;Python的数据类型&#xff0c;有以下六种…

Prometheus+Grafana 基础监控告警体系搭建(一):服务的基本安装

文章目录 1. prometheus 安装1.1. 下载安装包1.2. 基本设置1.3. 解压安装包1.4. 配置 service 启动文件1.5. 启动服务 2. Grafana 安装2.1. 下载安装包2.2. 安装2.3. 启动服务 3. 总结一下 打算重新练下手&#xff0c;免得忘记了&#xff0c;这次内网进行了全面部署演示&#x…

编程任务|随机摆放的刀叉开始认识数学思维

任务源自旧版的Brilliant数学讨论问题。2019-09-02我曾经发布过&#xff0c;可惜已经下线&#xff0c;幸活大喵做足备份。 该问题看似是概率问题&#xff0c;实则不然。 官方给出的解法透露出一个非常重要的数学思维方法&#xff1a; 数学语言 —— 为何以及如何构造一个函数 f…

计算机丢失msvcr110.dll解决办法,多种msvcr110.dll解决方法分享

随着 Windows 操作系统的发展&#xff0c;越来越多的用户在使用电脑时遇到了计算机丢失 msvcr110.dll 的问题。msvcr110.dll 是 Windows 操作系统中的一个动态链接库文件&#xff0c;它包含了许多常用的 C 运行库函数。因此&#xff0c;当计算机丢失 msvcr110.dll 时&#xff0…

Kotlin File useLines nameWithoutExtension extension

Kotlin File useLines nameWithoutExtension extension import java.io.Filefun main(args: Array<String>) {val filePath "myfile.txt"val file File(filePath)println(file.name) //文件名字&#xff0c;不包括路径println(file.isFile) //是文件吗pri…

PTA:7-4 顺序表(删除)

顺序表&#xff08;删除&#xff09; 题目输入样例输出样例 代码 题目 输入样例 10 55 11 9 15 67 12 18 33 6 22 10 20输出样例 55 9 67 33 6 22代码 #include<iostream> using namespace std; void deletes(int* arr, int& sz, int left, int right) {int newId…

Vue入门简介(带你打开Vue的大门)

目录 前言 一、Vue简介 1. 什么是Vue 2. Vue的应用场景 3. Vue的作用&#xff08;重要性&#xff09; 4. 什么是MVVM模式 5. 开源库网址 二、Vue入门使用 1. 基础使用步骤 1.1 引入Vue.js 1.2 创建Vue实例 1.3 编写Vue模板 1.4 数据绑定与指令 1.5 调用Vue方法和…

【C++】哈希位图和布隆过滤器

哈希位图优缺点位图应用模拟实现代码 哈希布隆过滤器哈希布隆过滤器的提出哈希布隆过滤器概念模拟实现代码 为什么哈希布隆图要比位图省空间 哈希位图和布隆过滤器都是常用的概率数据结构&#xff0c;用于高效地判断一个元素是否存在于一个集合当中&#xff0c;但它们在实现方法…

The driver has not received any packets from the server

在测试数据迁移时遇到的错误。 目录 一、错误 二、解决 三、数据迁移测试 3.1 环境 3.2 源码及测试 3.2.1 源码 3.2.2 测试结果&#xff08;太慢&#xff09; 3.2.3 源码修改 3.2.4 异常及解决 一、错误 The driver has not received any packets from the server. 二…