嵌入式系统应用程序升级是比较频繁的,这就需要将flash进行合理的划分,一般情况,flash 的基本分区都有这几部分:
1.uboot分区
2.kernel分区
3.rootfs分区
这三部分是最基本的,一般都有。
如果只是这样分区,然后应用程序和文件系统放在一起,这样的话会导致应用程序升级的时候比较麻烦,因为应用程序与文件系统放在了一起,每次升级的时候都要将文件系统重新擦除、写入,这样升级浪费时间,而且风险很大,如果正在擦除flash或者正在写入映像文件时突然断电了,就会导致设备无法启动了(文件系统损坏)!这样还必须从uboot重新下载文件系统,给升级带来了很大的麻烦。
在嵌入式系统设计的时候一般都会将文件系统与经常更新的应用程序分离开来,放在不同的flash分区里,这样升级的时候只需要对应用程序分区进行擦除重新即可,这样即使升级过程中断电,也不会导致文件系统的损坏,系统依然可以启动。可以将升级程序与文件系统放在一起,这样设备重新启动以后还可以对设备进行升级。
还有一种做法是在Uboot中实现升级,这样也无法避免断电带来的问题,其实最主要的是不能将应用程序与文件系统放在一起。
还有人在flash中做一个“安全模式”分区,系统如果损坏,导致设备无法正常启动,这时可以从安全模式启动,安全模式只提供最基本的功能,比如:升级,网络等,这些基本功能可以帮助你重新做系统。
这个也类似于windows的win PE。
总之,以升级整个文件系统来实现更新应用程序是最不可取的方法。
下面介绍一下嵌入式系统的几种常用的文件系统格式:
其实嵌入式根文件系统的格式大家都知道,常用的有jffs2,cramfs,ramdisk,以及yaffs等,
他们各自的特点就不详细介绍了,百度、谷歌讲的很详细了。
这里说一下我当初学习时一些问题和疑惑的地方。
1.flash分区格式
刚开始总是以为flash的分区要对应一种格式,对这很是疑惑,不懂,别人问我你的根文件系统什么格式?
都不知道怎么回答,后来发现这个flash分区是没有具体的格式的,你下载什么格式的文件系统,它就是什么格式的,并不是像windows下C盘、D盘那样有FAT32格式、NTFS格式,windows下的这些格式也是格式化后才具有的格式,这个格式化的过程也相当于给这个盘里装了一个基本的文件系统。
2.文件系统格式
这里的文件系统格式就是指的上面提到的jffs2、cramfs等,这些文件系统格式需要内核支持,一般通过配置内核来实现支持,在内核中选中相关的选项。
简单介绍一下,产用的搭配方式。
当文件系统稳定后,准备发布产品,正式下入系统与应用程序时,一般将文件系统做成ramdisk形式,这样做的目的是防止嵌入式设备在运行过程中由于外界不良的条件造成的文件系统损坏而导致系统无法启动。ramdisk是系统启动后将文件系统映像从flash读取并解压到内存中运行,所以,设备运行中对文件系统所做的改变,在设备重启后都会恢复。cramfs是只读文件系统,这里为什么没有选择cramfs来作为设备的根文件系统格式呢?cramfs文件系统与ramdisk相比确实也有其优点:那就是他不是全部解压到内存的,而是用到多少,就解压大多数,这样对于嵌入式设备来说,是很节省内存的,不过这样也会造成设备运行时没有ramdisk快;缺点就是cramfs下是无法创建任何文件的,程序正常运行中,难免会重建一些临时文件(比如:Unix域套接字,就会在指定的目录下创建一个文件),所以我感觉还是用ramdisk比较好一些。
cramfs格式并不是全盘否定,将应用程序做成cramfs格式的就是一个不错的选择,应用程序运行的过程中一般我们也是不希望被改动的,这样做成cramfs,是只读的,就不会对其造成损坏。
另外我们的系统里还会做一个参数分区,就是这个分区里用于保存一些基本的参数(配置文件),这个分区要求是可读写的,这时我们就可以考虑jffs2文件系统了,jffs2是可读写的文件系统,专门为嵌入式系统设计的。
一个比较完善的嵌入式系统,至少要做到文件系统、应用程序、参数这些分区,而且格式如上所述。这样很方便以后的升级、维护。