嵌入式linux-Jffs2根文件系统jffs2_scan_eraseblock()错误
开发板自己做的,u-boot启动对flash的操作完全没问题;
内核用ramdisk启动后挂载jffs2文件系统的话,操作都正常(创建,删除,复制文件等),
但是把jffs2作为根文件系统启动的话在里面的部分文件操作会出错。
创建根文件系统的命令及参数:
/sbin/mkfs.jffs2 --eraseblock=0x10000 -l -n -d ramdisk -o rootfs.jffs2 --pad=0x400000
我对过eraseblock是正确的
1.创建空文件夹或空文件,如果文件名超过6位就不能创建
mkdir test111
MTD do_write_buffer(): WRITE 0x006eef90(0x00001985)
MTD do_write_buffer(): WRITE 0x006eefa0(0x00000001)
MTD do_write_buffer(): WRITE 0x006eefc0(0x00000000)
MTD do_write_buffer(): WRITE 0x006eefd4(0x00001985)
MTD do_write_buffer(): WRITE 0x006eefe0(0x0000000f)
MTD do_write_buffer(): WRITE 0x006eeffc(0x00006577)
MTD do_write_oneword(): WRITE 0x006eeffc(0x00006169)
Write of 47 bytes at 0x002eefd4 failed. returned -5, retlen 44
并且会造成一个文件节点的CRC错误,以后每次启动都会显示。
jffs2_scan_dirent_node(): Name CRC failed on node at 0x002eec94: Read 0x4c902bff, calculated 0x9d3f3ac1
Empty flash at 0x002eecc4 ends at 0x002eece0
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x002eece0: 0x0805 instead
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x002eece4: 0x6a68 instead
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x002eece8: 0x2bff instead
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x002eecec: 0x6530 instead
MTD do_write_buffer(): WRITE 0x006eec50(0x00001985)
2.复制文件 只要文件名小于8位就正常,多于8位同上面的错误一样。
3.编辑文件 用vi编辑文件,不知道是不是超级终端还是busybox编译vi的时候就有错误,
vi中不能删除字符,退格符被定义为ascii码^H(具体不记得是不是这个字符);
修改文件:wq退出后,有时候会出现问题,具体没搞清楚什么情况会有问题什么情况正常。
下面是修改退出后用ls出现的问题(再cat文件可以看出其实是修改了的)
Node totlen on flash (0xffe4ffe4) != totlen from node ref (0x00000044)
jffs2_do_read_inode(): No data nodes found for ino #317
4 再用ramdisk启动挂载上面的jffs2文件系统,挂载时出现:
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0034225c: 0x0006 in
stead
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00342260: 0x73ec in
stead
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00342264: 0xb951 in
stead
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00342268: 0x5e78 in
stead
Further such events for this erase block will not be printed
Empty flash at 0x003425c8 ends at 0x003425e0
Empty flash at 0x003426c8 ends at 0x003426e0
Empty flash at 0x00342fdc ends at 0x00342fe0
Empty flash at 0x00343360 ends at 0x00343380
Empty flash at 0x003433e0 ends at 0x00343400
Eep. Child "makefile~" (ino #310) of dir ino #15 doesn't exist!
/ # cd tets
cd: 5: can't cd to tets
jffs2_get_inode_nodes(): Data CRC failed on node at 0x003427f0: Read 0x0a276
581, calculated 0xeb863f74
/ # cd test
/test # ls
i2c_test.c makefile~ test_gpio.c test_i2c
makefile test_gpio test_gpio.c~
/test #
后面的操作一切又正常了,视乎系统对改flash分区就行了修补
上面的打印信息不是在一次的试验中得到的所以其中的文件名和flash地址不是对应的
我把真个测试jffs2根文件系统的串口信息用附件贴在下面,希望大家帮忙看下问题可能出现在哪里
2008.07.016
JFFS2根文件系统
boot > flinfo
Bank # 1: CFI conformant FLASH (16 x 16) Size: 8 MB in 135 Sectors
AMD Standard command set, Manufacturer ID: 0x01, Device ID: 0x7E1000
Erase timeout: 16384 ms, write timeout: 2 ms
Buffer write timeout: 5 ms, buffer size: 32 bytes
Sector Start Addresses:
02000000 RO 02002000 RO 02004000 RO 02006000 RO 02008000 RO
0200A000 RO 0200C000 RO 0200E000 RO 02010000 RO 02020000 RO
02030000 02040000 02050000 02060000 02070000
02080000 02090000 020A0000 020B0000 020C0000
020D0000 020E0000 020F0000 02100000 02110000
02120000 02130000 02140000 02150000 02160000
02170000 02180000 02190000 021A0000 021B0000
021C0000 021D0000 021E0000 021F0000 02200000
02210000 02220000 02230000 02240000 02250000
02260000 02270000 02280000 02290000 022A0000
022B0000 022C0000 022D0000 022E0000 022F0000
02300000 02310000 02320000 02330000 02340000
02350000 02360000 02370000 02380000 02390000
023A0000 023B0000 023C0000 023D0000 023E0000
023F0000 02400000 02410000 02420000 02430000
02440000 02450000 02460000 02470000 02480000
02490000 024A0000 024B0000 024C0000 024D0000
024E0000 024F0000 02500000 02510000 02520000
02530000 02540000 02550000 02560000 02570000
02580000 02590000 025A0000 025B0000 025C0000
025D0000 025E0000 025F0000 02600000 02610000
02620000 02630000 02640000 02650000 02660000
02670000 02680000 02690000 026A0000 026B0000
026C0000 026D0000 026E0000 026F0000 02700000
02710000 02720000 02730000 02740000 02750000
02760000 02770000 02780000 02790000 027A0000
027B0000 027C0000 027D0000 027E0000 027F0000
Using physmap partition definition
Creating 4 MTD partitions on "phys_mapped_flash":
0x00000000-0x00030000 : "Boot Loader"
mtd: Giving out device 0 to Boot Loader
0x00030000-0x00110000 : "OS Kernel"
mtd: Giving out device 1 to OS Kernel
0x00110000-0x00400000 : "Ramdisk"
mtd: Giving out device 2 to Ramdisk
0x00400000-0x00800000 : "Jffs2"
mtd: Giving out device 3 to Jffs2
VFS: Mounted root (jffs2 filesystem).
Freeing init memory: 76K
BusyBox v1.00 (2008.07.14-09:41+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.
/ # MTD do_erase_oneblock(): ERASE 0x00740000
MTD do_write_buffer(): WRITE 0x00740000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x00730000
MTD do_write_buffer(): WRITE 0x00730000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x00720000
MTD do_write_buffer(): WRITE 0x00720000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x00710000
MTD do_write_buffer(): WRITE 0x00710000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x00700000
MTD do_write_buffer(): WRITE 0x00700000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x006f0000
MTD do_write_buffer(): WRITE 0x006f0000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x007f0000
MTD do_write_buffer(): WRITE 0x007f0000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x007e0000
MTD do_write_buffer(): WRITE 0x007e0000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x007d0000
MTD do_write_buffer(): WRITE 0x007d0000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x007c0000
MTD do_write_buffer(): WRITE 0x007c0000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x007b0000
MTD do_write_buffer(): WRITE 0x007b0000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x007a0000
MTD do_write_buffer(): WRITE 0x007a0000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x00790000
MTD do_write_buffer(): WRITE 0x00790000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x00780000
Newly-erased block contained word 0xa000a at offset 0x00380000
MTD do_erase_oneblock(): ERASE 0x00770000
MTD do_write_buffer(): WRITE 0x00770000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x00760000
MTD do_write_buffer(): WRITE 0x00760000(0x00001985)
MTD do_erase_oneblock(): ERASE 0x00750000
Newly-erased block contained word 0xa000a at offset 0x00350000
/ # ls
betc etc linuxrc root syscfg usr
bin home module sbin test var
dev lib proc sys tmp web