yaffs2文件系统制作
创建yaffs2文件系统

创建yaffs2文件系统版本:Rev1.02008-09更新记录2008.09.09文档创建。
创建yaffs2文件系统-基于Virtual PCTeam MCUZone 本文叙述基于yaffs2创建Linux的根文件系统的过程。
包含了yaffs2的配置与编译,yaffs2格式根文件映像的生成。
Linux版本选择了2.6.26, 开发环境选择了Virtual PC,其它软件可以类推。
一,准备工作1.使用Virtual PC安装Linux虚拟机请参照本站另一篇文档《基于VPC建立ARM_Linux开发环境》。
2.下载相关软件包下载下列软件(可在本站ftp上下载),并传输到Linux虚拟机下。
yaffs2.tar.gz3.准备相关环境请参照本镇另一篇文章《9261上的Linux初步应用3》设置好主机的NFS等环境。
二,配置和编译yaffs21.配置yaffs2首先展开yaffs2的压缩包:由于现在的linux内核(2.6.26)还没有包含对yaffs2的支持,需要对linux内核做一些修改。
首先到linux内核下的fs目录下创建yaffs文件夹:从yaffs2文件夹下复制相关的yaffs文件到yaffs文件夹下:复制yaffs2下的Makefile.kernel到kernel下的yaffs下,并重命名为Makefile:复制Kconfig文件到yaffs文件夹:修改kernel的fs文件夹下的Makefile,将yaffs加入内核编译:修改kernel的fs文件夹下的Kconfig,使得可以配置yaffs:2.编译yaffs2在linux下运行配置程序:由于板子上使用了2K页的NAND因此需要选择对应2048的选项。
完成的配置项:配置完成后保存后退出,开始编译kernel。
Kernel生成后需要将其转换成u-boot格式。
三,制作根文件系统1.编译yaffs2工具在yaffs2/utils下编译工具:生成的工具:注意mkyaffs2image.c,该文件将文件夹输出为yaffs2的image,由于yaffs2的代码使用mtd的驱动来读写NAND,因此可能需要改动代码来使得生成的image和mtd的格式一致,特别是NAND的oob格式。
Linux内核移植和yaffs2根文件系统制作

Linux内核移植和yaffs2根文件系统制作V1.21.1Linux内核基础知识在动手进行Linux内核移植之前,非常有必要对Linux内核进行一定的了解,下面从Linux内核的版本和分类说起。
1.1.1 Linux版本Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如2.6.29.1内核的Makefile中:VERSION = 2PA TCHLEVEL = 6SUBLEVEL = 29EXTRAVERSION = .1其中的“VERSION”和“PA TCHLEVEL”组成主版本号,比如2.4、2.5、2.6等,稳定版本的德主版本号用偶数表示(比如2.6的内核),开发中的版本号用奇数表示(比如2.5),它是下一个稳定版本内核的前身。
“SUBLEVEL”称为次版本号,它不分奇偶,顺序递增,每隔1~2个月发布一个稳定版本。
“EXTRAVERSION”称为扩展版本号,它不分奇偶,顺序递增,每周发布几次扩展本版号。
1.1.2什么是标准内核按照资料上的习惯说法,标准内核(或称基础内核)就是指主要在/维护和获取的内核,实际上它也有平台属性的。
这些linux内核并不总是适用于所有linux支持的体系结构。
实际上,这些内核版本很多时候并不是为一些流行的嵌入式linux系统开发的,也很少运行于这些嵌入式linux系统上,这个站点上的内核首先确保的是在Intel X86体系结构上可以正常运行,它是基于X86处理器的内核,如对linux-2.4.18.tar.bz2的配置make menuconfig时就可以看到,Processor type and features--->中只有386、486、586/K5/5x86/6x86/6x86MX、Pentium-Classic、Pentium-MMX、Pentium-Pro/Celeron/Pentium-II、Pentium-III/Celeron(Coppermine)、Pentium-4、K6/K6-II/K6-III 、Athlon/Duron/K7 、Elan 、Crusoe、Winchip-C6 、Winchip-2 、Winchip-2A/Winchip-3 、CyrixIII/C3 选项,而没有类似Samsun 2410等其他芯片的选择。
Busybox编译及其yaffs2文件系统制作

一、Busybox编译(版本busybox-1.13.0)1、在环境变量中设置交叉编译器的路径(版本cross-4.3.3)2、[*] Build Busybox as a static binary (no shared libs)3、busybox settings->busybox library tuning->username completion、fancy shell prompts4、make menuconfig设置CROSS COMPILE为arm-linux-5、install optin-->[*] Don't use /usr 防止编译后生成的文件安装到主机的/usr 目录下,改变了主机的系统6、make install即可在_install目录下生成bin sbin usr(bin,sbin)及其linuxrc文件(该文件链接到/bin/busybox)二、yaffs2文件系统制作将_install目录下的文件拷贝至~/myroot文件夹下,按如下结构创建目录,并在相应目录下添加如下内容:目录结构/|-- bin (busybox产生)|-- dev (设备名由mknod创建)|-- etc| |-- init.d| `-- sysconfig|-- home (手工创建用户)| |-- san (空)与passwd文件对应| `-- sky (空)与passwd文件对应|-- lib (从交叉编译工具路径拷贝cp -r 4.3.3/arm-none-linux-gnueabi/libc/armv4t/lib/*so* lib -a) |-- mnt (空)|-- proc (空)|-- root (空)|-- sbin (busybox产生)|-- sys (空)|-- tmp (空)|-- usr (busybox产生)| |-- bin (busybox产生)| |-- lib (busybox产生?)| `-- sbin (busybox产生)`-- var (空)dev目录分析dev|-- cp -a /dev/console devcp -a /dev/null devcp -a /dev/ttyS0 devcp -a /dev/ttyS1 dev(mknod -m 600 console c 5 1,这一个没有试过)can't open /dev/s3c2410_serial: No such file or director/dev目录下的console没有弄好就会出现这个问题,最简单的办法就是直接复制过来,具体的机理有待进一步研究etc目录分析etc|-- fstab (指明需挂载的文件系统)|-- group (用户组)|-- init.d (启动文件目录)| `-- rcS (存放系统启动时配置以及自启动加载的进程等)|-- inittab (init进程的配置文件)|-- passwd (密码文件)|-- profile (用户环境配置文件)`-- sysconfig`-- HOSTNAME (存放主机名)【fstab】#device mount-point type options dump fsck orderproc /proc proc defaults 0 0tmpfs /tmp tmpfs defaults 0 0sysfs /sys sysfs defaults 0 0tmpfs /dev tmpfs defaults 0 0var /dev tmpfs defaults 0 0【group】root:*:0:daemon:*:1:bin:*:2:sys:*:3:adm:*:4:tty:*5:disk:*:6:lp:*:7:mail:*:8:news:*:9:uucp:*:10:proxy:*:13:kmem:*:15:dialout:*:20:fax:*:21:voice:*:22:cdrom:*:24:floopy:*:25:tape:*:26:audio:*:29:ppp:x:99:500:x:500:sky501:x:501:sky【init.d/rcS】#!/bin/shPA TH=/sbin:/bin:/usr/sbin:/usr/binrunlevel=Sprevlevel=Numask 022export PATH runlevel prevlevel## Trap CTRL-C &c only in this shell so we can interrupt subprocesse.mount -amkdir /dev/ptsmount -t devpts devpts /dev/ptsecho /sbin/mdev > /proc/sys/kernel/hotplugmdev -smkdir -p /var/lock/bin/hostname -F /etc/sysconfig/HOSTNAME【inittab】#/etc/inittab::sysinit:/etc/init.d/rcSconsole ::askfirst:-/bin/sh(s3c2410_serial0 ::askfirst:-/bin/sh)::ctrlaltdel:/sbin/reboot::shutdown:/bin/umount -a -rs3c2410_serial为串口设备号,名称必须与drivers/serial/samsung.c一致,或则,系统启动时无法找到串口!!/*注意s3c2410上串口的设备名称是/dev/s3c2410_serial[0..3]*/$vim drivers/serial/samsung.c879 static struct uart_driver s3c24xx_uart_drv = {880 .owner = THIS_MODULE,881 .dev_name = "s3c2410_serial",882 .nr = CONFIG_SERIAL_SAMSUNG_UARTS,883 .cons = S3C24XX_SERIAL_CONSOLE,884 .driver_name = S3C24XX_SERIAL_NAME,885 .major = S3C24XX_SERIAL_MAJOR,886 .minor = S3C24XX_SERIAL_MINOR,887 };[root@Sanux /]#ls dev/s3c2410_serial*dev/s3c2410_serial0 dev/s3c2410_serial1 dev/s3c2410_serial2 【passwd】root::0:0:root:/:/bin/shftp::14:50:FTP User:/var/ftp:bin:*:1:1:bin:/bindaemon:*:2:2:daemon:/sbin:nobody:*:99:99:Nobody:/:sky::520:502:Linux User,,,,:/home/sky:/bin/shsan::530:503:san user,,,,:/home/san:/bin/sh【profile】#Ash profile#vim:syntax=sh#No core files by default#ulimit -S -c 0>/dev/null 2>&1USER="`id -un`"LOGNAME=$USERPS1='[\u@\h \W]#'(PS1='[$USER@$HOSTNAME $PWD]#') PATH=$PATHHOSTNAME=`/bin/hostname`export USER LOGNAME PS1 PATH【sysconfig/HOSTNAME】yournamelib目录lib (cp -r 4.3.3/arm-none-linux-gnueabi/libc/armv4t/lib/*so* lib -a) |-- ld-2.8.so|-- ld-linux.so.3 -> ld-2.8.so|-- libBrokenLocale-2.8.so|-- libBrokenLocale.so.1 -> libBrokenLocale-2.8.so|-- libSDL-1.2.so.0 -> libSDL-1.2.so.0.11.0|-- libSDL-1.2.so.0.11.0|-- libSDL-1.2.so.0.11.2|-- libSDL.so -> libSDL-1.2.so.0.11.0|-- libSegFault.so|-- libanl-2.8.so|-- libanl.so.1 -> libanl-2.8.so|-- libc-2.8.so|-- libc.so.6 -> libc-2.8.so|-- libcidn-2.8.so|-- libcidn.so.1 -> libcidn-2.8.so|-- libcrypt-2.8.so|-- libcrypt.so.1 -> libcrypt-2.8.so|-- libdl-2.8.so|-- libdl.so.2 -> libdl-2.8.so|-- libgcc_s.so -> libgcc_s.so.1|-- libgcc_s.so.1|-- libm-2.8.so|-- libm.so.6 -> libm-2.8.so|-- libmemusage.so|-- libnsl-2.8.so|-- libnsl.so.1 -> libnsl-2.8.so|-- libnss_compat-2.8.so|-- libnss_compat.so.2 -> libnss_compat-2.8.so|-- libnss_dns-2.8.so|-- libnss_dns.so.2 -> libnss_dns-2.8.so|-- libnss_files-2.8.so|-- libnss_files.so.2 -> libnss_files-2.8.so|-- libnss_hesiod-2.8.so|-- libnss_hesiod.so.2 -> libnss_hesiod-2.8.so|-- libnss_nis-2.8.so|-- libnss_nis.so.2 -> libnss_nis-2.8.so|-- libnss_nisplus-2.8.so|-- libnss_nisplus.so.2 -> libnss_nisplus-2.8.so|-- libpcprofile.so|-- libpthread-2.8.so|-- libpthread.so.0 -> libpthread-2.8.so|-- libresolv-2.8.so|-- libresolv.so.2 -> libresolv-2.8.so|-- librt-2.8.so|-- librt.so.1 -> librt-2.8.so|-- libsqlite3.so -> libsqlite3.so.0.8.6|-- libsqlite3.so.0 -> libsqlite3.so.0.8.6|-- libsqlite3.so.0.8.6|-- libthread_db-1.0.so|-- libthread_db.so.1 -> libthread_db-1.0.so|-- libutil-2.8.so`-- libutil.so.1 -> libutil-2.8.so说明:linuxrc执行时会依赖lib库文件1)、如果将busybox编译成动态链接的形式,没有lib动态库或者缺少相应的库文件,那么linux会提示无法执行或者找不到相应的库。
深入理解yaffs2文件系统(一)

深⼊理解yaffs2⽂件系统(⼀)深⼊理解yaffs2⽂件系统(⼀)1、Flash⽂件系统1.1、背景已经有多种flash⽂件系统(FFSs)或flash块驱动(在之上运⾏⼀个常规的FS),同时都有优点或缺点。
Flash存储器有⾮常多的限制,这⾥就不⼀⼀列举了。
已经有各种⽅法解决这些限制,以提供⼀个⽂件系统。
必须认识到,“flash”,包括NOR和NAND,各⾃有不同的限制。
很容易被专业术语“flash”误导,误以为⽤于NorFlash的⽅法也⽴即适⽤于NandFlash。
Nand块驱动⼀般采⽤FAT16作为⽂件系统,但不够健壮,也不够贴近Flash的特性。
这些块驱动通过⼀个“本地--物理”的映射层来仿真可写的、类似于磁盘扇区的块。
当使⽤FAT16时,这些⽂件系统⼯作的相当好,它们内存消耗⼩,代码尺⼨也很⼩。
但就像所有基于FAT 的系统⼀样,它们很容易损坏(如,丢失簇)。
其他的途径则是设计整个⽂件系统,不是基于块驱动,⽽且是flash友好的,这允许更多的余地来解决上述所提到的问题。
当前有两个linux⽂件系统能⾮常好的⽀持NorFLash,那就是JFFS以及它的升级版本JFFS2。
这两者都提供⽇志机制,⼤⼤的提升了健壮性,这也是嵌⼊式系统特别重要的⼀个特性。
不幸的是,它们在RAM消耗和启动时间⽅⾯都不是很好。
JFFS在flash中的每⼀个journalling⽇志节点,需要⼀个基于RAM的jffs_node结构,每⼀个节点为48字节。
JFFS2做了⼀个⼤改进,通过剪裁相关的结构体(jffs2_raw_node_ref)⽽减少到16字节。
即使如此,在512字节页⼤⼩128M的NandFlash,按平均节点⼤⼩来算,也需要250000字节约4M⼤⼩。
JFFS和JFFS2在启动时,需要扫描整个flash阵列来查找journaling节点,并决定⽂件结构。
由于NAND容量⼤、慢、连续访问、需要ECC校验,这些特性将导致不可接受的、很长的启动时间。
使用yaffs2img工具制作Android刷机包教程

制作刷机包打开‘yaffs2img浏览器’,点击左上角的‘选取yaffs2文件’选择你刚刚复制出来的files文件夹里的system.img先来认识一下这个软件1.定制软件的提取(此部和制作刷机包没关系,可以不做,想用官方软件的同学可以看看)选择app,右键你想要提取软件,提取就可以了,我是把整个app文件夹提取出来了,不用的软件直接删掉好了2.定制软件的精简在你不想要用的软件上直接右键,删除,就好了,你也可以右键添加你想要用的软件,得把软件改成比较简短的英文名,否则有可能不能用秀一下我精简后的列表,大家可以参照着精简uncher文件的替换下载好你想要用的桌面软件,改名为‘Launcher’,删掉app中的‘Launcher2’,添加进去你改好名字的‘Launcher’就好了,我比较喜欢ADW,所以我把ADW的文件名改为Launcher,替换掉原来的Launcher2就好了4.破音问题的解决在左边导航点选‘etc’,右键添加文件,把附件中的声音配置文件解压出来‘AudioFilter.csv’添加进去就好了AudioFilter.rar (355 Bytes)5.字体的更改下载字体文件,中文字体库一律把名字改名为‘DroidSans Fallback.ttf’,英文字体改为‘DroidSans.ttf ’,加粗的英文字体改为‘DroidSans-Bold.ttf ’然后再左边导航栏点选‘fonts’,把之前自带的字体删除,然后把你改好名字的字体添加进去就好了把国产机皇的字体也分享给大家,中文+英文+英文加粗6.开机音乐和照相机音乐的删除在导航栏点选‘media’,在audio/ui文件夹下,删除‘Bootsound.mp3’(开机音乐)和‘camera_click.ogg’(相机按键音)7.开机画面的定制先导出‘media’中的压缩包‘bootanimation.zip’,解压出来参照着做,里面总共有part0、part1、desc.txt三个,desc文档里的东西是开机画面的播放控制参数240 320 6 p 1 0 part0 p 0 0 part1240 320 6 [240是照片宽度,320是照片高度,6是每秒连续现在六张的意思,也就是帧数,可以根据自己加入连续动画的速度调整大小]p 1 0 part0 [part0文件夹中的画面全部显示一遍,不懂的就不要修改了] p 0 0 part1 [part1中的画面显示一遍并停留在这张画面]添加的图片的要求:240X320,png格式,文件不要太大,图像的编辑可以用‘可牛’,照片大小的压缩可以用‘JPEGImager’全部添加好以后就要压缩成zip格式的包了,选中part0、part1、desc.txt这三个文件,右键选择‘添加到压缩文件’做好压缩包以后,删除原有的‘bootanimation.zip’,添加你刚刚制作的新‘bootanimation.zip’’8.取得永久root权限(未测试,测试完的同学回个帖)9.更版本信息,在rom里签上你自己的名字让你的手机信息里显示你自己的版本,让你的ROM独一无二这是我的版本信息,秀一秀修改方法在此,嘿嘿导出system\build.prop,以记事本的方式打开在图中方框位置添加进你的信息就好了我的修改好是这样的,参照着改就好了,修改完替换掉原有的build.prop就好了慢慢做吧,你专属的ROM制作是那么的简单,嘿嘿10.通知栏,电池,信号,系统图标,关机画面,默认壁纸修改修改这些主要是修改system\ framework 里的‘framework-res.apk’系统框架文件如果新的图标和想要替换掉的分辨率不一样,替换以后显示可能会有点问题,最好分辨率调成一样以后再替换图片编辑可以用PS,也可以用可牛影像,我不会用PS,用的可牛影像10.1关机画面以压缩文件模式打开‘framework-res.apk’,解压出assets文件夹,把assets\images\N600_Shutdown替换成你想要的开机画面就可以了,文件必须是png格式,分辨率为240 x 320,文件名必须为N600_Shutdown,改好之后删掉framework-res.apk中原有的assets文件夹,把修改好的文件夹添加进去就好了10.2默认桌面的修改方法和修改关机画面一样,只要把res\drawable\default_wallpaper替换掉就可以了,格式为JPEG,分辨率为480 x 320,10.3解锁画面的修改在\res\drawable-ldpi里,替换掉里面的图片就好了,也可以替换时间的字体10.4电池,信号,系统图标的修改电池,信号,系统图标的修改同样是直接替换,N600+调用的系统图标都在res\drawable-mdpi目录下,可以用其他手机的framework-res.apk下的图标直接替换掉,我用的是网上下载的,顺便传上来framework-res.rar (3.6 MB)如果把所有图标替换掉也是这个效果,通知栏可以透明,就是显示不是很好有的手机调用图标是res\drawable-hdpi里面的图标,注意区分顺便把魅族M9的framework-res.apk也传上来吧,可以借鉴里面的图标下载地址:/file/f525058b67再给出几张不同颜色的透明图片以供选用,可以放大图片,然后截取你想要的部分透明背景.rar (228.85 KB)10.5设置菜单的修改修改system\app\settings\res里对应的图标就好了,大家可以参考夜游神的美化刷机包进行修改借鉴/thread-156248-1-1.html10.6软件图标和背景的修改还是修改软件里res目录里的图片,套路都是一样的,保持图片的格式分辨率一致就好了,修改完别忘了签名美化教程:安卓APK软件美化图标全图文教程给出一个实例,QQ的美化教程,其他软件的美化都差不多,大家参照着改就好了/bbs/thread-1032572-1-1.html11.保存DIY好的刷机包点选上面的整理另存在弹出的对话框直接点确定就好了以文件名‘system.img’保存在桌面或者其他地方,然后拖到files文件夹中替换原来的system.img文件就好了卡刷包的制作方法有时间再更新接下来你就可以享用自己DIY的rom了第一次在这么权威的论坛发帖,有什么不足请大家多多指教,祝你DIY的开心!!!!最后友情提醒:别忘了顶贴附上我自己制作的精简刷机包[全部没有root,想要root看一下教程]:5.2更新的版本:最精简最稳定的2.2ROM\系统仅占25.14M\系统图标美化\透明电量控制[线刷]/thread-146503-1-1.html以下为4.16版本:NO.1 sdl1836_2.2_华康少女[77.78MB]:/file/f5c483aecfNO.2 sdl1836_2.2_萝莉体[77.72MB]:/file/f58cb22f9fNO.3 sdl1836_2.2_自带字体[73.45MB]:/file/f56880e859下载 (14.73 KB) 2011-4-16 19:13。
yaffs2文件系统实现原理分析

1 概述YAFFS (Yet Another Flash File System )文件系统是专门针对NAND flash 设计的嵌入式文件系统,目前有YAFFS 和Y AFFS2两个版本,两个版本的主要区别之一在于Y AFFS2 能够更好的支持大容量的NAND flash 芯片。
YAFFS 文件系统有些类似于JFFS/JFFS2文件系统,与之不同的是JFFS/JFFS2文件系统最初是针对NOR flash 的应用场合设计的,而NORflash 和NAND flash 本质上有较大的区别,尽管JFFS/JFFS2文件系统也能应用于NANDflash ,但由于它在内存占用和启动时间方面针对NOR 的特性做了一些取舍,所以YAFFS2对NAND flash 来说通常才是最优的选择方案。
2 相关概念分析YAFFS2之前,把NAND flash 相关概念介绍下:NAND flash 由块(block)组成,块又由页(page)构成,擦除时以块为单位,读写时以页为单位,页又包含数据区和空闲区(OOB,Out-Of-Band),而Page 在YAFFS2中被称为Chunk ,其中的数据区用来存放实际的数据,OOB 用来存放附加信息实现NAND flash 的管理。
以T8000 AXMPFUA 单板使用的NANDflash 为例,每块Block: 128 pages ,每页Page: (8K + 448) bytes ,数据区为8K ,OOB 为448bytes ,如图1所示:Plane :4096blocks128 pages(8K+448)bytes图1 NAND flash 物理结构3 数据结构struct yaffs_dev 是YAFFS2文件系统最核心的数据结构,表示Y AFFS2文件系统的超级块,它建立了整个文件系统的层次结构,并衔接VFS 层和MTD 层,与struct super_block 、struct mtd_info 的关系如图2所示:图2 yaffs_dev与super_block、mtd_info层次关系下面围绕struct yaffs_dev这个最核心的数据结构开始,分段介绍它的含义,进而引出其他重要的数据结构:■param:存储文件系统重要的一些参数,以及与MTD层的接口函数□inband_tags:标志位,默认为0,即采用OOB(out of band)方式存储tags,可以通过挂载时指定inband-tags选项改变默认值□total_bytes_per_chunk:每个chunk总的字节数□chunks_per_block:每个block总的chunk数□spare_bytes_per_chunk:每个chunk包含OOB块的字节数□start_block:第一个可以使用的block□end_block:最后一个可以使用的block□n_reserved_blocks:为GC保留的block阈值□n_caches:缓冲区的个数,YAFFS2为减少数据的碎片以及提高性能为每个文件的写入提供了cache□no_tags_ecc:标志位,默认为0,即tags中包括ECC纠错信息,可以通过内核配置改变默认值,CONFIG_YAFFS_DISABLE_TAGS_ECC□is_yaffs2:标志位,默认为0,即Y AFFS,在挂载的过程中会根据识别的mtd->writesize自动转换成YAFFS2□refresh_period:刷新周期,刷新目的主要找出最旧的处于YAFFS_BLOCK_STATE_FULL状态的block,供GC作为gc_block使用□skip_checkpt_rd:标志位,默认为0,支持读取checkpoint,提高挂载速度的一个功能可以通过挂载时指定挂载选项no-checkpoint-read、no-checkpoint修改默认值□skip_checkpt_wr:标志位,默认为0,支持写入checkpoint,提高挂载速度的一个功能可以通过挂载时指定挂载选项no-checkpoint-write、no-checkpoint修改默认值□write_chunk_tags_fn:函数指针,在挂载的文件系统的时候会被初始,NANDflash写入接口函数:param->write_chunk_tags_fn = nandmtd2_write_chunk_tags;□read_chunk_tags_fn:函数指针,在挂载的文件系统的时候会被初始,NANDflash读取接口函数:param->write_chunk_tags_fn = nandmtd2_write_chunk_tags;□erase_fn:函数指针,在挂载的文件系统的时候会被初始,NAND flash擦除block接口函数:param->erase_fn = nandmtd_erase_block;□wide_tnodes_disabled:标志位,默认值为0,采用动态位宽,通过内核配置修改可采用静态位宽CONFIG_YAFFS_DISABLE_WIDE_TNODES■os_context:指向yaffs_linux_context结构指针,该结构存储Y AFFS2运行环境,如下:□context_list:通过该字段加入到yaffs_context_list全局链表中□dev:指向Y AFFS2文件系统超级块的指针□super:指向VFS层超级块的指针□bg_thread:Y AFFS2后台垃圾回收线程的指针□bg_running:启动和停止垃圾回收线程的标志位,1:启动,0:停止□gross_lock:互斥锁,保护整个超级块关键字段的互斥访问,粒度比较大□spare_buffer:OOB块的缓冲区□search_contexts:通过该字段把所有Directory Search Context组成链表□yaffs_mtd_put_super:卸载文件系统时被调用来清理super_block□readdir_process:解决使用NFS死锁问题加入的□mount_id:每个NAND flash分区挂载YAFFS2都分配不同的ID号■driver_context:指向mtd_info结构指针,mtd_info是MTD子系统核心的数据结构,主要是对底层硬件驱动进行封装,这里不再介绍■data_bytes_per_chunk:每个chunk总的字节数,和前面提到的total_bytes_per_chunk一样■chunk_grp_bits :采用静态位宽时超过tnode_width宽度之后的位数,采用动态位宽值恒为0■chunk_grp_size:由chunk_grp_bits转化而来的大小■tnode_width:采用静态位宽默认是16,采用动态位宽是由整个NAND flash中chunk数目计算得到■tnode_mask:位宽的mask,主要用于快速获取chunk id号■tnode_size:YAFFS_NTNODES_LEVEL0节点所占用的内存大小,单位:byte■chunk_shift:主要用来计算logical chunk index以及logical chunk offset■chunk_div:作用同chunk_shift,主要用于chunk大小不是2次幂的情况■chunk_mask:作用同chunk_shift,组合起来计算logical chunk offset■is_mounted:标志位,文件系统挂载时被置位Checkpoint是为提高挂载速度而引入的功能,作用同JFFS2的EBS,以空间来换取时间,卸载时通过在NAND flash上保存文件系统超级块快照,挂载时获取快照信息可以快速还原系统的状态。
yaffs文件系统的建立

file system for disk-less embedded devices. Further information isavailable at (</software/j ffs/>).增加了一些目录,这些目录的设置在fs/yaffs2/Kconfig文件中。
查看fs/Makefile文件,看到有这些变化,加入了yaffs2的支持:# Patched by YAFFSob j-$(CONFI G_YAFFS_FS)+= yaffs2/这样我们来查看内核的情况:内核中已经看到yaffs的相关选项了,我们的器件是512bytes/page的产品,这个下面的选项是关于E CC校验的处理,在YAFFS文件系统中,有自己的E CC校验,而MTD文件系统驱动中,也有自己的E CC校验,一般会在这两者中两者选1,如果将Lets Yaffs do its own E CC选上,就表示选择使用YAFFS的E CC检查。
但是这样的话,要将MTD层的E CC校验关闭,这个我们在下一节再说。
将其选择为编入内核之后,重新编译内核,下载,我们发现内核已经支持yaffs文件系统,第一部分工作完成。
/home/ty $ cat /proc/filesystemsnodev sysfsnodev rootfsnodev bdevnodev procnodev sockfsnodev pipefsnodev futexfsnodev tmpfsnodev eventpollfsnodev devptsext3ext2cramfsnodev ramfsnodev devfsnodev nfsyaffsyaffs2nodev rpc_pipefs2 MTD层的NAND FLASH驱动。
这是整个NAND FLASH文件系统中最难理解和设计的部分。
所幸的是linux的内核已经支持我们的板级上的NAND FLASH了,我们只要做一些修改就可以了。
yaffs2根文件系统的制作

Yaffs2文件系统移植到mini2440现在大部分开发板都可以支持yaffs2 文件系统,它是专门针对嵌入式设备,特别是使用nand flash作为存储器的嵌入式设备而创建的一种文件系统,早先的yaffs仅支持小页(512byte/page)的nand flash,使用yaffs2 就可以支持大页的nand flash。
所谓的根文件系统,就是创建各个目录,并且在里面创建各种文件,比如在/bin,/sbin/目录下存放各种可执行的程序,在/etc目录下存放配置文件,在/lib目录下存放库文件,下面就开始文件系统的移植。
一、准备工作1.Yaffs2源代码的获取在bbb:///node/346可以下载到最新的yaffs2 源代码,如果使用git工具,在命令行输入:就可以下载到yaffs2的源代码,到当前目录下。
2.下载Busybox-1.13.3可以从bbb:///downloads/下载Busybox-1.13.3。
3.下载Yaffs2的整理工具可以到友善之臂的网站下载,mkyaffs2image.tgz,其中解压出来有两个可执行的文件,一个是针对小页的,一个是针对NandFlash大页的,其名字为mkyaffs2image-128M,一开始在这里犯了错误,我的NandFlash是128MB的,可以按照网上用的是mkyaffs2image文件,所以老是出来假坏块的提示,仔细一分析,NandFlash不可能一下子出来这么多的坏块,而且我用他们公司提供的根文件系统却没有任何的问题,所以问题处在了整理Yaffs2的工具上面。
因为这两种大小NandFlash的ECC校验是不一样的,也就是spare区的大小是不一样的,造成了ECC校验出错。
4.链接库整理根文件系统时,要使用到链接库,这里直接使用友善之臂根文件系统中的链接库。
从网站下载root_qtopia.tgz。
使用lib目录下的链接库。
5.给内核打上YAffs2补丁然后进入yaffs2源代码目录执行:#cd yaffs2#./patch-ker.sh c /opt/mini2440/linux-2.6.33.3此时进入linux-2.6.32.2/fs目录,可以看到已经多了一个yaffs2目录。
yaffs2制作教程

Yaffs2根文件系统制作环境:交叉编译环境:4.3.3 (天嵌科技提供,存放路径/opt/EmbedSky/4.3.3)开发平台:TQ24401,编译busybox获取busybox源码busybox-1.17.2.tar (/downloads/)置于目录/opt/embed下#tar jxvf busybox-1.17.2.tar.bz2#cd busybox-1.17.2#vim Makefile将164行改为CROSS_COMPILE = arm-linux- 将190行改为ARCH = arm 保存推出进入配置菜单#make menuconfig 采用默认配置保存推出#make#make install在busybox-1.17.2的根目录下出现了一个_install目录在该目录下又有三个目录文件bin sbin usr 和一个链接文件 linuxrc 。
2,创建根文件系统必要的目录回到/opt/embed目录下创建根文件系统必要的目录#mkdir root_fs#cd root_fs将刚才生成的三个目录bin sbin usr和一个链接文件linuxrc考到目录root_fs下#cp -rf ../busybox-1.17.2/_install/* ./#mkdir dev etc home lib mnt opt proc root sys tmp var创建几个必要的二级目录#mkdir usr/lib usr/share#mkdir etc/rc.d#mkdir var/lib var/lock var/run var/tmp3,创建必要文件(1), 获取库文件 (我的交叉编译工具链放在目录 /opt/EmbedSky/下的)#cp -rf /opt/EmbedSky/4.3.3/arm-none-linux-gn?i/libc/armv4t/lib/* so* lib -a(2),将主机 etc 目录下的passwd、group、shadow文件拷贝到 root_fs/etc 目录下#cp -f /etc/passwd /etc/group /etc/shadow etc将目录/opt/embed/busybox-1.17.2/examples/bootfloppy/etc下的所有文件拷贝到root_fs/etc下。
yaffs2文件系统工具mkyaffs2image

yaffs2⽂件系统⼯具mkyaffs2imageyaffs2⽂件系统是针对nandflash的⽂件系统,其制作⼯具为mkyaffs2image。
⼀、差异不同nand容量,⼯具不⼀样。
⾸先使⽤的是mkyaffs2image,编译⽣成根⽂件系统的镜像之后,下载到板⼦上,启动的时候报错,错误代码这⾥没有上传。
问题出在⼯具使⽤的不正确,查看⼯具⽬录下,发现有mkyaffs2image-128M⼯具,于是在⽹上查阅了⾸先采⽤的mkyaffs2image和mkyaffs2image-128M的区别,发现这对不同的板载nand flash容量,使⽤不同的⼯具制作根⽂件系统。
查看了⾃⼰使⽤的友善之臂板⼦上使⽤的nand flash是256M的,于是果断使⽤mkyaffs2image-128M⼯具制作根⽂件系统。
因为mkyaffs2image-128M针对128M或者更⼤的容量。
⼆、编译If you want to use GIT directly from the command line then public read-only access is available, using the (bash) command:git clone git:///yaffs2mkyaffs2image是在yaffs⽂件系统的utils⽬录下,只把其中的chunkSize spareSize 与 pagesPerBlock⼏个变量,按照nand_flash中的改⼀下就可以⽤。
// Adjust these to match your NAND LAYOUT://#define chunkSize 8192//#define spareSize 232#define chunkSize 4096//#define spareSize 218#define spareSize 128#define pagesPerBlock 128三、使⽤1、验证是否成功可直接在终端下输⼊:mkyaffs2imagemkyaffs2image: image building tool for YAFFS2 built Jul 92009usage: mkyaffs2image dir image_file [convert]dir the directory tree to be convertedimage_file the output file to hold the image'convert' produce a big-endian image from a little-endian machine注意核对convert的⼤⼩端。
NUC97XLinuxyaffs2根文件系统制作

NUC97XLinuxyaffs2根文件系统制作NUC97X Linux yaffs2 根文件系统制作ARM kernrl文件系统中只有一个根文件系统,根文件系统被加载后,还可以再挂载其它文件系统,互不影响。
比如可以在Nandflash,SPI, EMMC,SD,U盘等每个存储模块上挂载不同的文件系统。
每个存储部件又可以具体分为许多块,就像电脑里分成许多盘。
不同部件甚至不同的块也可以有不同的文件系统。
挂载根文件系统后,如果要继续在其它存储部件或不同的块上挂载其它文件系统,可以使用mount命令来实现。
不同的块要被文件系统识别,可以要么在kernel环境下,使用命令把它变成所需要的某种文件格式的块。
也可以使用工具把你要烧录的文件夹,其中可以为空文件做成文件系统可识别的镜像烧到存储区域。
Kernel中默认就有根文件系统,但该文件系统操作的区域为RAM 中,如创建或修改文件,掉电或复位后文件和数据即丢失。
因此要制作能挂载在flash等存储部件的根文件系统,指定具体存储部件和存储位置,以便在ARM平台上运行的kernel能识别系统文件,同事能够保存和同步文件和数据。
制作根文件系统是制作ARM平台的文件系统,而不是制作PC端linux平台的根文件系统。
根文件系统制作过程,参考:Linux BSP\nuc970bsp-release-20161108\Documents\ChineseNUC970 Linux 快速入门.pdf 3.8章节,5.3.1 基本系統設置章节,5.3.4 文件系統設置章节。
開機命令設置–以RAM為根文件系統的設定開機命令設置–以SPI Flash JFFS2文件系統為根文件系統的設定開機命令設置–以NAND Flash YAFFS2文件系統為根文件系統的設定開機命令設置–以NAND Flash UBIFS文件系統為根文件系統的設定開機命令設置–以NFS文件系統為根文件系統的設定開機命令設置–以NAND Flash YAFFS2文件系統為根文件系統的設定介绍一.1.NAND flash的设置使能MTD 的“Caching block device access to MTD devices Device drivers”驅動中的基本設置如果需要由U-boot環境變數傳入就必須將”Command line partition table parsing”選上, 否則會使用驅動程式裡的默認配置, 这里要把该项禁止。
yaffs2 结构

YAFFS2是一种常见的嵌入式文件系统,主要用于NAND闪存设备。
它具有许多优点,如支持大容量存储、快速读取、易于维护等。
YAFFS2文件系统的基本结构包括以下几个部分:
1.超级块(Super Block):超级块是文件系统的元数据,包含了文件系统的
基本信息,如文件系统的类型、大小、创建时间等。
2.块组(Block Group):块组是文件系统中的数据存储单元,由多个块组
成。
每个块组包含一个超级块和多个数据块。
3.数据块(Data Block):数据块是文件系统中的主要存储单元,用于存储文
件和目录的数据。
一个块组中可以有多个数据块,每个数据块包含一定数量的页面。
4.页面(Page):页面是数据块中的最小存储单元,用于存储文件系统中的实
际数据。
一个数据块中可以包含多个页面。
5.目录(Directory):目录用于存储文件和子目录的元数据,如文件名、文
件大小、创建时间等。
6.文件(File):文件是文件系统中的基本存储单元,用于存储用户数据。
一
个目录中可以包含多个文件和子目录。
嵌入式Linux下大容量Nand FLASH的YAFFS2文件系统构建

嵌入式Linux下大容量Nand FLASH的YAFFS2文件系统构建查启鹏;姚国良;张萌【期刊名称】《现代电子技术》【年(卷),期】2007(30)18【摘要】YAFFS2文件系统支持页大小为2 kB的大容量Nand FLASH和一些具有严格写入时序如零重写要求的Nand FLASH,是嵌入式系统中实现对Nand FLASH管理的理想方案.重点分析了YAFFS2相对于YAFFS1所做的两点重要改进,即垃圾回收策略和checkdata的引入,并介绍了Nand FLASH的硬件接口设计和MTD驱动编写方法,给出了Intel Xscale PXA255、Linux 2.4.19平台下,在页大小为2 kB的大容量Nand FLASH上构建YAFFS2的方法和过程.【总页数】4页(P55-58)【作者】查启鹏;姚国良;张萌【作者单位】东南大学,国家专用集成电路系统工程中心,江苏,南京,210096;东南大学,国家专用集成电路系统工程中心,江苏,南京,210096;东南大学,国家专用集成电路系统工程中心,江苏,南京,210096【正文语种】中文【中图分类】TP311【相关文献】1.超大容量NAND Flash文件系统-YAFFS2在Linux下的实现 [J], 龙亚春;黄璞;吴胜2.Yaffs2文件系统中对NAND Flash磨损均衡的改进 [J], 温朝建;严华3.在Linux中实现大容量NAND Flash的YAFFS2文件系统 [J], 展中华;杜刚4.嵌入式Linux下NAND flash上根文件系统的构建 [J], 程建5.Yaffs2文件系统中NAND Flash块选择策略的改进 [J], 杨智;严华因版权原因,仅展示原文概要,查看原文内容请购买。
yaffs2文件系统分析

return -1;
}
dev->nErasedBlocks 记录着器件内所有可供分配的 block 的数量。如果该值小于 1,那显 然是有问题了。不但正常的分配请求无法完成,就连垃圾收集都办不到了。
for (i = dev->internalStartBlock; i <= dev->internalEndBlock; i++) { dev->allocationBlockFinder++;
int i;
yaffs_BlockInfo *bi;
if (dev->nErasedBlocks < 1) { /* Hoosterman we've got a problem.
* Can't get space to gc
/*
T(Y AFFS_TRACE_ERROR,
(TSTR("yaffs tragedy: no more eraased blocks" TENDSTR)));
释放在大多数情况下并不释放对应的物理介质,这是因为
NAND 虽然可以按 page 写,但
只能按 block 擦除,所以物理介质的释放要留到垃圾收集或一个
block 上的所有 page 全部
变成空闲的时候才进行。 根据应用场合的不同, chunk 的释放方式并不唯一,分别由
yaffs_DeleteChunk 函数和 yaffs_SoftDeleteChunk 函数完 成。我们先看 yaffs_DeleteChunk : (该函数在后续版本中被更名为 yaffs_chunk_del()) void yaffs_DeleteChunk(yaffs_Device * dev, int chunkId, int markNAND, int lyn)
YAFFS2文件系统

1 Yaffs文件系统结构1.1 简介1.1.1应用场合Yaffs(Yet Another Flash File System)文件系统是专门针对NAND闪存设计的嵌入式文件系统,目前有YAFFS和YAFFS2两个版本,两个版本的主要区别之一在于YAFFS2能够更好的支持大容量的NAND FLASH芯片。
Yaffs文件系统有些类似于JFFS/JFFS2文件系统,与之不同的是JFFS1/2文件系统最初是针对NOR FLASH的应用场合设计的,而NOR FLASH和NAND FLASH本质上有较大的区别,所以尽管JFFS1/2 文件系统也能应用于NAND FLASH,但由于它在内存占用和启动时间方面针对NOR的特性做了一些取舍,所以对NAND来说通常并不是最优的方案。
1.1.2NOR和NAND的比较基本上NOR比较适合存储程序代码,其容量一般较小(比如小于32MB),价格较高,而NAND容量可达1GB以上,价格也相对便宜,适合存储数据。
一般来说,128MB以下容量NAND FLASH 芯片的一页大小为528字节,用来存放数据,另外每一页还有16字节的备用空间(SpareData,OOB),用来存储ECC校验/坏块标志等信息,再由若干页组成一个块,通常一块为32页16K。
与NOR相比,NAND不是完全可靠的,每块芯片出厂时都有一定比例的坏块存在,对数据的存取不是使用地址映射而是通过寄存器的操作,串行存取数据。
1.2 Yaffs文件系统数据在NAND上的存储方式Yaffs对文件系统上的所有内容(比如正常文件,目录,链接,设备文件等等)都统一当作文件来处理,每个文件都有一个页面专门存放文件头,文件头保存了文件的模式、所有者id、组id、长度、文件名、Parent Object ID等信息。
因为需要在一页内放下这些内容,所以对文件名的长度,符号链接对象的路径名等长度都有限制。
前面说到对于NAND FLASH上的每一页数据,都有额外的空间用来存储附加信息,通常NAND驱动只使用了这些空间的一部分,Yaffs正是利用了这部分空间中剩余的部分来存储文件系统相关的内容。
超大容量NAND Flash文件系统—YAFFS2在Linux下的实现

于超 大容 量 NA ND a Hs h的 YA F 2文 件 系统软 硬 件 实现 方法 。 FS
关键 词 : 入 式 Lnx NA 嵌 i ; ND s; A F 2 MT OMA u Ha Y F S; D; h P 中 图分 类号 : P 3 T 33 文献 标 识 码 : A 文 章 编 号 :6 2 44 (070- 0 0 0 17 — 6 X2 0 )2 0 8 - 5
20 年 6 07 月
Jn 2 0 u.07
超大容量 N N ls A DFah文件系统一Y F S A F2 在 Ln x iu 下的实现 : . l :
龙亚春 , 黄 璞, 吴 胜
( 北京 邮电大学无线 网络实验 室 l 0 7 ) 08 6
摘 要: 通过一个具体应 用实例 , 阐述 了如何在嵌入式 平台( OMAP 9 0 5 1+嵌入 式 Lnx 24 1中创建基 iu 一 .2) .
Cr a e a YAFFS s s O ห้องสมุดไป่ตู้Su r e t 2 Ba e i pe -La g r e NAND a h i Li x Fl s n nu
L ONG - h n t lG u WU Ya- u ,I c UA q P ,
( rl sN t ok a .B i gU i rl o P s n e c m.B q g10 7 ,h a Wi e ew r b, ei n esy f ot a dT l o , ei 0 8 6 i } es L i n v i s e n C n
维普资讯
第 1 卷 第 2期 5
V 1 1 o 2 o . 5N .
北京电子科技学 院学报
J u n l o e j n l c r n c S i n e a d T c n l g n t t t o r a f B i i g E e t o i c e c n e h o o y I s i u e
yaffs2文件系统实现原理分析_带书签

1 概述YAFFS (Yet Another Flash File System )文件系统是专门针对NAND flash 设计的嵌入式文件系统,目前有YAFFS 和Y AFFS2两个版本,两个版本的主要区别之一在于Y AFFS2 能够更好的支持大容量的NAND flash 芯片。
YAFFS 文件系统有些类似于JFFS/JFFS2文件系统,与之不同的是JFFS/JFFS2文件系统最初是针对NOR flash 的应用场合设计的,而NORflash 和NAND flash 本质上有较大的区别,尽管JFFS/JFFS2文件系统也能应用于NANDflash ,但由于它在内存占用和启动时间方面针对NOR 的特性做了一些取舍,所以YAFFS2对NAND flash 来说通常才是最优的选择方案。
2 相关概念分析YAFFS2之前,把NAND flash 相关概念介绍下:NAND flash 由块(block)组成,块又由页(page)构成,擦除时以块为单位,读写时以页为单位,页又包含数据区和空闲区(OOB,Out-Of-Band),而Page 在YAFFS2中被称为Chunk ,其中的数据区用来存放实际的数据,OOB 用来存放附加信息实现NAND flash 的管理。
以T8000 AXMPFUA 单板使用的NANDflash 为例,每块Block: 128 pages ,每页Page: (8K + 448) bytes ,数据区为8K ,OOB 为448bytes ,如图1所示:Plane :4096blocks128 pages(8K+448)bytes图1 NAND flash 物理结构3 数据结构struct yaffs_dev 是YAFFS2文件系统最核心的数据结构,表示Y AFFS2文件系统的超级块,它建立了整个文件系统的层次结构,并衔接VFS 层和MTD 层,与struct super_block 、struct mtd_info 的关系如图2所示:图2 yaffs_dev与super_block、mtd_info层次关系下面围绕struct yaffs_dev这个最核心的数据结构开始,分段介绍它的含义,进而引出其他重要的数据结构:■param:存储文件系统重要的一些参数,以及与MTD层的接口函数□inband_tags:标志位,默认为0,即采用OOB(out of band)方式存储tags,可以通过挂载时指定inband-tags选项改变默认值□total_bytes_per_chunk:每个chunk总的字节数□chunks_per_block:每个block总的chunk数□spare_bytes_per_chunk:每个chunk包含OOB块的字节数□start_block:第一个可以使用的block□end_block:最后一个可以使用的block□n_reserved_blocks:为GC保留的block阈值□n_caches:缓冲区的个数,YAFFS2为减少数据的碎片以及提高性能为每个文件的写入提供了cache□no_tags_ecc:标志位,默认为0,即tags中包括ECC纠错信息,可以通过内核配置改变默认值,CONFIG_YAFFS_DISABLE_TAGS_ECC□is_yaffs2:标志位,默认为0,即Y AFFS,在挂载的过程中会根据识别的mtd->writesize自动转换成YAFFS2□refresh_period:刷新周期,刷新目的主要找出最旧的处于YAFFS_BLOCK_STATE_FULL状态的block,供GC作为gc_block使用□skip_checkpt_rd:标志位,默认为0,支持读取checkpoint,提高挂载速度的一个功能可以通过挂载时指定挂载选项no-checkpoint-read、no-checkpoint修改默认值□skip_checkpt_wr:标志位,默认为0,支持写入checkpoint,提高挂载速度的一个功能可以通过挂载时指定挂载选项no-checkpoint-write、no-checkpoint修改默认值□write_chunk_tags_fn:函数指针,在挂载的文件系统的时候会被初始,NANDflash写入接口函数:param->write_chunk_tags_fn = nandmtd2_write_chunk_tags;□read_chunk_tags_fn:函数指针,在挂载的文件系统的时候会被初始,NANDflash读取接口函数:param->write_chunk_tags_fn = nandmtd2_write_chunk_tags;□erase_fn:函数指针,在挂载的文件系统的时候会被初始,NAND flash擦除block接口函数:param->erase_fn = nandmtd_erase_block;□wide_tnodes_disabled:标志位,默认值为0,采用动态位宽,通过内核配置修改可采用静态位宽CONFIG_YAFFS_DISABLE_WIDE_TNODES■os_context:指向yaffs_linux_context结构指针,该结构存储Y AFFS2运行环境,如下:□context_list:通过该字段加入到yaffs_context_list全局链表中□dev:指向Y AFFS2文件系统超级块的指针□super:指向VFS层超级块的指针□bg_thread:Y AFFS2后台垃圾回收线程的指针□bg_running:启动和停止垃圾回收线程的标志位,1:启动,0:停止□gross_lock:互斥锁,保护整个超级块关键字段的互斥访问,粒度比较大□spare_buffer:OOB块的缓冲区□search_contexts:通过该字段把所有Directory Search Context组成链表□yaffs_mtd_put_super:卸载文件系统时被调用来清理super_block□readdir_process:解决使用NFS死锁问题加入的□mount_id:每个NAND flash分区挂载YAFFS2都分配不同的ID号■driver_context:指向mtd_info结构指针,mtd_info是MTD子系统核心的数据结构,主要是对底层硬件驱动进行封装,这里不再介绍■data_bytes_per_chunk:每个chunk总的字节数,和前面提到的total_bytes_per_chunk一样■chunk_grp_bits :采用静态位宽时超过tnode_width宽度之后的位数,采用动态位宽值恒为0■chunk_grp_size:由chunk_grp_bits转化而来的大小■tnode_width:采用静态位宽默认是16,采用动态位宽是由整个NAND flash中chunk数目计算得到■tnode_mask:位宽的mask,主要用于快速获取chunk id号■tnode_size:YAFFS_NTNODES_LEVEL0节点所占用的内存大小,单位:byte■chunk_shift:主要用来计算logical chunk index以及logical chunk offset■chunk_div:作用同chunk_shift,主要用于chunk大小不是2次幂的情况■chunk_mask:作用同chunk_shift,组合起来计算logical chunk offset■is_mounted:标志位,文件系统挂载时被置位Checkpoint是为提高挂载速度而引入的功能,作用同JFFS2的EBS,以空间来换取时间,卸载时通过在NAND flash上保存文件系统超级块快照,挂载时获取快照信息可以快速还原系统的状态。
一种制作YAFFS2嵌入式文件系统的方法

一种制作YAFFS2嵌入式文件系统的方法
张凡;刘益成
【期刊名称】《电脑开发与应用》
【年(卷),期】2010(023)009
【摘要】介绍了一种制作YAFFS2 嵌入式文件系统的方法,详细介绍了在 ARM 处理器S3SC2440 和嵌入式 Linux 平台上建立YAFFS2 根文件系统的方法步骤.【总页数】3页(P55-56,59)
【作者】张凡;刘益成
【作者单位】长江大学电子信息学院,湖北荆州,434023;长江大学电子信息学院,湖北荆州,434023
【正文语种】中文
【中图分类】TP391.41
【相关文献】
1.一种在嵌入式内核中测试exfat文件系统性能的方法 [J], 杨利
2.一种构建嵌入式Linux根文件系统的方法 [J], 刘二钢
3.一种在嵌入式内核中测试exfat文件系统性能的方法 [J], 杨利;
4.一种掉电安全的嵌入式文件系统设计方法 [J], 凌特利;徐云松;沈沉;张荣良
5.一种嵌入式文件系统的保护及恢复方法 [J], 陈超鑫;肖林松;陈岗;周学成
因版权原因,仅展示原文概要,查看原文内容请购买。
6-制作根文件系统

制作、烧写根文件系统一.装mkyaffs2image工具,并制作映像文件介绍:/wok/nfs_root目录下是已经构造好的各种文件系统:①fs_mini.tar.bz2是最小的根文件系统,里面的设备节点是事先建立好的;②fs_mini_mdev.tar.bz2是最小的根文件系统,里面的设备节点是等系统启动后使用mdev自动建立的;③fs_qtopia.tar.bz2是JZ2440使用的支持触摸屏的根文件系统;④fs_xwindow.tar.bz2是书上的基于X的根文件系统。
1.用cuteFTP将开发板资料/linux/tools/mkyaffs2image拷贝到/work/tools2. cd /work/tools/cp mkyaff2image /bin/chmod +x /bin/mkyaffs2image 给mkyaffs2image添加可执行权限3. mkdir tempcp fs_mini_medev.tar.bz2 ./temp/cd temp/tar xjf fs_mini_medev.tar.bz24.使用mkyaffs2image 制作映像cd /work/nfs_root/tempmkyaffs2image fs_mini_medev fs.yaffs2 目录映像名称二.烧写fs.yaffs2到开发板上1.直接下载虚拟机上的文件到板子上打开secureCRT , COM7口nfs 30000000 192.168.0.3:/work/nfs_root/temp/fs.yaffs2使用nfs命令的前提条件是虚拟机已经安装、配置、启动好了NFS服务附:虚拟机安装、配置、启动NFS服务①.sudo apt-get install nfs-kernel-server portmap (网络开下来)②.他的配置文件是为/etc/exports,以后通过网络文件系统访问/work/nfs_rootsudo vi /etc/exports添加:/work/nfs_root *(rw,sync,no_root_squash)③.重启NFS服务sudo /etc/init.d/nfs-kernel-server restart2 . mtd 查看下根文件所在区的名字nand erase rootnand write.yaffs 30000000 260000 $(filesize)reset (在uboot里面重启是reset)使用NFS1.仅用flash上的根文件系统启动后,手动mount NFSmount -t nfs -o nolock,vers=2 192.168.0.3:/work/nfs_root /mnt2.让开发板通过NFS服务器(即虚拟机)启动,并根据uboot对bootargs的规定printset bootargs noinitrd root=/dev/nfsnfsroot=192.168.1.10:/work/nfs_root/temp/fs_mini_mdev,proto=tcp,nolock,rsize=1024,wsize=1024ip=192.168.1.17:192.168.1.10:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0,115200save配置附录:F:\2440\system\linux-2.6.22.6_jz2440\linux-2.6.22.6\Documentation\nfsroot 格式1:nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]格式2:ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf> 返回开发板原文件系统,修改bootargs:set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
交叉编译器ARM-Linux-gcc4.1.2
开发板TX2440A
Busybox-1.15.1.tar.bz2(在Linux中被称为瑞士军刀)
mkyaffs2image工具
首先创建一个名字为root_2.6.31的文件夹,在其中创建如下文件夹
etc bin var dev home lib mnt proc root sbin sys tmp usr opt共14个文件夹
解压Busybox
tar xjvf busybox
进入源目录,修改Makefile
第164行,CROSS_COMPILE=arm-linux-
第190行,ARCH=arm
执行#make men onfig进行配置
配置选项大部分都是保持默认的,只需要注意选择以下这几个选项,其他的选项都不用动:Busybox Setting--->
Build Options--->
[*]Build Busybox as a static binary(no shared libs)
[*]Build with Large File Support(for accessing files>2GB)
Installation Options--->
(./_install)Busybox installation prefix
进入这个选项,输入busybox的安装路径,如:../rootfs
Busybox Library Tuning--->
[*]vi-style line editing commands
[*]Fancy shell prompts
要选择这个选项:“Fancy shell prompts”,否则挂载文件系统后,无法正常显示命令提示符:“[\u@\h\W]#”
配置完成以后
执行#make
#make install
然后就会在上一级目录下生成rootfs文件夹,里面包含几个文件夹/bin/sbin/usr linuxrc
把这些文件全部复制到刚建好的root_2.6.31目录下,
#cp–rf*../root_2.6.31
在dev目录下,创建两个设备节点:
#mknod console c51
#mknod null c13
然后进入自己建立的etc目录
拷贝Busybox-1.15.2/examples/bootfloopy/etc/*到当前目录下。
#cp-r../../busybox-1.15.2/examples/bootfloopy/etc/*./
包括文件:fstab init.d inittab profile
拷贝/etc/passwd,/etc/group,/etc/shadow到当前目录下。
#cp/etc/passwd./
#cp/etc/group./
#cp/etc/shadow./
修改inittab文件:
内容如下:
console::sysinit:/etc/init.d/rcS
ttyS0::respawn:-/bin/sh
s3c2410_serial0::askfirst:-/bin/sh
::once:/usr/sbin/telnetd-l/bin/login
::ctrlaltdel:/bin/umount-a-r
修改fstab文件,内容如下:
proc/proc proc defaults00
tmpfs/tmp tmpfs defaults00
sysfs/sys sysfs defaults00
tmpfs/dev tmpfs defaults00
var/dev tmpfs defaults00
修改init.d/rcS文件,内容如下:
#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
runlevel=S
prevlevel=N
umask022
export PATH runlevel prevlevel
mount-a
mkdir/dev/pts
mount-t devpts devpts/dev/pts
echo/sbin/mdev>/proc/sys/kernel/hotplug mdev-s
mkdir-p/var/lock
/bin/hostname-F/etc/sysconfig/HOSTNAME 修改profile文件,内容如下:
#Ash profile
#vim:syntax=sh
#No core files by default
#ulimit-S-c0>/dev/null2>&1
USER="`id-un`"
LOGNAME=$USER
PS1='[\u@\h\W]#'
PATH=$PATH
HOSTNAME=`/bin/hostname`
echo"Processing/etc/profile..."
echo"Done"
export USER LOGNAME PS1PATH
在当前目录下(etc)建立文件夹sysconfig,在里面新建HOSTNAME文件,内容为:TX2440A 拷贝库文件:(注意)
进入lib目录,拷贝交叉编译器的库文件到lib目录下(是你使用的那个交叉编译器)#cp-f-a
/opt/toolchains/arm920t-eabi/arm-angstrom-linux-gn?i/lib/*.so*./
由于交叉编译器的库文件比较多,体积较大,所以需要裁剪一下库文件,只保留常用的库文件,具体的裁剪方法可以参考我们提供的文件系统
的源码。
到这里,文件系统的框架已经做好,我们需要把文件系统制作成可以烧写进Nandflash中的yaffs2镜像文件。
使用mkyaffs2image工具,制作yaffs2镜像,这个工具是在yaffs2源码包中utils目录下的mkyaffs2image.c文件编译得到的,如果使用的是大
页NAND,需要修改源码。
把解压出来的可执行文件复制到/usr/bin目录下,
#cp mkyaffs2image/usr/bin
制作文件系统镜像:
#mkyaffs2image root_2.6.31root_2.6.31.bin
root_2.6.31.bin就是yaffs2文件系统镜像,要先修改它的权限,否则该文件无法被复制:#chmod777root_2.6.31.bin
把root_2.6.31.bin下载到nandflash中的文件系统分区中
如果文件系统能正常挂载,终端会打印出:
Please press Enter to activate this console.(按回车)
Processing/etc/profile...
Done
[root@TX2440A/]#
STEP4:完善文件系统
在/mnt目录下创建以下文件夹,用来挂载NFS,SD卡和U盘
nfs sd isk1isk2isk3isk4
设置开发板IP地址:在init.d/rcS文件中加入:
ifconfig lo127.0.0.1
ifconfig eth0192.168.1.10netmask255.255.255.0up
route add default gw192.168.1.1
这样在开机时,就自己设置了IP地址为:192.168.1.10
在/etc/profile中加入:
alias ll=`ls-l`
alias mntnfs=`mount-t nfs-o nolock`
alias mnt1=`mount/dev/sda1/mnt/isk1`
alias umnt1=`umount/mnt/isk1`
alias命令的作用是给一个命令取个别名,可以把较长的命令简化成简单易记的短命令,可以根据自己的需要添加这里的内容。