简单分析mmc体系结构

版权声明:本文为博主原创文章,转载请注明出处:https://blog.csdn.net/huang_165/article/details/86626017

     上一篇博文《简单分析与移植rockchip平台mmc/sd卡》谈到MMC core、MMC host controller driver、MMC card driver
并给出了硬件拓扑、mmc软件主体框架。本编博文的目的是罗列Linux MMC framework工作流程、框架内各个内核组件及之间的关系。


Linux MMC framework工作流程:图片来源:http://www.wowotech.net/comm/mmc_framework_arch.html

简单分析mmc体系结构_第1张图片

      可以看到有三条并行的路,且这三路刚好对应着mmc软件主体框架(其实硬件框架也是这样的,毕竟软件是硬件的抽象)
1.mmc子系统位于第一路它注册一个mmc_buscard drvcard dev匹配。
2.host driver位于第二路它申请、初始化、添加host结构体(未来将用这个结构体和sd卡通信)。然后检测下sd卡(检测不到只能等热插拔了),检测到后添加一个card device
3.card driver位于第三路它直接面对应用层并提供一个名字为mmc的card driver
4.如果card drivercard device成功匹配后(mmc_bus下的match方法)就执行host driver下的probe并提供一个信标:mmc_blk_issue_rq供应用层调用。


      看完上面tiny版的mmc框架,接下来看下博主整理的mmc体系架构。之前博主一般都是贴源码调用过程分析框架的,不过我发现过一段时间不看源码,我自己也忘记代码的调用关系0_0。
所以,博主现在除了分析源码调用关系外,还以图的形式分析组件关系,因为以图的形式会更形象、生动、不易忘记。

简单分析mmc体系结构_第2张图片

       请先看三块蓝色大字

1.从rk mmc控制器驱动出发,可以大概知道构建rk mmc host需要的内核组件。像设备树、时钟、timer、tasklet、DMA等等
2.从mmc核心层驱动出发可以,大概知道构建mmc核心层需要sysfs、电源管理、内存管理、idr机制、生成mmc_bus、card device
3.从mmc驱动层出发,可以大概知道构建mmc驱动层需要自身添加的card drivercard device匹配并向mmc 核心层申请、设置、注册一个disk。提供issue函数以支持应用层对sd卡的操作。

      看到一个驱动牵连这么多组件(子系统)是不是觉得Linux驱动是入门Linux内核的最好方向呢?
      其实到这里我们已经对mmc框架有所了解,接下来就是看块io调度层调用mmc_blk_issue_rq后,这三层如何配合以进行实现数据存放、读取操作。这也是mmc最复杂的地方因为涉及mmc协议。这里先介绍简单的数据流程图,具体协议、代码分析留到下一篇博文。


先看一个块设备请求mmc主机控制器操作一笔数据简图

简单分析mmc体系结构_第3张图片

      块设备的数据传输,本质上是设备上相邻扇区与内存之间的数据传输。通常情况,为了提升性能,数据传输通过DMA方式。
在磁盘控制器的旧时代,DMA操作都比较简单,每次传输,数据在内存中必须是连续的。现在则不同,很多SOC都支持“分散/聚合”(scatter-gather)DMA操作,这种操作模式下,数据传输可以在多个非连续的内存区域中进行。
对于每个“分散/聚合”DMA操作,块设备驱动需要向控制器发送: 
a)初始扇区号和传输的总共扇区数 
b)内存区域的描述链表,每个描述都包含一个地址长度。不同的描述之间,可以是一个内存上物理地址连续的,也可以不连续的。
控制器来管理整个数据传输,例如:在读操作中,控制器从块设备相邻的扇区上读取数据,然后将数据分散存储在内存的不同区域。
这里的每个内存区域(物理连续的一段内存,可以是一个page,也可以是page的一部分)就称作Segment。一个Segment包含多个相邻扇区。最后,利用“分散/聚合”的DMA操作,一次数据传输可以会涉及多个segments。


分享一些不错的学习网站
http://www.wowotech.net/tag/mmc
https://linux.codingbelief.com/zh/storage/flash_memory/
https://blog.csdn.net/lwj103862095/article/category/1207502   mmc协议

你可能感兴趣的:(块设备)