1 .. SPDX-License-Identifier: GPL-2.0 2 .. include:: ../../disclaimer-zh_CN.rst 3 4 :Original: Documentation/virt/acrn/io-request.rst 5 6 :翻译: 7 8 司延腾 Yanteng Si <siyanteng@loongson.cn> 9 10 :校译: 11 12 时奎亮 Alex Shi <alexs@kernel.org> 13 14 .. _cn_virt_acrn_io-request: 15 16 I/O请求处理 17 =========== 18 19 客户虚拟机的I/O请求由超级管理器构建,由ACRN超级管理器服务模块分发到与I/O请求的地址范 20 围相对应的I/O客户端。I/O请求处理的细节将在以下章节描述。 21 22 1. I/O请求 23 ---------- 24 25 对于每个客户虚拟机,有一个共享的4KB字节的内存区域,用于超级管理器和服务虚拟机之间的 26 I/O请求通信。一个I/O请求是一个256字节的结构体缓冲区,它是 "acrn_io_request" 结构 27 体,当客户虚拟机中发生被困的I/O访问时,由超级管理器的I/O处理器填充。服务虚拟机中的 28 ACRN用户空间首先分配一个4KB字节的页面,并将缓冲区的GPA(客户物理地址)传递给管理平 29 台。缓冲区被用作16个I/O请求槽的数组,每个I/O请求槽为256字节。这个数组是按vCPU ID 30 索引的。 31 32 2. I/O客户端 33 ------------ 34 35 一个I/O客户端负责处理客户虚拟机的I/O请求,其访问的GPA在一定范围内。每个客户虚拟机 36 可以关联多个I/O客户端。每个客户虚拟机都有一个特殊的客户端,称为默认客户端,负责处理 37 所有不在其他客户端范围内的I/O请求。ACRN用户空间充当每个客户虚拟机的默认客户端。 38 39 下面的图示显示了I/O请求共享缓冲区、I/O请求和I/O客户端之间的关系。 40 41 :: 42 43 +------------------------------------------------------+ 44 | 服务VM | 45 |+--------------------------------------------------+ | 46 || +----------------------------------------+ | | 47 || | 共享页 ACRN用户空间 | | | 48 || | +-----------------+ +------------+ | | | 49 || +----+->| acrn_io_request |<-+ 默认 | | | | 50 || | | | +-----------------+ | I/O客户端 | | | | 51 || | | | | ... | +------------+ | | | 52 || | | | +-----------------+ | | | 53 || | +-|--------------------------------------+ | | 54 ||---|----|-----------------------------------------| | 55 || | | 内核 | | 56 || | | +----------------------+ | | 57 || | | | +-------------+ HSM | | | 58 || | +--------------+ | | | | 59 || | | | I/O客户端 | | | | 60 || | | | | | | | 61 || | | +-------------+ | | | 62 || | +----------------------+ | | 63 |+---|----------------------------------------------+ | 64 +----|-------------------------------------------------+ 65 | 66 +----|-------------------------------------------------+ 67 | +-+-----------+ | 68 | | I/O处理 | ACRN超级管理器 | 69 | +-------------+ | 70 +------------------------------------------------------+ 71 72 3. I/O请求状态转换 73 ------------------ 74 75 一个ACRN I/O请求的状态转换如下。 76 77 :: 78 79 FREE -> PENDING -> PROCESSING -> COMPLETE -> FREE -> ... 80 81 - FREE: 这个I/O请求槽是空的 82 - PENDING: 在这个槽位上有一个有效的I/O请求正在等待 83 - PROCESSING: 正在处理I/O请求 84 - COMPLETE: 该I/O请求已被处理 85 86 处于COMPLETE或FREE状态的I/O请求是由超级管理器拥有的。HSM和ACRN用户空间负责处理其 87 他的。 88 89 4. I/O请求的处理流程 90 -------------------- 91 92 a. 当客户虚拟机中发生被陷入的I/O访问时,超级管理器的I/O处理程序将把I/O请求填充为 93 PENDING状态。 94 b. 超级管理器向服务虚拟机发出一个向上调用,这是一个通知中断。 95 c. upcall处理程序会安排一个工作者来调度I/O请求。 96 d. 工作者寻找PENDING I/O请求,根据I/O访问的地址将其分配给不同的注册客户,将其 97 状态更新为PROCESSING,并通知相应的客户进行处理。 98 e. 被通知的客户端处理指定的I/O请求。 99 f. HSM将I/O请求状态更新为COMPLETE,并通过hypercalls通知超级管理器完成。
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.