- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我从硬件抽象级别理解端口 I/O(即断言一个向总线上的设备指示地址是端口地址的引脚,这在具有简单地址总线模型的早期 CPU 上是有意义的)但我不是真的确定它是如何在现代 CPU 微架构上实现的,尤其是端口 I/O 操作如何出现在环形总线上。
首先。 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? .
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 缓存的加载微指令。 al, 80h
中总共有 99.6 微指令。操作说明。 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
指令不计入退休商店。
关于io - 使用环形总线拓扑的 Intel CPU 如何解码和处理端口 I/O 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55042577/
我是一名优秀的程序员,十分优秀!