2016-07-30 77 views
1

我对DMA有这个基本的疑问。当CPU放弃了DMA总线进行数据读取/存储时,它如何继续处理?直接内存访问

我的意思是,即使CPU得到它的指示,通过总线存储回内存/ IOs,不是吗?

回答

3

CPUs have cache,所以他们可以做很多没有任何实际的主内存访问。即使低功耗系统也倾向于拥有缓存,因为芯片外驱动信号需要足够的能量,以便缓存通过节省的能量为缓存支付自己的能量。

更重要的是,DMA不会“接管”RAM,甚至不一定会使存储器带宽饱和。 CPU不会“放弃总线”;内存控制器接受来自CPU内核和其他系统设备的读/写请求。由于内存控制器或系统代理仲裁访问内存,排队来自所有源的读取和写入请求,因此在CPU上运行内存繁重的任务将减慢延迟DMA,反之亦然。

DMA对于仍然比内存带宽慢得多的传输很好。例如SATAIII是6 G /s,而双通道DDR3-1600MHz的主内存带宽大约为25 G Bytes/s。所以编程的io会花大部分时间等待来自SATA控制器的数据,甚至没有存储到RAM的瓶颈。


的部分是如何结合在一起的一个现代化的英特尔x86处理器中的一个例子: this diagram of Intel Skylake's system architecture (including eDRAM as memory-side cache)。对不起,我没有找到更简单的图表,只显示了核心和系统代理,但在没有eDRAM的系统中,系统代理权限的唯一内容是内存控制器,其他所有内容都保持不变。

存储器控制器是片内的,所以此图中唯一的片外连接是PCIe总线。

Skylake system agent diagram, from IDF via ARStechnica

1

有两种基本类型的DMA使用模式。首先是CPU等待DMA完成时 - 同步操作或阻塞DMA调用。另一种是当CPU发出ASYNC(或非阻塞)DMA请求时。这让CPU继续进行常规控制流程。这样它可以将工作转移到DMA来做更重要的事情。

如果我正确理解你的问题,并且正如彼得所说的那样,当一个CPU发出了一个非阻塞的DMA请求,并且DMA正在总线上进行某种操作时,CPU仍然可以执行所有常规操作,包括访问RAM,因为总线可以有复用流量。换句话说,公交车可以同时处理多个主人。

一致性和一致性使事情变得更加复杂,通常使用基于硬件支持的正确编程范例来维护。