nand flash 写穿案例记录

在将编译好的image烧录到板子后,系统出现UBIFS错误,提示badnodetype和不能找到下一个目录条目,问题源于rootfs分区的某个节点被错误地写入,导致文件系统损坏。错误发生时,ls命令无法执行且/usr/bin/目录下无二进制文件。问题根源是烧录时TT分区的起始地址设置错误,覆盖了rootfs区域。尽管如此,系统仍能启动,但功能受到影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题及表现现象:

        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的某一个分区写坏了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值