首页 / 资讯中心 / 文章详情

第24章:DMA与存储子系统:分析eMMC/UFS控制器中的DMA引擎

第24章:DMA与存储子系统:分析eMMC/UFS控制器中的DMA引擎 ★ FEATURED ARTICLE
存储子系统,说白了就是手机里最慢的那个环节。CPU跑得再快,如果数据卡在eMMC或UFS上,用户体验照样拉胯。我这些年调过不少存储相关的驱动,发现很多人只关注协议层,却忽略了DMA引擎这个真正的性能瓶颈。今天咱们就聊聊,eMMC和UFS控制器里的DMA到底怎么干活,以及IO调度器是怎么影响DMA传输的。24.1 eMMC控制器中的DMA引擎eMMC的DMA引擎,其实没那么复杂。它主要做一件事:把数据从内存搬到eMMC控制器,或者反过来。但这里有个坑——eMMC的DMA通常是单通道的。核心要点:eMMC的DMA引擎支持两种模式——单块传输和多块传输。多块传输时,DMA可以连续搬运多个数据块,但需要硬件支持"链式描述符"。我记得在MT6765平台上,eMMC的DMA描述符是固定格式的。每个描述符包含:源地址(内存地址)目的地址(eMMC控制器FIFO)传输长度(字节数)下一个描述符指针嗯,这里要注意:描述符链表必须连续存放在物理内存中。我刚开始做的时候,用kmalloc分配描述符,结果DMA死活不工作。后来才发现,kmalloc返回的是虚拟地址,而DMA引擎要的是物理地址。避坑指南:我曾经在MTK平台上踩过这个坑——描述符必须用dma_alloc_coherent分配,保证物理地址连续且cache一致性正确。24.2 UFS控制器的DMA引擎UFS比eMMC先进多了。它的DMA引擎叫PRDT(Physical Region Descriptor Table),支持分散-聚集(Scatter-Gather)传输。说白了,UFS的DMA可以一次处理多个不连续的内存区域。你想想看,上层文件系统发来的数据,很可能分散在内存的不同页里。eMMC需要你先整理成连续缓冲区,UFS直接就能处理。U
阅读完成 · 觉得有帮助?
咨询建站