Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

基于MIPS架构上的UBI

$
0
0

  关于UBI文件系统,本文不做详细介绍,主要介绍UBI基于MIPS架构的使用相关的东西。

http://www.linux-mtd.infradead.org/doc/ubifs.html  主要介绍了MTD UBIFS的内容

http://www.linux-mtd.infradead.org/doc/ubi.html  主要介绍了MTD UBI的内容

  以上两个地址对于刚接触UBI的同学,请收藏,并坚持看完至少一遍。

  Broadcom芯片方案的MIPS架构上,在kernel2.6.28以后就开始支持UBIFS了,编译内核的时候需要打开对ubi的支持

make menuconfig后

Device Drivers  --->Memory Technology Device (MTD) support  --->UBI - Unsorted block images

File systems  --->Miscellaneous filesystems  --->UBIFS file system support
这样我们的内核就支持UBI了,用mipsel-linux-gcc编译好的vmlinuz内核需要烧录到flash中。

  这里先讲一下broadcom的软件部分组成。

cfe ———— 就是我们常说的bootloader,全称:Common Firmware Environment

kernel  ———— 就是大名鼎鼎的内核了

rootfs  ———— 同样大名鼎鼎的根文件系统,有三种形式:initramfs、cpio-initrd、image-initrd(传统的)

app  ———— 就是我们的应用程序了

  因此分区就就出来了。

cfe 独立分区; nvram 分区(用于cfe环境变量的存储); param分区(用于传递给内核的参数);kernel0分区(第一个内核分区);kernel1(第二个内核分区);app0(第一个应用程序分区); app1(第二个应用程序分区);config(配置文件分区)最后是裸分区。

还有一种分区方式是将rootfs独立出来的分区形式,就是在上述分区中,将多分出两个rootfs分区来用于独立存放rootfs。解释一下为什么需要两个分区来存放kernel和app,主要是做备份用,用于升级,升级的时候是升级备份分区,若升级成功就下次开机就从备份分区起来。

  分区又叫flash map,有三个地方可以修改,分别是: cfe、param、kernel中。

  这里有一个先后顺序问题,在cfe中进行了分区,可以在cfe中使用show devices命令查看到

在param中进行了分区,也就是说分区信息以参数的形式传递给了内核,那么在内核起来后,使用cat /proc/mtd或者cat /proc/partition命令可以看到。

若要在kernel中进行分区,那么就得修改内核代码,在内核代码中处理传进来参数的地方,将传递进来的参数丢弃,使用自己定义的分区即可。(不建议这种方法)

  在支持ubifs的内核中,有一些比较有用的命令: ubiformat 、ubiattach、 ubidetach、ubimkvol、 ubirmvol、ubinfo

  这几个命令的作用比较显而易见,可以通过 -h 参数来学习命令的使用,如: ubiattach -h

  内核起来后在/dev目录下会创建一个ubi_ctrl的设备节点,这个设备节点是所有Ubi分区的控制节点,是关键。这里有一点要说明的是,ubi的设备节点是字符设备,大家都知道字符设备对于应用来说是无法直接挂载并随即读写的,因此就需要在分好区后,使用ubimkvol的方式创建一个ubi卷,这个卷就是一个块设备了,用户就可以直接挂载并自由读写了。

  若需要将分区整成UBI的,最简单的方式就是在传递参数给内核的时候,将mtd.app=ubifs就可以将app分区分成ubi的。当然也可以在内核起来后,在手动或者写一个脚本按照以下顺序来做: ubiattach、ubiformat、ubimkvol、mount -t ubifs ubi0_0  /mnt/app

  考虑到一个问题,flash上的分区是搞好了,那怎么把我们的数据灌进去呢?

  答案很简单,使用tar或者dd命令,tar命令可以将打包好的数据直接解压到你分好的ubi分区即可。

例如dd if=app.bin of=/dev/mtdblock13 ,这样就可以将打包好的app.bin拷贝到/dev/mtdblock13分区中。

  还有一种方式就是写一个程序,使用read/write函数去读(待烧录的程序)写(待烧录的分区)。

 

  最近准备把分区修改掉,不使用那种双备份的形式了,决定改用另外一种方式更节省flash和更智能的方式。

目前的方式有一个比较大的毛病就是如果系统出现死锁或者系统崩溃了,就只能返厂了,无法解决,对后续的维护是一个很大的问题。

暂时先写这些,后面如果想到了,再继续写。

作者:meteor2520 发表于2013-1-13 16:37:41 原文链接
阅读:10 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>