Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >i.MX6ULL嵌入式Linux开发3-Kernel移植

i.MX6ULL嵌入式Linux开发3-Kernel移植

作者头像
xxpcb
发布于 2021-08-13 08:41:18
发布于 2021-08-13 08:41:18
1.7K00
代码可运行
举报
运行总次数:0
代码可运行

本文进行Linux内核的移植。

1 Linux内核简介

官网:https://www.kernel.org/

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库支持,安装命令为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt-get install lzop
sudo apt-get install build-essential 
sudo apt-get install libncurses5-dev

在Ubuntu中新建一个文件夹,然后将linux内核压缩包拷贝到文件夹中并解压,解压命令为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tar -vxf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2

解压完成后

进入该文件夹,新建一个build.sh脚本文件来编译,脚本中的内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/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键退出图形界面

之后会自动开始编译Linux内核。

编译完成以后就会在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内核编译过程会生成一些文件,下面来看一下编译后的内核源码结构,可以看出多出了一些编译文件

具体描述如下:

  • 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指令查看):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw

如果不是的话,可以使用如下指令设置一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv

然后可以测试了,启动开发板,串口中进入uboot命令行模式,然后输入如下命令将zImage和imx6ull-14x14-evk.dtb下载到开发板中并启动:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tftp 80800000 zImage   
tftp 83000000 imx6ull-14x14-evk.dtb 
bootz 80800000 - 83000000

可以看到内核启动了

最后到了系统登录处,说明Linux系统正常启动了(这次LCD上没有了野火的图形界面,可能是某些固件不匹配吧,先忽略)

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的内容了,命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
setenv bootargs 'console=ttymxc0,115200' 
saveenv

修改完成以后重新从网络启动,可以看到也是先启动了内核:

但启动以后会有类似如下的错误:

最后会有下面这一行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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” :

这样编译Linux的时候就可以从imx6ull-myboard.dts 编译出 imx6ull-myboard.dtb 文件了。

总结一下以上的修改主要包括:

主要就是对文件复制一份并重命名,唯一修改的是Makefile文件。

5.3 添加新的编译脚本

新建一个build_myboard.sh,写入如下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/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内核启动成功。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农爱学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
i.MX6ULL嵌入式Linux开发2-uboot移植实践
上篇文章,我们介绍了如何使用NXP原厂的uboot进行编译和烧写,将uboot运行在自己的开发板上。NXP原厂的uboot,直接烧录到我的开发板中,LCD的驱动是不正常的,需要进行修改。本篇我们就来继续研究uboot,「使得uboot能匹配我们自己的开发板」。
xxpcb
2021/07/20
1.6K0
i.MX6ULL嵌入式Linux开发1——uboot移植初探
本系列教程以「i.MX6ULL」处理器的ARM开发板为实验基础,学习记录嵌入式Linux开发的各种知识与经验,主要内容包括嵌入式Linux移植,嵌入式Linux驱动开发,嵌入式Linux应用开发等。
xxpcb
2021/07/20
2.7K0
i.MX6ULL嵌入式Linux开发4-根文件系统构建
前面几篇介绍了uboot的移植与内核的移植,本篇进行根文件系统的构建,这是Linux移植三大组成部分的最后一步,根文件系统构建好后,就构成了一个基础的、可以运行的嵌入式Linux最小系统。
xxpcb
2021/08/13
1.2K0
移植NXP官方 linux 5.4 内核到i.MX6ULL开发板
NXP官方linux仓库地址为:https://github.com/Freescale/linux-fslc/tree/5.4-2.1.x-imx。
Mculover666
2022/05/23
3.6K0
移植NXP官方 linux 5.4 内核到i.MX6ULL开发板
i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC与遇到的坑!
前进几篇文章,已经搞定了Linux移植三巨头:uboot、kernel(包含dtb)和rootfs,除了uboot是烧写在SD中的,其它的都是在ubuntu虚拟机的nfs服务器中,运行时必须通过网络将这些文件加载到开发板的内存中运行。
xxpcb
2021/09/09
2.4K0
【i.MX6ULL】驱动开发11——LCD驱动实践
之前在Linux系统移植时提到过LCD驱动,本篇来看下Linux设备树如何配置LCD驱动。
xxpcb
2021/12/27
1.7K0
【i.MX6ULL】驱动开发11——LCD驱动实践
全志H3 | 移植主线最新uboot 2023.04和kernel 6.1.11到Nanopi NEO开发板
编译器下载地址:Downloads | GNU-A Downloads – Arm Developer[1]
Mculover666
2023/08/18
2.3K0
全志H3 | 移植主线最新uboot 2023.04和kernel 6.1.11到Nanopi NEO开发板
移植Linux4.14.13到imx6ull
复制一份imx_v6_v7_defconfig,这里我命名为dfos_mini_defconfig。
哆哆jarvis
2022/08/23
2.6K0
移植Linux4.14.13到imx6ull
【i.MX6ULL】驱动开发5——设备树原理与点亮LED
上篇文章(【i.MX6ULL】驱动开发4--点亮LED(寄存器版))介绍了在驱动程序中,直接操作寄存器了点亮LED。本篇,介绍另外一种点亮LED的方式——设备树,该方式的本质也是操作寄存器,只是寄存器的相关信息放在了设备树中,配置寄存器时需要使用OF函数从设备树中读取处寄存器数据后再进行配置。
xxpcb
2021/10/19
1.8K0
【i.MX6ULL】驱动开发5——设备树原理与点亮LED
IMX6ULL驱动开发实战连载-02设备树的编译和加载
上面介绍的编译模块是和内核一起编译的,这种编译方式比较耗时。在Linux3.x 以后的版本才引入了设备树,有了设备树之后,只需要一次编译内核,编译内核的时候会生成的dtc 工具,利用dtc工具就可以完成驱动的编译。我们这里只是简单介绍如何编译设备树、加载设备树,关于设备树,后面会有更加详细的解释。
嵌入式与Linux那些事
2021/05/20
2.6K0
IMX6ULL驱动开发实战连载-02设备树的编译和加载
构建一个适合stm32mp157系列开发板的嵌入式Linux系统
Linux平台上有许多开源的嵌入式linux系统构建框架(框架的意思就是工具),这些框架极大的方便了开发者进行嵌入式系统的定制化构建,目前比较常见的有OpenWrt, Buildroot, Yocto,等等。其中Buildroot功能强大,使用简单,而且采用了类似于linux kernel的配置和编译框架,所以受到广大嵌入式开发人员的欢迎。
韦东山
2020/10/14
5.2K0
[干货]手把手教你用Zedboard学习Linux移植和驱动开发
部分硬件设计中需要CPU完成对电路寄存器的配置,为了完成Zedboard对FPGA上部分寄存器的配置功能,可以在PS单元(处理器系统)上运行裸机程序(无操作系统支持)完成和PL单元(FPGA部分)的数据交互功能,此时PS单元更像单片机开发;另一种方法是PS单元运行Linux操作系统,通过驱动程序和应用程序完成对硬件寄存器的读写操作,并且Linux有着完整的网络协议栈支持,后续可拓展性更强,可以更好的发挥ZYNQ这种异构架构芯片的性能。主要分为两部分,分别阐述Zedboard中FPGA和处理器互联总线与硬件设计和Zedboard处理器系统上嵌入式Linux的移植与通过驱动和应用程序简单配置FPGA寄存器的实现。上次介绍了没有操作系统下的驱动和应用程序开发,本文介绍带操作系统的驱动和应用程序开发。
网络交换FPGA
2019/10/29
7.6K2
[干货]手把手教你用Zedboard学习Linux移植和驱动开发
Linux Kernel 和 U-Boot 编译的那些事
之前的文章:《一次搞定交叉编译》 给大家讲了如何安装交叉编译工具链,搭建交叉编译环境。
HackforFun
2020/01/13
2.8K0
Linux Kernel 和 U-Boot 编译的那些事
开发板的第 1 个驱动程序
请按前面第七章使用 GIT 下载源码、使用 repo 下载工具链,并配置了交叉编译工具链。
韦东山
2020/09/30
1.7K0
开发板的第 1 个驱动程序
【i.MX6ULL】驱动开发12——电容触摸驱动实践(上)
上篇文章介绍了LCD屏幕的使用,这个屏幕还有触摸功能,本篇就来介绍LCD的触摸功能的使用。
xxpcb
2022/01/05
1.2K0
【i.MX6ULL】驱动开发12——电容触摸驱动实践(上)
busybox引导linux内核_linux移植教程
【点此进入busybox官网】,网站链接为:https://busybox.net/。进入官网后依次查找下述菜单,进入下载页面。
全栈程序员站长
2022/11/08
6.2K0
基于AM335X开发板 (ARM Cortex-A8)——Linux系统使用手册 (上)
本篇文章主要讲解嵌入式板卡中Linux系统是如何正确测试、使用的,其中内容包含有U-Boot编译、U-Boot命令和环境变量说明、Linux内核编译、xtra驱动编译、系统信息查询、程序开机自启动说明、NFS使用说明、TFTP使用说明、TFTP + NFS的系统启动测试说明、inux设备驱动说明等,其中案例源码部分公开。
创龙科技Tronlong
2022/06/24
2.1K0
基于AM335X开发板 (ARM Cortex-A8)——Linux系统使用手册 (上)
编译树莓派Linux内核[通俗易懂]
  Raspberry Pi 内核Linux代码存储在 GitHub 中,可以在github.com/raspberrypi/linux上查看。
全栈程序员站长
2022/09/15
7.5K0
Buildroot系统构建学习笔记(以百问网imx6ull开发板为例)
最近在学习音视频开发相关的内容,故硬件选型是非常重要的,加上芯片缺货,为了保证未来芯片供应链正常,结合预测趋势以及对芯片行业相关的定量分析 ,最终我选择了瑞芯微刚推出不久的芯片:RV1126_RV1109系列,为了高效学习,我将瑞芯微平台SDK里提供的docs目录下的文档做了分类整理和汇总,以便后期在工作中用到相应的知识可以很快的查阅到相关的资料高效完成调试和开发:
杨源鑫
2021/07/07
1.9K0
Buildroot系统构建学习笔记(以百问网imx6ull开发板为例)
荔枝派Zero(全志V3S)编译Uboot及配置
本文讲述了如何编译uboot并进行配置,对编译过程中遇到的问题进行解决,此外还对uboot的结构进行了简介
Gnep@97
2023/08/10
8650
荔枝派Zero(全志V3S)编译Uboot及配置
推荐阅读
相关推荐
i.MX6ULL嵌入式Linux开发2-uboot移植实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验