zynq linux内核出错,Zynq-Linux移植学习笔记(二十五)——新内核JFFS2文件系统CRC错误解决...

d7645215db7919bd12dedb622745126a.png

1、背景介绍

最近为了使用PCIe驱动,对Linux内核进行了升级,目前ZYNQ发布的最新版内核为2017.4(对应内核版本4.9),升级虽然解决了PCIe驱动问题,但却引入了另一个奇怪的问题-挂载JFFS2文件系统时会出现如下错误:

jffs2: jffs2_scan_eraseblock(): Node at 0x0000225c {0x1985, 0xe002, 0xe002e002) has invalid CRC 0x84d1586d (calculated 0x1d56aca6)

jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00002260: 0xe002 instead

jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00002264: 0x586d instead

jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00002268: 0x0002 instead

jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0000226c: 0x05b4 instead

jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00002270: 0x81a4 instead

jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00002278: 0x7c00 instead

jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0000227c: 0x91dc instead

jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00002280: 0x584f instead

jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00002284: 0x91f3 instead

jffs2: Further such events for this erase block will not be printed

jffs2: jffs2_scan_eraseblock(): Node at 0x0002012c {0x1985, 0xe002, 0xe002e002) has invalid CRC 0x528c90e9 (calculated 0x1d56aca6)

jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00020130: 0xe002 instead

jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00020134: 0x90e9 instead

jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00020138: 0x0002 instead

jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0002013c: 0x0597 instead

jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00020140: 0x81a4 instead

jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00020148: 0x4000 instead

jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0002014c: 0x91dc instead

jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00020150: 0x584f instead

jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00020154: 0x91f2 instead

jffs2: Further such events for this erase block will not be printed

jffs2: jffs2_scan_inode_node(): CRC failed on node at 0x000206e4: Read 0x8e8855a0, calculated 0x8a540cb6

jffs2: jffs2_scan_eraseblock(): Node at 0x0004598c {0x1985, 0xe002, 0xe002e002) has invalid CRC 0x84d1586d (calculated 0x1d56aca6)

这个问题在老版本的内核(3.14)中是不存在的,具体参看我之前发布的ZYNQ下NOR FLASH文件系统挂载。

询问AVNET工程师,在Xilinx论坛上发帖(链接地址),发现他们都误以为是我的rootfs镜像问题,让我用mkfs.jffs2工具生成rootfs时设置正确的erasesize和pad,其实我的问题与rootfs一毛钱关系没有,我的nor flash存放的是应用,qspi flash才存放rootfs,这完全是两个不同的地方。不过Xilinx论坛上面的老外提到了新版的内核可能存在BUG,这与我GOOGLE到的结果存在一致性,于是最终决定更换文件系统。EX2? EX3?EX4?都试过,貌似只支持硬盘,NOR FLASH这种东西不支持。

最后还是感谢万能的GOOGLE,让我发现了UBIFS。

2、UBIFS准备工作

为了使用UBIFS,需要在rootfs中添加UBIFS文件系统所需的工具,也就是下图列出来的这些b37c1ead411e22673f7503519beb6061.png

由于我之前把rootfs文件系统升级到了petalinux2016.4,文件系统中的工具都是采用arm-linux-gnueabihf进行编译的,为了保持一致性,需要用arm-linux-gnueabihf将mtd-utils重新编译一遍,可以参看这里:

经过了这些坎,可以把UBIFS需要的工具编译出来了,放入rootfs中/usr/bin中吧。

3、内核配置

除了rootfs中添加工具,编译内核的时候也需要启用UBIFS,主要启用两处,一处在驱动中,一处在文件系统中,见下图8c6655a22d06159902c693134d5f036c.png

976bc16f764818f23bc51ba64d8ecabf.png

如果不想每次使用菜单,直接在config文件中增加2行即可。6941d1492d1c00cfeadfb7da9e8562b0.png

4、UBIFS使用

UBIFS中的使用可以参看这里,讲的很全,MTD里面所有的命令都讲了。

对我来说,只需要下面4个命令,

1. ubiformat /dev/mtdX //擦除mtdX

2. ubiattach /dev/ubi_ctrl -m Y //和mtdY关联,/dev/ubi_ctrl需要自己创建

3. ubimkvol /dev/ubi0 -N ubifs -m //创建一个volume,volume才是最终挂载文件系统的地方, /dev/ubi0需要自己创建

4. mount -t ubifs ubi0_0 /mnt/ubifs //挂载UBIFS

注意:上述步骤的1、3项只在Linux下第一次挂载UBIFS时会用到,后续只要直接执行2、4即可。

实验结果如下0093e71519683dc9266160d51cf4f81e.png

这里我创建了一个文件夹123,挂载在MTD1分区,然后通过FTP上传了一个文件上去。fba4c7d98fb9be0283cc6834291d7cbf.png

umount之后再次mount,发现文件还在,文件系统一切正常。

最后可以在脚本中增加命令,让操作系统启动后自动挂载UBIFS文件系统a04019c247b88d9f5b2a583aa27e6295.png

5、总结

被JFF2文件系统mount时CRC校验出错这个问题折腾了差不多有一周,很是煎熬。自己对比了新老内核的源码,还是找不到原因,也做了不少对比试验,增加了打印,依然无解。最后只好换成了UBIFS,希望未来linux内核能解决这个问题吧。不过话说回来,这个过程也让我学到了不少知识,也发现UBIFS比JFFS2要好用一些,算是痛并快乐着吧。分享在这里,希望和我碰见相同问题的童鞋们少走弯路。如果交叉编译器和我一样,可以从这里下载我编译好的tar包:

https://download.csdn.net/download/jj12345jj198999/10349462

文章来源:Felven的博客

注:本文为授权转载文章,如需转载请联系作者授权

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: zynq-linux移植学习笔记应包含以下内容: 1. 对zynq架构和硬件资源的理解,包括PS和PL部分的特点。 2. 如何使用Xilinx SDK来编译和配置u-boot和Linux内核。 3. 如何在硬件平台上运行和调试Linux系统。 4. 怎样在Linux系统中配置和使用各种硬件资源,如DMA、Ethernet、Flash等。 5. 如何在Linux系统中移植和运行应用程序,并与硬件资源进行交互。 6. 如何进行系统优化和资源管理,以提高系统性能和稳定性。 ### 回答2: Zynq是一款Xilinx公司开发的一种嵌入式系统芯片,其使用了双核Cortex-A9处理器和可编程逻辑器件(FPGA)的组合。移植LinuxZynq芯片中,可以使其具备无限的扩展能力,极大地拓展了其应用领域,因此掌握Zynq-Linux移植技术是非常重要的。 Zynq-Linux移植分为四个主要步骤: 第一,准备工作 在移植前,需要确认硬件平台是否支持Linux运行,并且需要对硬件进行配置,最好使用Zynq开发板的官方配置; 第二,内核移植 内核移植是整个移植过程中最关键的一步。需要根据硬件平台的特性对内核进行选择和配置。可以从内核源代码库中获取内核代码,然后进行交叉编译。移植内核的过程中需要注意内核配置参数的设置,同时也要确保内核模块和驱动程序的编写。 第三,文件系统移植移植Linux的过程中,文件系统也是非常重要的。可以使用开发板官方Linux镜像,也可以自己编译镜像。移植文件系统还涉及到root文件系统的配置、挂载方式、网络配置和各种服务的配置等问题。 第四,驱动移植 驱动程序是连接硬件和软件的关键部分,需编写相应的驱动程序来实现对硬件的控制。移植驱动程序的过程中需要关注各种硬件接口和设备驱动API的使用,确保驱动程序与硬件配合良好。 总结来说,Zynq-Linux移植技术的掌握需要具备较强的Linux基础知识、驱动开发经验和交叉编译工具链的使用能力。同时,还需要有耐心和细心,对每个步骤进行仔细的分析和处理。 在学习中,需要结合实际开发项目,多进行实践操作才能更好地掌握Zynq-Linux移植技术,为后续项目的开发和应用提供更好的支持。 ### 回答3: Zynq-7000系列是一种由Xilinx开发的SoC(系统级芯片),它将双ARM Cortex-A9处理器和可编程逻辑(FPGA)集成在一起。这使得开发人员可以使用硬件加速加速器来加速运行在Linux上的各种应用。然而,实现这个目标需要进行移植。 在开始Zynq Linux移植学习笔记之前,需要一些基本的知识。首先,需要了解Linux内核的基本工作原理和Linux驱动程序的编写技术。然后,需要了解FPGA和SoC体系结构。 在开始移植之前,需要为SoC开发板选择正确的Linux发行版。这通常需要考虑处理器体系结构,内存大小和设备驱动程序的可用性。另外,还需要考虑是否需要自定义内核或驱动程序以满足应用程序的需求。 接下来,需要编写设备树文件(DT)来描述SoC架构。设备树文件是一种描述硬件配置信息的特殊语言。它会告诉内核有哪些设备可用以及如何访问这些设备。 接下来,需要配置Linux内核以支持Zynq-7000处理器。这可能包括启用适当的内核配置选项,编写设备驱动程序以及配置启动过程。 最后,需要启动Zynq板并验证Linux系统稳定运行。这些步骤包括在启动过程中将设备树文件加载到内存中,以及启动用户空间应用程序。 总之,移植Zynq Linux是一项复杂的任务,需要广泛的专业知识和技术。但是,它可以为开发人员提供强大的硬件加速支持,使他们能够加速处理一系列计算密集型应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值