🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
用adb shell登录到我的G7手机上,然后用mount查看信息后,会得到如图9-10所示的结果: :-: ![](http://img.blog.csdn.net/20150802164824388?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 图9-10 mount命令的执行结果 其中,可以发现系统的几个重要的分区,例如/system对应的设备是mtdblock3,那么mtdblock是什么呢? 1. MTD的介绍[^write] Linux系统提供了MTD(Memory Technology Device,内存技术设备)系统来建立针对Flash设备的统一、抽象的接口,也就是说,有了MTD,就可以不用考虑不同Flash设备带来的差异了,这一点和FBD(FrameBuffer Device)的作用很类似。下面看Linux MTD的系统层次图,如图9-11所示。 :-: ![](http://img.blog.csdn.net/20150802164737835?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 图9-11 Linux MTD系统层次图 从上图中可以看出: - MTD将文件系统与底层的Flash存储器进行了隔离,这样应用层就无须考虑真实的硬件情况了。 - 图9-11中的mtdblock表示MTD块设备。 有了MTD后,就不用关心Flash是NOR还是NAND了。另外,我们从图9-10“mount命令的执行结果”中还可看见mount指定的文件系统中有一个yaffs2,它又是什么呢? 2. Flash文件系统[^platform] 先来说说Flash的特性。常见的文件系统(例如FAT32、NTFS、Ext2等)是无法直接用在Flash设备上的,因为无法重复地在Flash的同一块存储位置上做写入操作(必须事先擦除该块后才能写入)。为了能够在Flash设备上使用这些文件系统,必须透过一层转换层(TranslationLayer),将逻辑块地址对应到Flash存储器的物理地址上,以便系统能把Flash当做普通的磁盘处理,可称这一层为FTL(Flash Translation Layer)。Flash转换层的示意图如图9-12所示: :-: ![](http://img.blog.csdn.net/20150802164918988?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 图9-12 FTL和NFTL 从上图中可以看到: - 如果想使用FAT32或NTFS文件系统,必须通过FTL或NTFL进行转换,其中FTL针对NORFlash,而NTFL针对NAND Flash。 - 尽管有了FTL,但毕竟多了一层处理,这样对I/O效率的影响较大,所以人们开发了专门针对Flash的文件系统,其中YAFFS就是应用比较广泛的一种。 YAFFS是Yet Another Flash File System的简称,目前有YAFFS和YAFFS2两个版本。这两个版本的主要区别是,YAFFS2可支持大容量的NADN Flash,而YAFFS只支持页的大小为512字节的NAND Flash。YAFFS使用OOB(Out Of Bind)来组织文件的结构信息,所以在Vold代码中,可以见到OOB相关的字样。 关于嵌入式存储方面的知识就介绍到这里。有兴趣深入了解的读者可阅读有关驱动开发方面的书籍。 3. Android mtd设备的介绍 这里以我的HTC G7手机为例,分析Android系统中MTD设备的使用情况。 通过adb cat /proc/mtd,得到图9-13所示的MTD设备的使用情况: :-: ![](http://img.blog.csdn.net/20150802164826476?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 图9-13 G7 MTD设备使用情况 这几个设备对应存储空间的大小和作用如下: - MTD0,主要用于存储开机画面。此开机画面在Android系统启动前运行,由Bootloader调用,大小为1MB。 - MTD1,存储恢复模式的镜像,大小为4.5MB。 - MTD2,存储kernel镜像,大小为3.25MB。 - MTD3,存储sytem镜像,该分区挂载在/system目录下,大小为250MB。 - MTD4,缓冲临时文件,该分区挂载在/cache目录下,大小为40MB。 - MTD5,存储用户安装的软件和一些数据,我的G7把这个设备挂载在/mnt/asec/mtddata目录下,大小为150.75MB。 >[info] **注意**,上面的设备和挂载点与具体的机器及所刷的ROM有关。 [^write]: 参考资料为《Linux设备驱动开发详解》,宋宝华,第530页-531页,人民邮电出版社,2008年。 [^platform]: 参考资料为《Linux设备驱动开发详解》,宋宝华,第556页-560页,人民邮电出版社,2008年。