电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
i.MX6ULL嵌入式Linux开发3-Kernel移植
分 享
扫描二维码分享
i.MX6ULL嵌入式Linux开发3-Kernel移植
i.MX6ULL
ARM
Linux内核
码农爱学习
关注
发布时间: 2021-07-28
丨
阅读: 2109
本文进行Linux内核的移植。 # 1 Linux内核简介 官网:
![](https://cf01.ickimg.com/bbsimages/202107/e94a2d7a9aabe3b0023675a6a882c0e8.png) NXP 会从linux内核官网下载某个版本,然后将其移植到自己的 CPU上,测试成功后就会将其开放给NXP的CPU开发者。开发者下载 NXP 提供的 Linux 内核,然后将其移植到自己的产品上。 本文我们就使用NXP提供的Linux源码,文件名为:linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 # 2 Linux内核编译 编译内核之前需要先在ubuntu上安装lzop库,另外,图形化配置工具还需要ncurses库支持,安装命令为: ```sh sudo apt-get install lzop sudo apt-get install build-essential sudo apt-get install libncurses5-dev ``` 在Ubuntu中新建一个文件夹,然后将linux内核压缩包拷贝到文件夹中并解压,解压命令为: ```sh tar -vxf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 ``` 解压完成后 ![](https://cf01.ickimg.com/bbsimages/202107/18d5a60cac291d480f80f82fcd34d68f.png) 进入该文件夹,新建一个build.sh脚本文件来编译,脚本中的内容如下: ```sh #!/bin/sh make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_mfg_defconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j8 ``` 给予该脚本可执行权限,然后运行,编译的时候会弹出Linux图形配置界面, 这里不需要做任何的配置, 直接按两下ESC键退出图形界面 ![](https://cf01.ickimg.com/bbsimages/202107/bbda363739998c05d8e4ad2b3872e947.png) 之后会自动开始编译Linux内核。 ![](https://cf01.ickimg.com/bbsimages/202107/d3cad6bb8eb0ba036f945ecfff3d7362.png) 编译完成以后就会在`arch/arm/boot`这个目录下生成一个`zImage`文件,该文件就是要用的Linux镜像文件。另外也会在`arch/arm/boot/dts`下生成很多.dtb 文件,这些.dtb 就是设备树文件。 > vmlinux 、Image ,zImage 、uImage 的区别 > > `vmlinux`是ELF格式的文件,是编译出来的最原始的内核文件,编译出来 差不多有16MB,是未压缩的。在实际中我们不会使用vmlinux,而是使用zImage或uImage这样的 Linux 内核镜像文件。 > > `Image`是Linux内核镜像文件,但是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内核编译过程会生成一些文件,下面来看一下编译后的内核源码结构,可以看出多出了一些编译文件 ![](https://cf01.ickimg.com/bbsimages/202107/ebe00ad2d57168e11b1cdd044d07f816.png) 具体描述如下: ![](https://cf01.ickimg.com/bbsimages/202107/bd5cc8dacffd6f5179077485c2d73900.png) - arch目录 这个目录是和架构有关的目录,比如arm、arm64、avr32、x86等等架构。每种架构都对应一个目录,在这些目录中又有很多子目录,比如boot、common、configs等等。 - block目录 block是Linux下块设备目录, 像SD卡、EMMC、NAND、硬盘等存储设备就属于块设备,block目录中存放着管理块设备的相关文件。 - crypto目录 crypto目录里面存放着加密文件,比如常见的crc、crc32、md4、md5、hash等加密算法。 - Documentation目录 此目录里面存放着Linux相关的文档,如果要想了解Linux某个功能模块或驱动架构的功能,就可以在Documentation目录中查找有没有对应的文档。 - drivers目录 驱动目录文件,此目录根据驱动类型的不同,分门别类进行整理,比如drivers/i2c就是I2C相关驱动目录,drivers/gpio就是GPIO相关的驱动目录,这是我们学习的重点。 - firmware 目录 此目录用于存放固件。 - fs目录 此目录存放文件系统,比如fs/ext2、fs/ext4、fs/f2fs等,分别是ext2、ext4 和 f2fs等文件系统。 # 4 Linux内核启动测试 将编译出来的zImage和imx6ull-14x14-evk.dtb复制到Ubuntu中的tftp目录下,之后会通过uboot 的tftp命令将其下载到开发板中。 在测试之前确保uboot中的环境变量bootargs内容如下(使用print指令查看): ```sh console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw ``` ![](https://cf01.ickimg.com/bbsimages/202107/49d3a0adabb8cdc2205ecfe129d9e706.png) 如果不是的话,可以使用如下指令设置一下: ```sh setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw' saveenv ``` 然后可以测试了,启动开发板,串口中进入uboot命令行模式,然后输入如下命令将zImage和imx6ull-14x14-evk.dtb下载到开发板中并启动: ```sh tftp 80800000 zImage tftp 83000000 imx6ull-14x14-evk.dtb bootz 80800000 - 83000000 ``` 可以看到内核启动了 ![](https://cf01.ickimg.com/bbsimages/202107/01577b04dc8f7db5a4175f2647a1c185.png) 最后到了系统登录处,说明Linux系统正常启动了(这次LCD上没有了野火的图形界面,可能是某些固件不匹配吧,先忽略) ![](https://cf01.ickimg.com/bbsimages/202107/b5732378abc7b347b5f6388ff64a8def.png) ## 4.1 根文件系统缺失的错误 Linux内核启动以后是需要根文件系统的,根文件系统存在哪里是由uboot的bootargs环境变量指定, bootargs会传递给Linux内核作为命令行参数 。 比如之前设置的root=/dev/mmcblk1p2,也就是说根文件系统存储在/dev/mmcblk1p2中,即EMMC的分区2中。 因为上一篇的测试时,EMMC的分区2中烧写好了根文件系统,所以设置root=/dev/mmcblk1p2,并且内核正常启动。如果我们不设置根文件系统路径,或者说根文件系统路径设置错误的话会出现什么问题? 我们将uboot中的bootargs环境变量改为“console=ttymxc0,115200” ,也就是不填写root的内容了,命令如下: ```sh setenv bootargs 'console=ttymxc0,115200' saveenv ``` 修改完成以后重新从网络启动,可以看到也是先启动了内核: ![](https://cf01.ickimg.com/bbsimages/202107/598c4b7816146c206c15b003bcafd251.png) 但启动以后会有类似如下的错误: ![](https://cf01.ickimg.com/bbsimages/202107/c607a72acc05761d467ce47df7ac5f2c.png) 最后会有下面这一行: ```sh 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” : ![](https://cf01.ickimg.com/bbsimages/202107/f9c6606a1604c73ee6c03ed07c3280fe.png) 这样编译Linux的时候就可以从imx6ull-myboard.dts 编译出 imx6ull-myboard.dtb 文件了。 总结一下以上的修改主要包括: ![](https://cf01.ickimg.com/bbsimages/202107/bb86ad217dbd9bc812ccd0954babf1c5.png) 主要就是对文件复制一份并重命名,唯一修改的是Makefile文件。 ## 5.3 添加新的编译脚本 新建一个build_myboard.sh,写入如下内容: ```sh #!/bin/sh make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_myboard_defconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j8 ``` 编译出zImage(arch/arm/boot目录)和imx6ull-myboard.dtb (arch/arm/boot/dts目录)后再次进行Linux启动测试,可以到登录提示,说明Linux内核启动成功。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
码农爱学习
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交