gpt4 book ai didi

io - 使用环形总线拓扑的 Intel CPU 如何解码和处理端口 I/O 操作

转载 作者:行者123 更新时间:2023-12-04 13:25:00 24 4
gpt4 key购买 nike

我从硬件抽象级别理解端口 I/O(即断言一个向总线上的设备指示地址是端口地址的引脚,这在具有简单地址总线模型的早期 CPU 上是有意义的)但我不是真的确定它是如何在现代 CPU 微架构上实现的,尤其是端口 I/O 操作如何出现在环形总线上。

enter image description here

首先。 IN/OUT 指令分配到哪里,保留站或加载/存储缓冲区?我最初的想法是,它将被分配在加载/存储缓冲区中,并且内存调度程序识别它,将它发送到 L1d,表明它是一个端口映射操作。分配一个行填充缓冲区并将其发送到 L2,然后再发送到环。我猜环上的消息有一些端口映射指示符,只有系统代理接受,然后它检查其内部组件并将端口映射指示的请求转发给它们;即 PCIe 根桥接 CF8h 和 CFCh。我猜 DMI Controller 是固定的,可以拾取 PCH 上出现的所有标准化端口,例如用于传统 DMA Controller 的端口。

最佳答案

IN 的执行和 OUT指令取决于处理器的操作模式。在实模式下,无需检查权限即可执行指令。在所有其他模式下,需要检查 Flags 寄存器的 IOPL 字段和与当前硬件任务关联的 I/O 权限映射,以确定 IN/OUT指令被允许执行。此外,IN/OUT指令具有比 LFENCE 更强的序列化属性但比完全序列化指令弱。根据英特尔手册第 3 卷的第 8.2.5 节:

Memory mapped devices and other I/O devices on the bus are often sensitive to the order of writes to their I/O buffers. I/O instructions can be used to (the IN and OUT instructions) impose strong write ordering on such accesses as follows. Prior to executing an I/O instruction, the processor waits for all previous instructions in the program to complete and for all buffered writes to drain to memory. Only instruction fetch and page tables walks can pass I/O instructions. Execution of subsequent instructions do not begin until the processor determines that the I/O instruction has been completed.



此描述表明 IN/OUT指令完全阻塞流水线的分配阶段,直到所有先前的指令都被执行并且存储缓冲区和 WCB 被耗尽,然后 IN/OUT指令退休。为了实现这些序列化属性并执行必要的操作模式和权限检查, IN/OUT指令需要解码成许多微指令。有关如何实现此类指令的更多信息,请参阅: What happens to software interrupts in the pipeline? .

旧版本的 Intel 优化手册确实提供了 IN 的延迟和吞吐量数字。和 OUT指示。他们似乎都说最坏情况下的延迟是 225 个周期,而吞吐量恰好是每条指令 40 个周期。但是,这些数字对我来说没有多大意义,因为我认为延迟取决于正在读取或写入的 I/O 设备。而且因为这些指令基本上是序列化的,所以延迟本质上决定了吞吐量。

我已经测试了 in al, 80h关于 Haswell 的说明。根据@MargaretBloom,从端口 0x80 读取一个字节是安全的(根据 osdev.org 映射到某个 DMA Controller 寄存器)。这是我发现的:
  • 该指令被 MEM_UOPS_RETIRED.ALL_LOADS 计为单个加载 uop .它也算作错过 L1D 的加载微指令。但是,它不算作命中 L1D 或未命中或命中 L2 或 L3 缓存的加载微指令。
  • uops的分布如下:p0:16.4、p1:20、p2:1.2、p3:2.9、p4:0.07、p5:16.2、p6:42.8,最后是p7:0.04。在 al, 80h 中总共有 99.6 微指令。操作说明。
  • in al, 80h 的吞吐量是每条指令 3478 个周期。我认为吞吐量取决于 I/O 设备。
  • 根据 L1D_PEND_MISS.PENDING_CYCLES ,I/O 加载请求似乎在一个 LFB 中分配了一个周期。
  • 当我添加 IMUL取决于 in 的结果的指令指令,总执行时间不变。这表明 in指令不会完全阻塞分配阶段,直到它的所有微指令都退役,并且它可能与后面的指令重叠,这与我对手册的解释相反。

  • 我已经测试了 out dx, al端口 0x3FF、0x2FF、0x3EF 和 0x2EF 的 Haswell 指令。 uop的分布如下:p0:10.9、p1:15.2、p2:1、p3:1、p4:1、p5:11.3、p6:25.3,最后是p7:1。每条指令总共有 66.7 微指令。 out 的吞吐量到 0x2FF、0x3EF 和 0x2EF 为 1880c。 out 的吞吐量到 0x3FF 是 6644.7c。 out指令不计入退休商店。

    一旦 I/O 加载或存储请求到达系统代理,它可以通过查询其系统 I/O 映射表来确定如何处理该请求。该表取决于芯片组。一些 I/O 端口是静态映射的,而另一些是动态映射的。例如参见 Intel 100 Series Chipset datasheet 的第 4.2 节。 ,用于 Skylake 处理器。一旦请求完成,系统代理将响应发送回处理器,以便它可以完全退出 I/O 指令。

    关于io - 使用环形总线拓扑的 Intel CPU 如何解码和处理端口 I/O 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55042577/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com