问题及表现现象:
1、编译好的image后,烧录到板子上,但是打印如下信息
[ 4821.746195] UBIFS error (ubi0:0 pid 165): ubifs_read_node: bad node type (255 but expected 2)
[ 4821.754843] UBIFS error (ubi0:0 pid 165): ubifs_read_node: bad node at LEB 76:26984, LEB mapping status 0
[ 4821.764455] Not a node, first 24 bytes:
[ 4821.764471] 00000000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........................
[ 4821.781506] UBIFS error (ubi0:0 pid 165): ubifs_readdir: cannot find next direntry, error -22
# ls
[ 4822.882584] UBIFS error (ubi0:0 pid 166): ubifs_read_node: bad node type (255 but expected 2)
[ 4822.891319] UBIFS error (ubi0:0 pid 166): ubifs_read_node: bad node at LEB 76:26984, LEB mapping status 0
[ 4822.900941] Not a node, first 24 bytes:
[ 4822.900955] 00000000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........................
[ 4822.917975] UBIFS error (ubi0:0 pid 166): ubifs_readdir: cannot find next direntry, error -22
# ls
[ 4824.082815] UBIFS error (ubi0:0 pid 167): ubifs_read_node: bad node type (255 but expected 2)
[ 4824.091542] UBIFS error (ubi0:0 pid 167): ubifs_read_node: bad node at LEB 76:26984, LEB mapping status 0
[ 4824.101169] Not a node, first 24 bytes:
[ 4824.101183] 00000000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........................
[ 4824.118203] UBIFS error (ubi0:0 pid 167): ubifs_readdir: cannot find next direntry, error -22
# [ 4836.695188] UBIFS error (ubi0:0 pid 169): ubifs_read_node: bad node type (255 but expected 2)
[ 4836.703902] UBIFS error (ubi0:0 pid 169): ubifs_read_node: bad node at LEB 76:26984, LEB mapping status 0
[ 4836.713523] Not a node, first 24 bytes:
[ 4836.713537] 00000000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........................
[ 4836.730552] UBIFS error (ubi0:0 pid 169): ubifs_readdir: cannot find next direntry, error -22
[ 4838.053497] UBIFS error (ubi0:0 pid 170): ubifs_read_node: bad node type (255 but expected 2)
[ 4838.062140] UBIFS error (ubi0:0 pid 170): ubifs_read_node: bad node at LEB 76:26984, LEB mapping status 0
[ 4838.071753] Not a node, first 24 bytes:
[ 4838.071771] 00000000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........................
[ 4838.088799] UBIFS error (ubi0:0 pid 170): ubifs_readdir: cannot find next direntry, error -22
[ 4840.119082] UBIFS error (ubi0:0 pid 171): ubifs_read_node: bad node type (255 but expected 2)
[ 4840.127754] UBIFS error (ubi0:0 pid 171): ubifs_read_node: bad node at LEB 76:26984, LEB mapping status 0
[ 4840.137379] Not a node, first 24 bytes:
[ 4840.137393] 00000000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........................
[ 4840.154431] UBIFS error (ubi0:0 pid 171): ubifs_readdir: cannot find next direntry, error -22
在后台执行find命令,报找不到命令,并且去/usr/bin/目录下查看,没有任何二进制文件。
后来发现是文件系统被写坏了。看下面的分区表,flash整个512MB,
512MBytes Nand Flash
FLASH_TOTAL_SIZE=0x20000000
FLASH_BLOCK_SIZE=0x40000
FLASH_PAGE_SIZE=0x1000
# SPL 1MB
FLASH_ADDR_SPL=0x00000000
PART_SIZE_SPL=0x00100000
# misc 1MB
FLASH_ADDR_MISC=0x00100000
PART_SIZE_MISC=0x00100000
# pstore 1MB
FLASH_ADDR_PSTORE=0x00200000
PART_SIZE_PSTORE=0x00100000
# factory 1MB
FLASH_ADDR_FACTORY=0x00300000
PART_SIZE_FACTORY=0x00100000
# TT 2MB (fixed address)
FLASH_ADDR_TT=0x00400000
PART_SIZE_TT=0x00200000
# system 6MB
FLASH_ADDR_SYSTEM=0x00600000
PART_SIZE_SYSTEM=0x00600000
# rootfs 64MB
FLASH_ADDR_ROOTFS=0x00c00000
PART_SIZE_ROOTFS=0x04000000
#PART_SIZE_ROOTFS=0x00600000
生成image时候,代码中烧写TT的起始地址写成了0x1F60000,但是这里正确应该写成FLASH_ADDR_TT=0x00400000,但是写成0x1F60000后,这个区域正好是rootfs的烧录地区。因此出现问题。
下面代码flash分区表, size 是指分区大小,erasesize是表示擦除块大小。 0x00400000 (4M),通过这个结构体可知size是本mtd分区的最大字节数空间 ,erasesize是本分区的最小擦除字节数空间(块大小,linux的flash是以块为擦除单位的)
kobe # cat /proc/mtd
dev: size erasesize name
mtd0: 00100000 00040000 "boot"
mtd1: 00100000 00040000 "misc"
mtd2: 00100000 00040000 "pstore"
mtd3: 00100000 00040000 "factory"
mtd4: 00200000 00040000 "tt"
mtd5: 00600000 00040000 "system"
mtd6: 04000000 00040000 "rootfs"
kobe #
具体由linux/drivers/mtd下的mtdcore.c文件中的mtd_read_proc函数来实现:
static inline int mtd_proc_info (char *buf, int i)
{
struct mtd_info *this = mtd_table[i];
if (!this)
return 0;
return sprintf(buf, "mtd%d: %8.8x %8.8x \"%s\"\n", i, this->size,
this->erasesize, this->name);
}
这样引出几个问题,为什么写坏了,分区,系统还能起来?
我只是把rootfs的某一个分区写坏了。