我从硬件抽象级别理解端口I / O(即断言一个引脚,该引脚向总线上的设备指示该地址是端口地址,这在具有简单地址总线模型的早期CPU上是有意义的)。我不太确定如何在现代CPU上以微体系结构实现它,尤其是在环形总线上如何显示端口I / O操作。
首先。 IN / OUT指令在哪里分配给保留站或加载/存储缓冲区?我最初的想法是,它将在加载/存储缓冲区中分配,并且内存调度程序会识别它,并将其发送到L1d,指示它是端口映射操作。分配了一个行填充缓冲区,并将其发送到L2,然后发送到环网。我猜测环上的消息具有一些端口映射的指示器,只有系统代理才能接受该指示器,然后它检查其内部组件并将端口映射的指示请求中继给它们。即PCIe根网桥将接收CF8h和CFCh。我猜DMI控制器是固定的,可以拾取将出现在PCH上的所有标准化端口,例如用于传统DMA控制器的端口。
答案 0 :(得分:4)
是的,我假设环形总线上的消息具有某种标记,将其标记为I / O空间,而不是物理内存地址,并且系统代理对此进行了分类。
如果有人知道更多细节,这可能很有趣,但是这种简单的心理模型可能很好。
我不知道端口I / O如何转变为PCIe消息,但我认为PCIe设备可以在I / O空间而不是MMIO中拥有 I / O端口。
IN / OUT非常接近序列化(但出于某种原因How many memory barriers instructions does an x86 CPU have?尚未使用该术语进行正式定义)。它们在执行之前确实会耗尽存储缓冲区,并且是完整的内存屏障。
预订站还是加载/存储缓冲区?
两者。对于正常的加载/存储,前端会为加载分配一个加载缓冲区条目,或者为存储分配一个存储缓冲区条目,和将uop发出到ROB和RS中。
例如,当RS将存储地址或存储数据uop调度到端口4(存储数据)或p2 / p3(加载或存储地址)时,该执行单元将使用将存储缓冲区条目作为写入数据或写入地址的位置。
具有由issue / allocate / rename逻辑分配的存储缓冲区条目意味着可以先执行存储地址或存储数据,无论哪个输入先准备就绪,并在成功完成后释放其在RS中的空间。 ROB条目将保持分配状态,直到商店退休。存储缓冲区条目保持分配状态,直到此后的某个时间,即存储提交到L1d高速缓存为止。 (或者对于存储到不可缓存的内存,提交到LFB或要发送到内存层次结构的东西,如果它位于MMIO区域,则系统代理将在该内存层次结构中进行选择。)
很显然,IN / OUT被微编码为多个微指令,并且所有这些微指令都像从其他微指令一样从前端发出时,分配在ROB和保留站中。 (好吧,其中一些可能不需要后端执行单元,在这种情况下,它们只会以已经执行的状态分配到ROB中。例如,lfence
的微指令在Skylake上就是这样。 )
我假设他们使用普通的存储缓冲区/加载缓冲区机制进行内核外通信,但是由于它们或多或少地进行了序列化,因此它们的实现方式并没有真正的性能含义。 (稍后的指令要等到I / O事务的“数据阶段”之后才能开始执行,并且它们在执行之前先清空存储缓冲区。)