在做jffs2根文件系统烧录之后,运行时串口打印错误信息。
在做这个根文件系统的过程中,要弄懂三点,
第一,jffs2文件系统需要有参数进行填充。
第二,在烧录文件系统的过程中nand erase, nand write为什么要在16M的位置开始烧录。
第三,bootargs传参是怎么知道内核启动根文件系统的。
首先遇到的问题是,分区大小设置与烧录地址不匹配。
bootargs 传递的jffs2根文件系统是存放在root=/dev/mtdblock(?) 分区上,我在所要烧录的分区设置过小,文件系统溢出,所以打印错误信息,无法启动。
在重新设置分区之后,解决部分问题。
设置bootargs传参的指令为 set bootargs 'root=/dev/mtdblock2 rootfstype=jffs2 init=/linuxrc console=ttys0,115200'(rootfstype指明所要启动的文件系统类型)
重新进行分区,设置了bootargs传递参数后,把分区和烧录文件匹配的问题解决了。
遇到第二个问题是,jffs2系统填充的问题。
只有jffs2文件系统,它有一个特殊性,要进行填充。jffs2仅仅算文件系统的话只有4M左右,但是要想预留空间必须要对其进行填充,我给文件系统留的分区有40M,因此填充到40M,否则会不停的打印重复的信息。填充指令如下
mkfs.jffs2 -n -s 2048 -e 128KiB -d rootfs -o rootfs.jffs2 --pad=0x1400000
各参数的意义:
(1)-r :指定根文件系统目录.
(2)-o : 指定输出的根文件系统名.
(3)-s : 指定flash每一页的大小;
(3)-e : 指定flash的檫除块的大小,預設是64KB.
要注意,不同的flash, 其page size和block size會不一樣.,如果是K9F2G08U0M,在它的datasheet上有说明
最后的-pad=0x1400000就是填充到的大小(与我所做的情况不符,我的填充大小是40M,因此为0x2800000),如果不填充也无法启动jffs2文件系统
第三个问题是,为什么要在16M的位置开始烧录。
这是我的分区所决定的,我做了四个分区,(0)bootloader,(1)kernel,(2)fs,(3)apps分别为1M,15M,40M,200M,在少根文件系统时,因为指定要烧录在mtdblock2上,即fs分区,而fs分区的起始位置是在16M因此,烧录需要从16M开始烧录,不允许在之前的内存上烧录。
解决了分区重置问题,bootargs传参烧录指定分区问题,jffs2文件系统填充问题,最终boot(执行bootcmd程序代码)启动了文件系统。