如何使用环形总线拓扑的英特尔CPU解码并处理端口I / O操作

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

enter image description here

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

是的,我假设环形总线上的消息有某种标记,它将其标记为I / O空间,而不是物理内存地址,并且系统代理对此进行排序.

如果有人知道更多细节,那可能会很有趣,但这个简单的心理模型可能很好.

我不知道端口I / O如何变成PCIe消息,但我认为PCIe设备可以在I / O空间中有I / O端口,而不仅仅是MMIO.

IN / OUT非常接近序列化(但由于某种原因,使用该术语未正式定义How many memory barriers instructions does an x86 CPU have?).它们在执行之前会耗尽存储缓冲区,并且是完全的内存屏障.

the reservation station or the load/store buffer?

都.对于正常加载/存储,前端为加载分配加载缓冲区条目,或为存储分配存储缓冲区条目,并将uop发布到ROB和RS中.

例如,当RS将存储地址或存储数据uop调度到端口4(存储数据)或p2 / p3(加载或存储地址)时,该执行单元将使用存储缓冲区条目作为其中的位置它写入数据,或写入地址的位置.

具有由发出/分配/重命名逻辑分配的存储缓冲区条目意味着存储地址或存储数据可以首先执行,无论哪个首先准备好其输入,并且在成功完成后释放其在RS中的空间. ROB条目保持分配,直到商店退休.存储缓冲区条目保持分配,直到商店提交到L1d缓存之后的一段时间. (或者对于存储到不可缓存的内存,提交到LFB或者某些东西要发送到内存层次结构,系统代理会将其提取到MMIO区域.)

显然,IN / OUT被微编码为多个uop,并且所有这些uop都在ROB和预留站中分配,因为它们从前端发出,就像任何其他uop一样. (好吧,其中一些可能不需要一个后端执行单元,在这种情况下,它们只会在已经执行的状态下分配给ROB.例如,对于lfence的uops在Skylake上是这样的.)

我假设它们使用正常的存储缓冲区/加载缓冲机制进行非核心通信,但由于它们或多或少是序列化的,因此它们的实现方式并没有真正的性能影响. (稍后的指令直到I / O事务的“数据阶段”之后才能开始执行,并且在执行之前它们会耗尽存储缓冲区.)

相关文章
相关标签/搜索