【ACCESS精品源码栏目提醒】:本文主要为网学会员提供“制作yaffs文件系统 - 其它资料”,希望对需要制作yaffs文件系统 - 其它资料网友有所帮助,学习一下!
北京市博汇科技有限公司 硬件部 BH6467 平台-技术文档 文档名称:制作 yaffs2 文件系统 编 写:__ 黄立波 __ 2010-03-26一、制作文件系统前提条件:1、 一个已经打包的文件系统。
(可以使用 tar czf ../rootfs.tar.gz 命令打包)2、 超级终端或者 minicom。
3、 开发板上有 Uboot、 UBL。
4、 一个具备支持 YAFFS/YAFFS2 和 Flash 的内核: a 配置 YAFFS/YAFFS2 b 配置 Flash c 块为 512 比特的 Nand,HW ECC 关使能。
5、 NFS 文件系统。
6、 MTD 工具。
二、配置内核。
打开配置菜单 host cd (内核目录) host make ARCHarm CROSS_COMPILEarm_v5t_le- xconfig 1. A MTD support选择“Memory Technology Devices MTD”——Direct char device
access to MTD device——Caching block device
access to MTD device 以上两个必须选上,否则/dev/下无 mtd 设备 2. NAND Device Support选择Memory Technology Devices MTD中的NAND Flash Device Drivers3、NAND Flash device on DaVinci SoCB 选择 YAFFS2 file system support。
C、HW ECC 关使能 LSP 1.10 版本(目前使用的 DM6467 不需要做这一步)四、写 Tarball 镜像。
使用 NFS 挂载网络文件系统1、target cat /proc/mtd 测试 mtd 设备。
target cat /proc/mtd dev: size erasesize name mtd0: 00040000 00004000 bootloader mtd1: 00020000 00004000 params mtd2: 00400000 00004000 kernel mtd3: 03ba0000 00004000 filesystem2、target flash_eraseall /dev/mtd3 擦除设备(如果 flash_eraseall 不存在,把 flash_eraseall 文件从/arm/v5t_le/target/usr/bin 中拷贝到你的网络系统中)3、target mount -t yaffs2 /dev/mtdblock3 /mnt解压文件4、target cd /mnt5、target date MMDDhhmmCCYYthis is monthdayhourminutecenturyyear format. i.e. for May 22 10:15 2008 this would bedate 0522101520086、target tar xzf /rootfs.tar.gz7、target cd /8、target umount /mnt启动参数设置 setenv bootargs mem120M consolettyS0115200n8ip192.168.15.20:192.168.15.1:192.168.15.1:255.255.255.0:192.168.15.1::offroot/dev/mtdblock3 rw rootfstypeyaffs2 rw 疑问:root/dev/mtdblock3,怎么会认识/dev/mtdblock3 这个文件呢?关于 Linux 启动时挂载 rootfs 的几种方式1、Linux 启动时,经过一系列初始化之后,需要 mount 根文件系统,为最后运行 init 进程等做准备,mount 根文件系统有这么几种方式: 1)文件系统已经存在于硬盘(或者类似的设备)的某个分区上了,kernel 根据启动的命令行参数(root=/dev/xxx直接进行 mount。
这里有一个问题,在 root 文件系统本身还不存在的情况下,kernel 如何根据/dev/xxx 来找到对应的设备呢?注意:根文件系统和其他文件系统的 mount 方式是不一样的,kernel 通过直接解析设备的名称来获得设备的主、从设 然后就可以访问对应的设备驱动了。
备号, 所以在 init/main.c 中有很长一串的 root_dev_names(如 hdahdabsdasdbnfsrammtdblock……),通过这个表就可以根据设备名称得到设备号。
注意,bootloader 或内核中设定的启动参数(root=/dev/xxx只是一个代号,实际的根文件系统中不一定存在这个设备文件! 2)从软驱等比较慢的设备上装载根文件系统,如果 kernel 支持 ramdisk,在装载 root文件系统时,内核判断到需要从软盘(fdx)mountroot/dev/fd0,就会自动把文件系统映象复制到 ramdisk,一般对应设备 ram0,然后在 ram0 上 mount 根文件系统。
从
源码看,如果 kernel 编译时没有支持 ramdisk,而启动参数又是 root/dev/fd0系统将直接在软盘上mount,除了速度比较慢,理论上是可行的(没试过,不知道是不是这样?) 3)启动时用到 initrd 来 mount 根文件系统。
注意理解 ramdisk 和 initrd 这两个概念,其实 ramdisk 只是在 ram 上实现的块设备,类似与硬盘操作,但有更快的读写速度,它可以在系统运行的任何时候使用,而不仅仅是用于启动;initrd(boot loaderinitialized RAMdisk)可以说是启动过程中用到的一种机制,具体的实现过程也使用 ramdisk 技术。
就是在装载 linux之前,bootloader 可以把一个比较小的根文件系统的映象装载在内存的某个指定位置,姑且 (这里是 initrd 所占的内存,把这段内存称为 initrd 不是 ramdisk, , 注意区别) 然后 bootloader通过传递参数的方式告诉内核 initrd 的起始地址和大小(也可以把这些参数编译在内核中),在启动阶段就可以暂时的用 initrd 来 mount 根文件系统。
initrd 的最初的目的是为了把 kernel 在的启动分成两个阶段: kernel 中保留最少最基本的启动代码,然后把对各种各样硬件设备的支持以模块的方式放在 initrd 中,这样就在启动过程中可以从 initrd 所 mount 的根文件系统中装载需要的模块。
这样的一个好处就是在保持 kernel 不变的情况下,通过修改 initrd 中的内容就可以灵活的支持不同的硬件。
在启动完成的最后阶段,根文件系统可以重新 mount 。
initrd 的具体实到其他设备上,但是也可以不再 重新 mount(很多嵌入式系统就是这样)现过程是这样的:bootloader 把根文件系统映象装载到内存指定位置,把相关参数传递给内 ,核,内核启动时把 initrd 中的内容复制到 ramdisk 中(ram0)把 initrd 占用的内存释放掉,在 ram0 上 mount 根文件系统。
从这个过程可以看出,内核需要对同时对 ramdisk 和 initrd 。
——这个也是 ramdisk 启动过程。
的支持(这种需要都编入内核,不能作为模块) (我的理解是从内存到内存的搬移) 嵌入式系统根文件系统的一种实现方法:对于 kernel 和根文件系统都存储在 flash 中的系统,一般可以利用 linux 启动的 initrd 的机制。
具体的过程前面已经比较清楚了,还有一点就是在启动参数中传递 root/dev/ram0,这样使得用 initrd 进行 mount 的根文件系统不再切换,因为这个时候实际的设备就是 ram0。
还有就是 initrd 的起始地址参数为虚拟地址,需 (即第 3 点说的。
不再重新 mount 了)要和 bootloader 中用的物理地址对应。
内核启动时报“No oob scheme defined for oobsize 256Unable to handle kernel NULL pointer dereference at virtual address 00000000pgd c000400000000000 pgd00000000Internal error: Oops: 805 1”的解决办法:修改 MTD 内核驱动:把内核/driver/mtd/nand/nand_base.c 中的 L2927 行加入如下代码:ifmtd-oobsize 64 Mtd-oobsize 64重新编译内核解决。