Back to home page

OSCL-LXR

 
 

    


0001 .. SPDX-License-Identifier: GPL-2.0
0002 .. include:: ../../disclaimer-zh_CN.rst
0003 
0004 :Original: Documentation/virt/acrn/io-request.rst
0005 
0006 :翻译:
0007 
0008  司延腾 Yanteng Si <siyanteng@loongson.cn>
0009 
0010 :校译:
0011 
0012  时奎亮 Alex Shi <alexs@kernel.org>
0013 
0014 .. _cn_virt_acrn_io-request:
0015 
0016 I/O请求处理
0017 ===========
0018 
0019 客户虚拟机的I/O请求由超级管理器构建,由ACRN超级管理器服务模块分发到与I/O请求的地址范
0020 围相对应的I/O客户端。I/O请求处理的细节将在以下章节描述。
0021 
0022 1. I/O请求
0023 ----------
0024 
0025 对于每个客户虚拟机,有一个共享的4KB字节的内存区域,用于超级管理器和服务虚拟机之间的
0026 I/O请求通信。一个I/O请求是一个256字节的结构体缓冲区,它是 "acrn_io_request" 结构
0027 体,当客户虚拟机中发生被困的I/O访问时,由超级管理器的I/O处理器填充。服务虚拟机中的
0028 ACRN用户空间首先分配一个4KB字节的页面,并将缓冲区的GPA(客户物理地址)传递给管理平
0029 台。缓冲区被用作16个I/O请求槽的数组,每个I/O请求槽为256字节。这个数组是按vCPU ID
0030 索引的。
0031 
0032 2. I/O客户端
0033 ------------
0034 
0035 一个I/O客户端负责处理客户虚拟机的I/O请求,其访问的GPA在一定范围内。每个客户虚拟机
0036 可以关联多个I/O客户端。每个客户虚拟机都有一个特殊的客户端,称为默认客户端,负责处理
0037 所有不在其他客户端范围内的I/O请求。ACRN用户空间充当每个客户虚拟机的默认客户端。
0038 
0039 下面的图示显示了I/O请求共享缓冲区、I/O请求和I/O客户端之间的关系。
0040 
0041 ::
0042 
0043      +------------------------------------------------------+
0044      |                                       服务VM         |
0045      |+--------------------------------------------------+  |
0046      ||      +----------------------------------------+  |  |
0047      ||      | 共享页                 ACRN用户空间    |  |  |
0048      ||      |    +-----------------+  +------------+ |  |  |
0049      ||   +----+->| acrn_io_request |<-+  默认      | |  |  |
0050      ||   |  | |  +-----------------+  | I/O客户端  | |  |  |
0051      ||   |  | |  |       ...       |  +------------+ |  |  |
0052      ||   |  | |  +-----------------+                 |  |  |
0053      ||   |  +-|--------------------------------------+  |  |
0054      ||---|----|-----------------------------------------|  |
0055      ||   |    |                             内核        |  |
0056      ||   |    |            +----------------------+     |  |
0057      ||   |    |            | +-------------+  HSM |     |  |
0058      ||   |    +--------------+             |      |     |  |
0059      ||   |                 | | I/O客户端   |      |     |  |
0060      ||   |                 | |             |      |     |  |
0061      ||   |                 | +-------------+      |     |  |
0062      ||   |                 +----------------------+     |  |
0063      |+---|----------------------------------------------+  |
0064      +----|-------------------------------------------------+
0065           |
0066      +----|-------------------------------------------------+
0067      |  +-+-----------+                                     |
0068      |  | I/O处理     |              ACRN超级管理器         |
0069      |  +-------------+                                     |
0070      +------------------------------------------------------+
0071 
0072 3. I/O请求状态转换
0073 ------------------
0074 
0075 一个ACRN I/O请求的状态转换如下。
0076 
0077 ::
0078 
0079    FREE -> PENDING -> PROCESSING -> COMPLETE -> FREE -> ...
0080 
0081 - FREE: 这个I/O请求槽是空的
0082 - PENDING: 在这个槽位上有一个有效的I/O请求正在等待
0083 - PROCESSING: 正在处理I/O请求
0084 - COMPLETE: 该I/O请求已被处理
0085 
0086 处于COMPLETE或FREE状态的I/O请求是由超级管理器拥有的。HSM和ACRN用户空间负责处理其
0087 他的。
0088 
0089 4. I/O请求的处理流程
0090 --------------------
0091 
0092 a. 当客户虚拟机中发生被陷入的I/O访问时,超级管理器的I/O处理程序将把I/O请求填充为
0093    PENDING状态。
0094 b. 超级管理器向服务虚拟机发出一个向上调用,这是一个通知中断。
0095 c. upcall处理程序会安排一个工作者来调度I/O请求。
0096 d. 工作者寻找PENDING I/O请求,根据I/O访问的地址将其分配给不同的注册客户,将其
0097    状态更新为PROCESSING,并通知相应的客户进行处理。
0098 e. 被通知的客户端处理指定的I/O请求。
0099 f. HSM将I/O请求状态更新为COMPLETE,并通过hypercalls通知超级管理器完成。