162306a36Sopenharmony_ci.. SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci.. include:: ../../disclaimer-zh_CN.rst 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci:Original: Documentation/virt/acrn/io-request.rst 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci:翻译: 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci 司延腾 Yanteng Si <siyanteng@loongson.cn> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci:校译: 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci 时奎亮 Alex Shi <alexs@kernel.org> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci.. _cn_virt_acrn_io-request: 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ciI/O请求处理 1762306a36Sopenharmony_ci=========== 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci客户虚拟机的I/O请求由超级管理器构建,由ACRN超级管理器服务模块分发到与I/O请求的地址范 2062306a36Sopenharmony_ci围相对应的I/O客户端。I/O请求处理的细节将在以下章节描述。 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci1. I/O请求 2362306a36Sopenharmony_ci---------- 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci对于每个客户虚拟机,有一个共享的4KB字节的内存区域,用于超级管理器和服务虚拟机之间的 2662306a36Sopenharmony_ciI/O请求通信。一个I/O请求是一个256字节的结构体缓冲区,它是 "acrn_io_request" 结构 2762306a36Sopenharmony_ci体,当客户虚拟机中发生被困的I/O访问时,由超级管理器的I/O处理器填充。服务虚拟机中的 2862306a36Sopenharmony_ciACRN用户空间首先分配一个4KB字节的页面,并将缓冲区的GPA(客户物理地址)传递给管理平 2962306a36Sopenharmony_ci台。缓冲区被用作16个I/O请求槽的数组,每个I/O请求槽为256字节。这个数组是按vCPU ID 3062306a36Sopenharmony_ci索引的。 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci2. I/O客户端 3362306a36Sopenharmony_ci------------ 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci一个I/O客户端负责处理客户虚拟机的I/O请求,其访问的GPA在一定范围内。每个客户虚拟机 3662306a36Sopenharmony_ci可以关联多个I/O客户端。每个客户虚拟机都有一个特殊的客户端,称为默认客户端,负责处理 3762306a36Sopenharmony_ci所有不在其他客户端范围内的I/O请求。ACRN用户空间充当每个客户虚拟机的默认客户端。 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci下面的图示显示了I/O请求共享缓冲区、I/O请求和I/O客户端之间的关系。 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci:: 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci +------------------------------------------------------+ 4462306a36Sopenharmony_ci | 服务VM | 4562306a36Sopenharmony_ci |+--------------------------------------------------+ | 4662306a36Sopenharmony_ci || +----------------------------------------+ | | 4762306a36Sopenharmony_ci || | 共享页 ACRN用户空间 | | | 4862306a36Sopenharmony_ci || | +-----------------+ +------------+ | | | 4962306a36Sopenharmony_ci || +----+->| acrn_io_request |<-+ 默认 | | | | 5062306a36Sopenharmony_ci || | | | +-----------------+ | I/O客户端 | | | | 5162306a36Sopenharmony_ci || | | | | ... | +------------+ | | | 5262306a36Sopenharmony_ci || | | | +-----------------+ | | | 5362306a36Sopenharmony_ci || | +-|--------------------------------------+ | | 5462306a36Sopenharmony_ci ||---|----|-----------------------------------------| | 5562306a36Sopenharmony_ci || | | 内核 | | 5662306a36Sopenharmony_ci || | | +----------------------+ | | 5762306a36Sopenharmony_ci || | | | +-------------+ HSM | | | 5862306a36Sopenharmony_ci || | +--------------+ | | | | 5962306a36Sopenharmony_ci || | | | I/O客户端 | | | | 6062306a36Sopenharmony_ci || | | | | | | | 6162306a36Sopenharmony_ci || | | +-------------+ | | | 6262306a36Sopenharmony_ci || | +----------------------+ | | 6362306a36Sopenharmony_ci |+---|----------------------------------------------+ | 6462306a36Sopenharmony_ci +----|-------------------------------------------------+ 6562306a36Sopenharmony_ci | 6662306a36Sopenharmony_ci +----|-------------------------------------------------+ 6762306a36Sopenharmony_ci | +-+-----------+ | 6862306a36Sopenharmony_ci | | I/O处理 | ACRN超级管理器 | 6962306a36Sopenharmony_ci | +-------------+ | 7062306a36Sopenharmony_ci +------------------------------------------------------+ 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci3. I/O请求状态转换 7362306a36Sopenharmony_ci------------------ 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci一个ACRN I/O请求的状态转换如下。 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci:: 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci FREE -> PENDING -> PROCESSING -> COMPLETE -> FREE -> ... 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci- FREE: 这个I/O请求槽是空的 8262306a36Sopenharmony_ci- PENDING: 在这个槽位上有一个有效的I/O请求正在等待 8362306a36Sopenharmony_ci- PROCESSING: 正在处理I/O请求 8462306a36Sopenharmony_ci- COMPLETE: 该I/O请求已被处理 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci处于COMPLETE或FREE状态的I/O请求是由超级管理器拥有的。HSM和ACRN用户空间负责处理其 8762306a36Sopenharmony_ci他的。 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci4. I/O请求的处理流程 9062306a36Sopenharmony_ci-------------------- 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_cia. 当客户虚拟机中发生被陷入的I/O访问时,超级管理器的I/O处理程序将把I/O请求填充为 9362306a36Sopenharmony_ci PENDING状态。 9462306a36Sopenharmony_cib. 超级管理器向服务虚拟机发出一个向上调用,这是一个通知中断。 9562306a36Sopenharmony_cic. upcall处理程序会安排一个工作者来调度I/O请求。 9662306a36Sopenharmony_cid. 工作者寻找PENDING I/O请求,根据I/O访问的地址将其分配给不同的注册客户,将其 9762306a36Sopenharmony_ci 状态更新为PROCESSING,并通知相应的客户进行处理。 9862306a36Sopenharmony_cie. 被通知的客户端处理指定的I/O请求。 9962306a36Sopenharmony_cif. HSM将I/O请求状态更新为COMPLETE,并通过hypercalls通知超级管理器完成。 100