yaffs2中,mount mtd block设备后,insmod就死掉了

发布者:CaptivatingGaze最新更新时间:2016-05-04 来源: eefocus关键字:yaffs2  mount  mtd  block  insmod 手机看文章 扫描二维码
随时随地手机看文章
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体系结构所支持的异常类型

异常类型                           具体含义
复位                         复位电平有效时,产生复位异常,程序跳转到复位处理程序处执行。
未定义指令          遇到不能处理的指令时,产生未定义指令异常。
软件中断                 执行SWI指令产生,用于用户模式下的程序调用特权操作指令。
指令预取中止        处理器预取指令的地址不存在,或该地址不允许当前指令访问,产生指令预取中止异常。
数据中止                处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常。
IRQ                         外部中断请求有效,且CPSR中的I位为0时,产生IRQ异常。
FIQ                      快速中断请求引脚有效,且CPSR中的F位为0时,产生FIQ异常。

异常向量表(Exception Vectors)

地址                             异常                                    进入模式

0x0000,0000                 复位                                     管理模式

ox0000,0004                 未定义指令                          未定义模式

0x0000,0008                 软件中断                              管理模式

0x0000,000c                 中止(预存指令)                中止模式

0x0000,0010                中止(数据)                       中止模式

0x0000,0014                 保留                                     保留

0x0000,0018                 IRQ                                       IRQ

0x0000,001c                  FIQ                                       FIQ

也就是说明,最后出错的预取指中止,就是去本来应该存储对应的指令(代码)的地方,去读取指令,

结果实际取指取出来的是非法的,所以出现此预取指中止异常,死掉了。

5.最后发现,问题出在

include\linux\mtd\nand.h中:

struct nand_buffers {
uint8_t ecccalc[MTD_NAND_MAX_OOBSIZE];
uint8_t ecccode[MTD_NAND_MAX_OOBSIZE];
uint8_t databuf[MTD_NAND_MAX_PAGESIZE + MTD_NAND_MAX_OOBSIZE];
};
databuf的对应的宏:

#define MTD_NAND_MAX_PAGESIZE 2048

#define MTD_NAND_MAX_OOBSIZE 64

因此,在

int nand_scan_tail(struct mtd_info *mtd)
{

...

if (!(chip->options & NAND_OWN_BUFFERS))
   chip->buffers = kmalloc(sizeof(*chip->buffers), GFP_KERNEL);
...
}

kmalloc去申请的空间,就是2048bytes了,这样,对于2K pagesize的nand,肯定是工作正常的,但是对于4K pagesize的,如果上层,比如yaffs2,通过mtd去读取数据,一个page的数据就是4K了,然后会放到这个buffer里面,结果后面2048的系统数据,就被冲掉了,如果系统之后用到这部分的数据或指令,就会有问题。而此处出现的预取指中止异常,那就是说明,后面这2048字节,里面很可能包含了某些系统相关的指令(和其他数据),结果系统执行到这里,取指不正常,所以挂掉了。

【解决办法】

解决办法也很简单,就是把对应的宏,该成足够大,比如:

#define MTD_NAND_MAX_PAGESIZE 8192
#define MTD_NAND_MAX_OOBSIZE   256

这样,以后即使是8K的nand,也可以很好的支持了。

关键字:yaffs2  mount  mtd  block  insmod 引用地址:yaffs2中,mount mtd block设备后,insmod就死掉了

上一篇:ARM(44b0)初学者总结(转载)
下一篇:通过网络添加应用程序到44B0系统全攻略2

推荐阅读最新更新时间:2024-03-16 14:52

英特尔和Google云联手推出Mount Evans芯片以提高数据中心性能
英特尔公司和Alphabet公司的Google云周二表示,他们已经推出了一款共同设计的芯片,可以使数据中心更加安全和高效。代号为Mount Evans的E2000芯片从昂贵的中央处理器(CPU)手中接过了为网卡打包数据的工作,原本这些任务由中央处理器负责计算。 这种芯片还在可能在云中共享CPU的不同客户之间提供了更好的安全性,Google工程副总裁Amin Vahdat对此介绍说。 E2000芯片是由称为内核的基本处理器组成的。一个芯片上可能有数百个内核,因此有时信息会在它们之间流失,针对网络数据传输可靠性要求高的环境,E2000为每个内核都创建了安全路由,以防止这种情况的发生。 全世界的企业和机构正在运行越来越复杂的
[半导体设计/制造]
英特尔和Google云联手推出<font color='red'>Mount</font> Evans芯片以提高数据中心性能
YAFFS2文件系统搭建与配置(Micro2440 + linux 2.6.39)
1. YAFFS2文件系统配置 a) YAFFS2源码下载地址 yaffs2-HEAD-4e188b0.tar.gz:http://www.yaffs.net/download-yaffs-using-git (http://pan.baidu.com/s/1jG7OAP4) b) 解压源码 # tar -xvf yaffs2-HEAD-4e188b0.tar.gz -C ./ c) 为内核打YAFFS2补丁 # cd yaffs2-HEAD-4e188b0/ # ./patch-ker.sh c m ../linux-2.6.39/ d) 配置内核 # m
[单片机]
<font color='red'>YAFFS2</font>文件系统搭建与配置(Micro2440 + linux 2.6.39)
超高数据流通量FPGA新品类中的Block RAM级联架构
概述 随着数据中心、人工智能、自动驾驶、5G、计算存储和先进测试等应用的数据量和数据流量不断增大,不仅需要引入高性能、高密度FPGA来发挥其并行计算和可编程硬件加速功能,而且还对大量数据在FPGA芯片内外流动提出了更高的要求。于是,在FPGA芯片中集成包括片上二维网络(2D NoC)和各种最新高速接口的新品类FPGA芯片应运而生,成为FPGA产业和相关应用的新热点。 拉开这场FPGA芯片创新大幕的是全球最大的独立FPGA技术和产品提供商Achronix半导体公司,其采用7nm工艺打造的Achronix Speedster7t FPGA不仅拥有诸多高性能外围Hard IP,而且是全球首次在FPGA的逻辑阵列上集成了2D N
[嵌入式]
超高数据流通量FPGA新品类中的<font color='red'>Block</font> RAM级联架构
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved