【已解决】yaffs2中,mount mtd block设备后,insmod就死掉了

在使用YAFFS2文件系统挂载MTD块设备后,尝试加载模块(insmod)导致系统卡死。该问题可能与内核结构(struct)、异常处理(exception)以及闪存(flash)管理有关。进一步的测试(testing)和工作流程分析揭示了这个问题的关键所在。

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

【现象】

Linux 2.6.22,加了最新的yaffs2,实现了nand flash驱动后,用mtd test测试驱动工作都正常的。

但是,最新发现一个很诡异的问题:

在mount /dev/mtdblock4 /mnt/usb_msc 后,自动挂载成yaff2文件系统之后,再去insmod任何一个ko,都会死掉,而且还是没有任何输出信息的,连kernel的oops,对应ko里面第一行打印,都没有。

【解决过程】

1.后来经过测试,发现,对于pagesize是2K的nand flash来说(此处由于特殊需要(硬件HW ECC占用太多),所以需要进制yaffs2的tag ecc(以节省空间存放HW ECC)),都是可以正常工作的,但是对于4K Pagesize的nand,就工作不正常。而之前已经用mtd test的一系列工具验证了,2K和4K的nand的驱动,都是可以正常工作的。

2.去看了下mtd层关于2K和4K的,有什么不一样的地方,发现对应的include/mtd-abi.h中,struct nand_ecclayout中,eccpos还是64,所以将其改为128,再去测试,问题如故。

3.其他的,找不到原因了,所以,推断是yaffs2与MTD的兼容等方面的问题。

4.后来又经过测试,以/dev/mtdblock4作为参数,用

insmod dwc_otg.ko 
insmod gadgetfs.ko 
insmod g_file_storage.ko file=/dev/mtdblock4 stall=0 removable=1

去挂载了usb masstorage,去windows中格式化该U盘成fat32,然后去板子上,去

mount /dev/mtdblock4 /mnt/usb_msc -t vfat

挂载成fat分区,然后这样,就可以避开yaffs2,只是和mtd层有关系,结果测试下来,

数据读写,都还是对的,但是还是先mount,后面再执行其他的,涉及到内核数据结果的操作,就还是死掉

即不论是挂载成yaffs2:

mount /dev/mtdblock4 /mnt/usb_msc

还是

mount /dev/mtdblock4 /mnt/usb_msc -t vfat

后面对该分区的数据读写都是OK的,但是就是之后再去

insmod ***.ko 或者其他的loadkmap 等等涉及内核的操作的程序,都会导致内核死掉,而且此处的死掉,

和一般的oops,空指针等还不同,完全没有任何输出。

死掉后,去用rvds连接板子,发现pc始终在0xFFFF000C,对应的就是ARM 的预取指中止异常:

ARM体系结构所支持的异常类型

异常类型                           具体含义
复位

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值