为什么Linux内核不支持jffs,Linux内核及文件系统移植之jffs2烧录后无法启动

近一周的时候都在玩linux 内核及文件系统移植,使用的版本如下:

Bootloader: u-boot-2010.06.tgz

Kernel:   linux-3.0.y.tgz

BusyBox:  busybox-1.16.1.tgz

搜集相应介绍文档后分别编译出U-boot.bin,uImage和rootfs.jffs2镜像文件(稍后抽空整理相应制作过程),当烧写进16M SPI Flash中,上电重启后却进不了系统。

串口输出以下信息:

0818b9ca8b590ca3270a3433284dd417.png

困扰了近两天时间。。。。

期间作过很多尝试和测试,确定了我的u-boot可以成功引导别人的可用的内核及文件系统;而烧录我自己的u-boot及uImage之后,内核引导及初始化完毕,挂载文件系统后将要加载必要的内核模块的时候,出现Kernel panic,如下图:

0818b9ca8b590ca3270a3433284dd417.png

发现问题出在我的根文件系统这里。开始以为是我在镜像烧录的时候没有规划好分区导致烧录的文件系统数据不完整,又对照着文档步骤重新制作了根文件系统,调整分区结构,再次仔仔细细地烧录进去,依旧出现以上错误。

后来在查看制作根文件系统的时候,看到mkfs.jffs2这个生成JFFS2格式文件系统的工具,搜索它的用法,发现它有一个“-e”参数(设定擦除块的大小为(默认: 64KiB)),突然想到上面串口输出的信息中有这么一句:

Further such events for this erase block will not be printed

Node at 0x0024ff48 with length 0x000001bc would run over the end ofthe erase block

Perhaps the file system was created with the wrong erase size?

然后在脚本中找到生成文件系统的命令:

mkfs.jffs2-l -e 0x20000 -d $rootfs_dir -o $target_fs

发现该命令在制作文件系统时块擦除大小设置为128K。于是,当我回过头检查串口输出的系统引导启动信息的时候,终于发现了问题所在:

0818b9ca8b590ca3270a3433284dd417.png

此处显示该SPI Flash的Block大小为64K。原来是我在制作根文件系统时把块擦除大小设置成了128K,与芯片实际的参数不相符导致文件系统不能正常运行。

果断修改mkfs.jffs2后-e参数后面的值为64K:

mkfs.jffs2-l -e 0x10000 -d $rootfs_dir -o $target_fs

重新烧录了文件系统后,问题得到解决!!!

另外,在设置U-boot启动参数的时候,也要注意rootfs分区大小和后面烧录rootfs.jffs2映像的时候erase擦除的大小要对应,否则会出现:系统虽然可以启动,但同时会打印以下信息:

0818b9ca8b590ca3270a3433284dd417.png

记录一下,聊以慰藉!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值