核心概念图示
下面是一个简化的抽象模型。不同架构可能很不一样,但基本遵照这个关系。
+-----------------+
| Main Memory |
| (DRAM) |
+--------^--------+
| (Physical Addresses)
+--------|--------+
| Memory Controller|
+--------^--------+
|
+----------------------|-----------------------+
| System Bus / Interconnect |
| (e.g., On-Chip Fabric, HyperTransport, QPI, UPI, AXI/CHI) |
+----^-----------^--------------^-----------^---+
| | | |
(DMA Path) -------------> | | | |<------------ (CPU Path)
| +-------|-------+ | |
| | IOMMU |<-----+-----------+---- (CPU configures IOMMU)
| +-------^-------+ | |
| | (IOVA -> PA) | |
+-------|-------+ | | +-------+--------+
| DMA Controller| <-+ | | L3 Cache (LLC) |
| (DMAC) | | | (Shared by Cores)|
+-------^-------+ | +-------^--------+
| | | (L2 Miss)
+-------|-------+ | +-------+--------+
| I/O Device | | | L2 Cache (Shared/|
| (e.g., NIC, | | | Per Core) |
| Disk Ctrl) | | +-------^--------+
+---------------+ | | (L1 Miss)
|
+-----------------+-----------------+
| CPU Core(s) Cluster |
| |
| +-----------Core 0------------+ |
| | +---------+ +---------+ | |
| | | ICache |<--| Fetch/ | | |
| | | (L1-I) | | Decode | | |
| | +----^----+ +---------+ | |
| | | (VA) | |
| | +----|----+ +---------+ | |
| | | DCache |<--| Load/ | | |
| | | (L1-D) | | Store | | |
| | +----^----+ | Unit(s) | | |
| | | (VA) | + LSQ | | |
| | | | + Store | | |
| | +----|----+ | Buffer| | |
| | |MMU/TLB |<--+---------+ | |
| | +---------+ | |
| +---------------------------+ |
| (More Cores ... similar structure) |
+-----------------------------------+
CPU Core(s):
Fetch/Decode Unit:
- 从 ICache (L1 指令缓存) 获取指令。
- ICache通常使用虚拟地址 (VA) 进行索引 (VIVT 或 VIPT)。
- 如果ICache Miss,则通过更高级别的缓存 (L2, L3) 最终到主内存加载指令。
Load/Store Unit (LSU):
- 执行LOAD和STORE指令。
- 与 DCache (L1 数据缓存) 直接交互。DCache也可能使用虚拟地址索引,但通常使用物理地址标记 (VIPT) 或完全使用物理地址 (PIPT)。
- 包含 LSQ (Load/Store Queue):用于处理乱序执行的访存指令,进行内存依赖检查、地址冲突检测和Store-to-Load forwarding。
- 包含 Store Buffer (写缓冲器):STORE操作先写入Store Buffer,之后再提交到DCache或更下级存储,以避免阻塞CPU。
MMU (Memory Management Unit) / TLB (Translation Lookaside Buffer):
- 位于CPU核心内部,与Fetch单元和LSU紧密配合。
- 负责将指令和数据访问的 虚拟地址 (VA) 转换为 物理地址 (PA)。
- TLB是MMU页表缓存,加速地址转换。
- 转换后的PA用于访问物理标记的Cache (如PIPT DCache, PIPT L2/L3) 或主内存。
Cache Hierarchy (L1, L2, L3):
- L1 ICache & L1 DCache: 每个CPU核心私有,速度最快,容量最小。直接与核心的Fetch/Decode和LSU交互。
- L2 Cache: 可以是核心私有,也可以由一小组核心共享。L1 Cache发生Miss时会访问L2。
- L3 Cache (Last Level Cache - LLC): 通常由所有CPU核心共享,容量较大。L2 Cache发生Miss时会访问L3。是CPU核心与外部内存/设备交互的最后一道缓存防线。
- 连接关系: Core -> L1 -> L2 -> L3 -> System Bus/Interconnect.
System Bus / Interconnect:
- 这是连接CPU核心(通过其LLC)、内存控制器、IOMMU以及各种外设控制器(如图形卡、PCIe设备槽位)的高速通道。
- 负责在这些组件之间传输数据和控制信号。
- 需要支持缓存一致性协议 (e.g., MESI/MOESI) 的窥探 (Snooping) 流量,以确保多核CPU以及DMA设备与CPU Cache之间的数据一致性。
Memory Controller:
- 位于System Bus和主内存 (DRAM) 之间。
- 接收来自CPU(通过Cache Hierarchy)或DMA设备(通过IOMMU)的物理地址访存请求。
- 管理对DRAM芯片的读写操作、刷新等。
Main Memory (DRAM):
- 系统的主要存储区域,存放指令和数据。通过物理地址访问。
I/O Devices & DMA Controller (DMAC):
- I/O Devices: 如网卡 (NIC)、磁盘控制器 (SATA/NVMe)、USB控制器等。
- DMA Controller (DMAC): 许多高性能I/O设备拥有自己的DMAC,或者系统中有共享的DMAC。
- DMAC接收I/O设备的请求,直接在I/O设备和主内存之间传输数据,无需CPU干预。
- DMAC发出的地址通常是 IOVA (I/O Virtual Address) 或设备特定的物理地址。
IOMMU (Input/Output Memory Management Unit):
- 位置: 位于DMA能力的I/O设备(或其DMAC)与System Bus/Memory Controller之间。
- 功能:
- 接收来自DMAC的IOVA。
- 通过查询由操作系统/VMM设置的IO页表,将IOVA转换为物理地址 (PA)。
- 进行内存保护,确保设备只能访问其授权的内存区域。
- 连接:
- 输入端: 连接到发出DMA请求的设备/DMAC(通常通过PCIe总线或其他I/O总线)。
- 输出端: 转换后的PA请求被发送到System Bus,进而到达Memory Controller。
- 配置: CPU(运行OS或Hypervisor)通过System Bus配置IOMMU的页表和控制寄存器。
数据流例子
- CPU LOAD 指令:
- LSU生成VA -> MMU/TLB (VA -> PA)
- L1 DCache (使用VA/PA查找) -> Hit? Yes -> 数据给LSU.
- No -> L2 Cache (使用PA查找) -> Hit? Yes -> 数据给L1 DCache -> LSU.
- No -> L3 Cache (使用PA查找) -> Hit? Yes -> 数据给L2 -> L1 -> LSU.
- No -> System Bus -> Memory Controller -> Main Memory (PA) -> 数据返回给L3 -> L2 -> L1 -> LSU.
- DMA 读操作 (设备 -> 内存):
- I/O Device请求DMAC.
- DMAC发出DMA读请求,目标地址为IOVA.
- 请求到达IOMMU.
- IOMMU (IOVA -> PA) -> 检查权限.
- PA请求通过System Bus发送给Memory Controller.
- Memory Controller从Main Memory读取数据,通过System Bus、IOMMU (通常直接透传数据,因为地址已转换) 返回给DMAC.
- DMAC将数据写入I/O Device.
- 缓存一致性: 在此过程中,如果DMA写入的内存区域在CPU Cache中有副本,需要通过硬件窥探或软件操作(Cache Flush/Invalidate)来维护一致性。IOMMU本身不直接处理CPU Cache一致性,但System Bus上的一致性协议会起作用。
关键交互
- CPU与Cache: 通过VA(到L1)和PA(到L2/L3)进行高速读写。
- CPU与MMU/TLB: VA到PA的转换是所有CPU访存的基础。
- CPU与IOMMU: OS/Hypervisor通过普通内存访问(配置寄存器)来编程IOMMU的页表。
- DMA与IOMMU: DMA设备的所有内存访问都经过IOMMU进行地址转换和保护。
- System Bus: 是所有主要组件通信的枢纽,缓存一致性协议在这里运作。
仲裁
从图中可以看到 互连组件 (Interconnect) 连接了多个其它组件。为了在内存和设备间有序交换数据,(以AXI4为例)仲裁主要发生在以下两个层面:
- 主设备访问从设备的仲裁 (Master-to-Slave Arbitration):
- 当多个主设备试图同时访问同一个从设备(例如,内存控制器)时,互连中的仲裁器 (Arbiter) 需要决定哪个主设备的请求被优先传递给从设备。
- 针对写操作:
- 主设备们通过各自的AW通道发送写地址请求。
- 互连的仲裁器会根据预设的仲裁策略(见下文)选择一个主设备的AW请求,并将其转发给目标从设备的AW通道。
- 一旦从设备接受了某个主设备的AW请求(通过AWREADY信号),通常该主设备也会被授予发送W通道数据的权限(尽管W通道也有自己的握手,并且数据可以稍微滞后于地址)。
- 针对读操作:
- 主设备们通过各自的AR通道发送读地址请求。
- 互连的仲裁器选择一个主设备的AR请求,并将其转发给目标从设备的AR通道。
- 仲裁粒度: 仲裁通常基于一个完整的突发传输 (burst) 请求。一旦一个主设备的突发请求被仲裁选中并开始,它通常会完成整个突发,然后仲裁器才会考虑其他主设备的请求(除非有更高优先级的抢占机制)。
- 从设备响应返回给主设备的“隐式”仲裁/路由:
- 从设备发回的响应(R通道的数据或B通道的写响应)需要被正确地路由回发起请求的那个主设备。
- 这不是传统意义上的“仲裁”(因为响应是针对特定请求的),而是事务ID (Transaction ID) 的使用确保了响应的正确匹配和路由。
- AXI ID 信号:
- 在AW通道 ( AWID ) 和AR通道 ( ARID ) 中,主设备会为每个事务分配一个ID。
- 从设备在返回读数据时,会在R通道包含相同的 RID。
- 从设备在返回写响应时,会在B通道包含相同的 BID。
- 互连使用这些ID来确保:
- 来自不同主设备的乱序响应能够被正确地送回各自的主设备。
- 即使单个主设备发出了多个乱序的请求,响应也能正确匹配。
- 因此,虽然多个主设备可能同时有等待响应的请求,但ID机制确保了响应不会混淆,每个响应都明确地指向其发起者。
常见的仲裁方案包括固定优先级、轮转、LRU 等。
Crossbar
Crossbar是一种互连架构,用于在多个输入端口和多个输出端口之间建立非阻塞或接近非阻塞的连接。一个 M x N Crossbar 可以同时连接 M 个输入端口中的任意一个到 N 个输出端口中的任意一个空闲端口。在最理想的情况下(非阻塞Crossbar),它可以同时支持多达 min(M, N) 个并发连接,只要每个输入连接到不同的输出,并且每个输出只被一个输入连接。这是Crossbar相对于传统共享总线(如AMBA AHB的早期简单形式)的主要优势。共享总线在同一时刻只允许一个主设备进行传输。Crossbar则允许多个主设备同时与不同的从设备通信(或者一个主设备同时与多个从设备通信,如果从设备支持且协议允许)。