9.4.1 嵌入式系统的存储知识介绍
最后更新于:2022-04-02 05:53:49
用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年。
';