|
1 介绍 读NOR Flash就像读SRAM一样,可以从任一地址读取,可以直接从NOR Flash中执行代码,因此在小型系统中,选择NOR Flash是一种好的选择。NOR Flash大小主要从几百KB到64MB。 NAND Flash一般一次读一个block,就象一个硬盘一样。NAND Flash不能直接执行代码。NAND Flash比NOR Flash便宜,同时容量也更大,一般是8MB以上,甚至到GB。 写Flash需要固定的步骤,不象写RAM。写之前一般都要先擦除。 所有的Flash都有分段(Segment)或是分块(Block)的概念,一个段或是块是擦除的最小单元。不能擦除一个或是几个字节。段(块)的大小与具体的产品相关,一般是8KB~128KB。 接下我们重点关注NOR Flash,因为在大部分的uClinux系统中,使用的都是NOR Flash。
3 系统 但通常的用法都是将Flash进行分区,一个典型的分区方案:
这个方案中是把kernel、root filesystem放在不同的分区中,而不象桌面系统或是服务器,通常它们是把kernel放在root文件系统中的。只所以不放在一起,是因为放在一起的话,需要一个智能的bootloader(比如LILO、GRUB),能够知道那些块是kernel而加载到RAM。 有几种方案来放置内核与根文件系统: A、内核――固定位置,根文件系统――固定位置 B、内核,根文件系统紧随内核 C、压缩内核与根文件系统 方案A:方便bootloader查找内核、根文件系统,并方便升级。缺点是要浪费一部分空间 方案B:节约空间,通常是把内核和根文件系统组织成一个文件,这样升级时要把内核和文件系统一起更新 方案C:最节约空间,但需要bootloader解压缩
4 uClinux内核块设备驱动 Blkmem设备 MTD设备 RAM disk设备 Blkmem驱动是最老的驱动,配置复杂; MTD驱动是linux下标准的Flash驱动 很明显,MTD驱动是最强大的Flash的驱动,其允许在Flash上建立read/write的文件系统,比如说JFFS、JFFS2。而Blkmem驱动不行。
5 根文件系统 ROMfs: Cramfs: MTD之上的read/write文件系统,如JFFS、JFFS2
6 Flash工具
7 Flatfsd 下面是配置Flatfsd的步骤
7.1 创建一个可读写的RAM文件系统 将ram1加载到/etc/config目录,这样就可以对/etc/config进行读写,这个目录将被应用程序用来保存配置。
7.2 创建设备 MTD device Block Mem device Disklike device Flatfsd缺省情况下将/etc/config的内容写入设备/dev/flash/config,因此必须将/dev/flash/config与相应的设备关联起来。 如何关联/dev/flash/config? 两种方法:(通过主Makefile或是手工操作都行) 例如我们使用MTD设备(MTD设备的主设备号为90,次设备号为偶数的为可写的设备) 方法一:在主Makefile中(vendors/xxx/目录下) FLASH_DEVICES = \ image,c,90,0 \ config,c,90,2 \ loader,c,90,4
romfs: [ -d $(ROMFSDIR)/$$i ] || mkdir -p $(ROMFSDIR) for i in $(ROMFS_DIRS); do \ [ -d $(ROMFSDIR)/$$i ] || mkdir -p $(ROMFSDIR)/$$i; \ done for i in $(DEVICES); do \ touch $(ROMFSDIR)/dev/@$$i; \ done for i in $(FLASH_DEVICES); do \ touch $(ROMFSDIR)/dev/flash/@$$i; \ done
方法二:在主Makefile中(vendors/xxx/目录下) FLASH_DEVICES = \ image,c,90,0 \ config,c,90,2 \ loader,c,90,4
romfs: [ -d $(ROMFSDIR)/$$i ] || mkdir -p $(ROMFSDIR) for i in $(ROMFS_DIRS); do \ [ -d $(ROMFSDIR)/$$i ] || mkdir -p $(ROMFSDIR)/$$i; \ done for i in $(DEVICES); do \ touch $(ROMFSDIR)/dev/@$$i; \ done $(ROMFSINST) -s /var/tmp /tmp $(ROMFSINST) -s /bin /sbin $(ROMFSINST) -s /var/etc/hosts /etc/hosts $(ROMFSINST) -s /var/etc/resolv.conf /etc/resolv.conf $(ROMFSINST) -s /var/etc/inetd.conf /etc/inetd.conf $(ROMFSINST) -s /var/etc/passwd /etc/passwd $(ROMFSINST) /etc/ssl_cert.pem $(ROMFSINST) /etc/ssl_key.pem $(ROMFSINST) /etc/rc $(ROMFSINST) /etc/ramfs8192.img $(ROMFSINST) /etc/inittab $(ROMFSINST) /etc/services $(ROMFSINST) /etc/motd $(ROMFSINST) -s /dev/mtd2 /dev/flash/config
7.3 启动Flatfsd flatfsd –r 可以实行这一点。一般将这个命令放入启动脚步/etc/rc中,以便在系统启动的时候自动执行。 flatfsd也应当自动在后台执行,可以通过/etc/inittab中添加语句: flt:unknown:/bin/flatfsd /bin/flatfsd & 来启动。
7.4 其它问题 Flatfsd会在写flash的时候写入checksum,当执行flatfsd –r的时候,如果checksum不对,放在/etc/default里面的默认配置将会生效。 Linux联盟收集整理 ,转贴请标明原始链接 |