请选择 进入手机版 | 继续访问电脑版
查看: 190|回复: 5

[分享] 【经验分享】i.MX6ULL开发:嵌入式Linux开发3-Kernel移植

[复制链接]
  • TA的每日心情
    开心
    2020-12-18 12:56
  • 签到天数: 55 天

    [LV.5]常住居民I

    31

    主题

    169

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    1158
    最后登录
    2022-11-15
    发表于 2022-8-16 10:09:31 | 显示全部楼层 |阅读模式
    本文进行Linux内核的移植。
    1 Linux内核简介
    官网:https://www.kernel.org/
    图片 14.png
    NXP 会从linux内核官网下载某个版本,然后将其移植到自己的 CPU上,测试成功后就会将其开放给NXPCPU开发者。开发者下载 NXP 提供的 Linux 内核,然后将其移植到自己的产品上。
    本文我们就使用NXP提供的Linux源码,文件名为:linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
    2 Linux内核编译
    编译内核之前需要先在ubuntu上安装lzop库,另外,图形化配置工具还需要ncurses库支持,安装命令为:
    1. sudo apt-get install lzopsudo apt-get install build-essentialsudo apt-get install libncurses5-dev
    复制代码

    Ubuntu中新建一个文件夹,然后将linux内核压缩包拷贝到文件夹中并解压,解压命令为:
    1. tar -vxf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
    复制代码

    解压完成后
    图片 15.png
    进入该文件夹,新建一个build.sh脚本文件来编译,脚本中的内容如下:
    1. #!/bin/sh
    2. make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
    3. make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_mfg_defconfig
    4. make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
    5. make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j8
    复制代码

    给予该脚本可执行权限,然后运行,编译的时候会弹出Linux图形配置界面, 这里不需要做任何的配置, 直接按两下ESC键退出图形界面
    图片 16.png
    之后会自动开始编译Linux内核。
    图片 17.png
    编译完成以后就会在arch/arm/boot这个目录下生成一个zImage文件,该文件就是要用的Linux镜像文件。另外也会在arch/arm/boot/dts下生成很多.dtb 文件,这些.dtb 就是设备树文件。
    vmlinux Image zImage uImage  的区别
    vmlinuxELF格式的文件,是编译出来的最原始的内核文件,编译出来 差不多有16MB,是未压缩的。在实际中我们不会使用vmlinux,而是使用zImageuImage这样的 Linux 内核镜像文件。
    ImageLinux内核镜像文件,但是Image仅包含可执行的二进制数据。Image就是使用objcopy取消掉vmlinux中的一些其他信息,比如符号表什么的。但是 Image 是没有压缩过的,Image保存在arch/arm/boot目录下,其大小大概在12MB
    zImage是经过gzip压缩后的Image,经过压缩以后其大小大概在6MB左右。
    uImage是老版本uboot专用的镜像文件,uImag是在zImage前面加了一个长度为 64字节的“头” ,这个头信息描述了该镜像文件的类型、加载位置、生成时间、大小等信息。但是新的uboot已经支持了 zImage 启动! 所以已经很少用到uImage了。
    3 Linux内核源码结构
    Linux内核编译过程会生成一些文件,下面来看一下编译后的内核源码结构,可以看出多出了一些编译文件
    图片 18.png
    具体描述如下:
    图片 19.png
    arch目录
    这个目录是和架构有关的目录,比如armarm64avr32x86等等架构。每种架构都对应一个目录,在这些目录中又有很多子目录,比如bootcommonconfigs等等。
    block目录 blockLinux下块设备目录, 像SD卡、EMMCNAND、硬盘等存储设备就属于块设备,block目录中存放着管理块设备的相关文件。
    crypto目录 crypto目录里面存放着加密文件,比如常见的crccrc32md4md5hash等加密算法。
    Documentation目录 此目录里面存放着Linux相关的文档,如果要想了解Linux某个功能模块或驱动架构的功能,就可以在Documentation目录中查找有没有对应的文档。
    drivers目录 驱动目录文件,此目录根据驱动类型的不同,分门别类进行整理,比如drivers/i2c就是I2C相关驱动目录,drivers/gpio就是GPIO相关的驱动目录,这是我们学习的重点。
    firmware 目录 此目录用于存放固件。
    fs目录 此目录存放文件系统,比如fs/ext2fs/ext4fs/f2fs等,分别是ext2ext4 f2fs等文件系统。
    4 Linux内核启动测试
    将编译出来的zImageimx6ull-14x14-evk.dtb复制到Ubuntu中的tftp目录下,之后会通过uboot tftp命令将其下载到开发板中。
    在测试之前确保uboot中的环境变量bootargs内容如下(使用print指令查看):
    1. console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw
    复制代码

    图片 20.png
    如果不是的话,可以使用如下指令设置一下:
    1. <p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:Calibri;mso-fareast-font-family:宋体;
    2. mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;mso-font-kerning:1.0000pt;">setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'</span><span style="mso-spacerun:'yes';font-family:Calibri;mso-fareast-font-family:宋体;
    3. mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:Calibri;mso-fareast-font-family:宋体;
    4. mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;mso-font-kerning:1.0000pt;">saveenv</span></p>
    复制代码

    然后可以测试了,启动开发板,串口中进入uboot命令行模式,然后输入如下命令将zImageimx6ull-14x14-evk.dtb下载到开发板中并启动:
    1. <p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:Calibri;mso-fareast-font-family:宋体;
    2. mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;mso-font-kerning:1.0000pt;">tftp 80800000 zImage</span><span style="mso-spacerun:'yes';font-family:Calibri;mso-fareast-font-family:宋体;
    3. mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:Calibri;mso-fareast-font-family:宋体;
    4. mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;mso-font-kerning:1.0000pt;">tftp 83000000 imx6ull-14x14-evk.dtb</span><span style="mso-spacerun:'yes';font-family:Calibri;mso-fareast-font-family:宋体;
    5. mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:Calibri;mso-fareast-font-family:宋体;
    6. mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;mso-font-kerning:1.0000pt;">bootz 80800000 - 83000000</span></p>
    复制代码

    可以看到内核启动了
    图片 21.png
    最后到了系统登录处,说明Linux系统正常启动了(这次LCD上没有了野火的图形界面,可能是某些固件不匹配吧,先忽略)
    图片 22.png
    4.1 根文件系统缺失的错误
    Linux内核启动以后是需要根文件系统的,根文件系统存在哪里是由ubootbootargs环境变量指定, bootargs会传递给Linux内核作为命令行参数 。 比如之前设置的root=/dev/mmcblk1p2,也就是说根文件系统存储在/dev/mmcblk1p2中,即EMMC的分区2中。
    因为上一篇的测试时,EMMC的分区2中烧写好了根文件系统,所以设置root=/dev/mmcblk1p2,并且内核正常启动。如果我们不设置根文件系统路径,或者说根文件系统路径设置错误的话会出现什么问题?
    我们将uboot中的bootargs环境变量改为“console=ttymxc0,115200” ,也就是不填写root的内容了,命令如下:
    1. <p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:Calibri;mso-fareast-font-family:宋体;
    2. mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;mso-font-kerning:1.0000pt;">setenv bootargs 'console=ttymxc0,115200'</span><span style="mso-spacerun:'yes';font-family:Calibri;mso-fareast-font-family:宋体;
    3. mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;mso-font-kerning:1.0000pt;"><o:p></o:p></span></p><p class="MsoNormal"><span style="mso-spacerun:'yes';font-family:Calibri;mso-fareast-font-family:宋体;
    4. mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;mso-font-kerning:1.0000pt;">saveenv</span></p>
    复制代码

    修改完成以后重新从网络启动,可以看到也是先启动了内核:
    图片 23.png
    但启动以后会有类似如下的错误:
    图片 24.png
    最后会有下面这一行:
    1. Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
    复制代码

    提示内核崩溃,因为VFS(虚拟文件系统)不能挂载根文件系统,目录不存在。即使目录存在,如果根文件系统目录里面是空的依旧会提示内核崩溃。
    5 Linux中添加自己的开发板
    编译NXP官方I.MX6ULL EVK开发板对应的Linux内核,发现其可以在野火的EMMC版本开发板启动。为了进一步了解Linux内核,我们可以参考官方开发板的设置,在Linux内核中添加自己的开发板。
    5.1 添加开发板默认配置文件
    arch/arm/configs目录下的imx_v7_mfg_defconfig重新复制一份 命名为自己开发板,如imx_myboard_defconfig
    5.2 添加开发板对应的设备树文件
    进入arch/arm/boot/dts目录中,复制一份imx6ull-14x14-evk.dts,然后将其重命名为imx6ull-myboard.dts
    然后还需要修改文件arch/arm/boot/dts/Makefile,找到 dtb-$(CONFIG_SOC_IMX6ULL)配置项,在此配置项中加入“imx6ull-myboard.dtb”
    图片 25.png
    这样编译Linux的时候就可以从imx6ull-myboard.dts 编译出 imx6ull-myboard.dtb 文件了。
    总结一下以上的修改主要包括:
    图片 26.png
    主要就是对文件复制一份并重命名,唯一修改的是Makefile文件。
    5.3 添加新的编译脚本
    新建一个build_myboard.sh,写入如下内容:
    1. #!/bin/sh
    2. make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
    3. make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_myboard_defconfig
    4. make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
    5. make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j8
    复制代码

    编译出zImagearch/arm/boot目录)和imx6ull-myboard.dtb (arch/arm/boot/dts目录)后再次进行Linux启动测试,可以到登录提示,说明Linux内核启动成功。


    签到
    回复

    使用道具 举报

  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 154 天

    [LV.7]常住居民III

    2

    主题

    359

    帖子

    0

    高级会员

    Rank: 4

    积分
    756
    最后登录
    2022-12-9
    发表于 2022-8-16 10:49:39 | 显示全部楼层
    楼主,像你们这做Linux内核的人员,会不会修改Linux内核的源代码?
    今天天气不错!签到!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    20 小时前
  • 签到天数: 787 天

    [LV.10]以坛为家III

    20

    主题

    9058

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    9549
    最后登录
    2022-12-9
    发表于 2022-8-16 11:00:54 | 显示全部楼层
    codingtuzi 发表于 2022-8-16 10:49
    楼主,像你们这做Linux内核的人员,会不会修改Linux内核的源代码?

    必须要会修改啊!
    跟着日天混,三天饱九顿!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 154 天

    [LV.7]常住居民III

    2

    主题

    359

    帖子

    0

    高级会员

    Rank: 4

    积分
    756
    最后登录
    2022-12-9
    发表于 2022-8-16 11:08:57 | 显示全部楼层

    那这就是传说中的 给内核打补丁吧~~
    是因为修改Linux内核的bug吗?
    今天天气不错!签到!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    20 小时前
  • 签到天数: 787 天

    [LV.10]以坛为家III

    20

    主题

    9058

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    9549
    最后登录
    2022-12-9
    发表于 2022-8-16 16:09:20 | 显示全部楼层
    codingtuzi 发表于 2022-8-16 11:08
    那这就是传说中的 给内核打补丁吧~~
    是因为修改Linux内核的bug吗?

    主要是要根据硬件改写驱动啊
    跟着日天混,三天饱九顿!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    7

    帖子

    0

    新手上路

    Rank: 1

    积分
    27
    最后登录
    2022-12-1
    发表于 2022-11-30 10:33:50 | 显示全部楼层
    请问下,内核使用的是linux-imx-5.4.47_2.2.0,编译生成了blmage而不是zlmage,对后续步骤有影响吗
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2022-12-9 20:17 , Processed in 0.081212 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表