IMX6ULL学习笔记(8)——获取和编译Linux内核

发布者:haoying最新更新时间:2025-02-24 来源: jianshu关键字:编译  Linux内核 手机看文章 扫描二维码
随时随地手机看文章

一、简介

1.1 Linux内核

Kernel 即是Linux内核,Linux内核采用宏内核架构,即Linux大部分功能都会在内核中实现,如进程管理、内存管理、设备管理、文件管理以及网络管理等功能,Linux在发展的过程中,引入了内核模块(Loadable Kernel Module,LKM)机制,内核模块全称为动态可加载内核模块,就是在内核运行时可以动态加载一组目标代码来实现某些特定的功能,在这过程中不需要重新编译内核就可以实现动态扩展。

1.2 Linux内核组成

Linux内核主要由5部分组成,分别为:进程管理子系统,内存管理子系统,文件子系统,网络子系统,设备子系统。

  • 进程管理
    负责进程的创建和销毁,进程的调度。

  • 内存管理
    负责内存的分配和回收,记录哪些内存被哪些进程使用,管理虚拟内存,将内存的物理地址和逻辑地址做一个映射,主要由MMU进行转换,页表的方式。

  • 文件系统
    这里的文件系统不仅仅只是硬盘的抽象管理,它也可以是某些io口的抽象;文件系统屏蔽了底层的细节,为上层提供统一的接口;linux中一切皆文件。

  • 网络功能
    网络功能值的是除了驱动程序提供的基本硬件操作外,还有系统提供的机制和功能,比如TCP协议,地址解析等。

  • 设备管理
    设备管理功能主要由驱动程序提供,主要任务是控制设备完成输入或输出操作;linux把设备看作是特殊的文件,系统通过处理文件的接口(虚拟文件系统VFS)来管理和控制各种设备。

二、安装编译工具和依赖

sudo apt install make gcc-arm-linux-gnueabihf gcc bison flex libssl-dev dpkg-dev lzop vim libncurses5-dev

三、获取Linux内核

【不推荐,仅列出】

  • 官方kernel下载:https://git.kernel.org

  • NXP提供kernel下载:https://source.codeaurora.org/external/imx/linux-imx

【新手推荐使用以下开发板商提供kernel】

  • 野火提供kernel下载:https://github.com/Embedfire/ebf_linux_kernel.git

  • 韦东山提供kernel下载:https://e.coding.net/weidongshan/imx-linux4.9.88.git

四、Linux内核工程结构

此处仅列出一些常见的目录:

目录/文件说明
arch硬件架构相关目录
block块设备相关目录
crypto加密和散列算法相关目录
Documentation内核各部分的文档描述
drivers设备驱动相关目录
firmeare固件相关目录
fs文件系统相关目录
include编译核心所需要的大部分头文件相关目录
init内核初始化相关目录
ipc进程间通信相关目录
kernel内核相关目录
lib库相关目录
mm内存管理相关目录
net网络协议栈相关目录
samples例程相关目录
scripts脚本相关目录
security内核安全相关目录
sound音频处理相关目录
tools工具相关目录
usr实现用于打包和压缩的cpio等

五、编译野火提供Linux内核

编译 Kernel 有两种方法:

  • 一种是编译较为通用的 zImage,常用于构建成镜像固件。

  • 另一种则是编译成 deb 安装包,将其下载到板子上安装即可更新 Kernel。

5.1 编译内核zImage

  • 获取野火提供Linux内核源码
    git clone https://gitee.com/Embedfire/ebf_linux_kernel_6ull_depth1

  • 进入工程目录
    cd ebf_linux_kernel_6ull_depth1

  • 清除工程
    清除上次生成的编译环境,避免之前的环境干扰影响编译结果
    sudo make distclean

  • 配置工程
    sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- npi_v7_defconfig

    • ARCH=arm:设置目标为 arm 架构

    • CROSS_COMPILE:指定所使用的交叉编译器

  • 配置内核选项
    sudo make menuconfig KCONFIG_CONFIG=arch/arm/configs/npi_v7_defconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
    这里我们不需要做任何的配置,直接按两下 ESC 键退出。


  • 编译工程
    sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8

    • ARCH=arm:设置目标为 arm 架构

    • CROSS_COMPILE:指定所使用的交叉编译器

    • -j8:允许8个编译命令同时执行,提高编译速度

编译过程中可能出现的错误:解决方法:Ubuntu 22.04编译Linux内核提示错误multiple definition of `yylloc‘

  • 生成文件

    • zImage :编译得到的 zImage 内核在 arch/arm/boot 目录下。

    • 设备树 :在 arch/arm/boot/dts 目录下,设备树分为 emmc 版本 imx6ull-mmc-npi.dtb 以及 nand 版本 imx6ull-nand-npi.dtb 。

  • 新建编译脚本文件
    每次编译 kernel 都要输入一长串命令,为了简单起见,我们可以新建一个 shell 脚本文件,将这些命令写到 shell 脚本文件里面,然后每次只需要执行 shell 脚本即可完成编译工作。


#!/bin/bash

sudo make distclean

sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- npi_v7_defconfig

sudo make menuconfig KCONFIG_CONFIG=arch/arm/configs/npi_v7_defconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-


    • 第1行:shell 脚本要求的,必须是 “#!/bin/bash” 或者 “#!/bin/sh”。

    • 第2行:使用了 make 命令,用于清理工程,也就是每次在编译 uboot 之前都清理一下工程。带有三个参数,第一个是 ARCH,也就是指定架构,这里肯定是 arm;第二个参数 CROSS_COMPILE 用于指定编译器,只需要指明编译器前缀就行了,比如 arm-linux-gnueabihf-gcc 编译器的前缀就是 “arm-linux-gnueabihf-”;最后一个参数 distclean 就是清除工程。

    • 第3-4行:也使用了 make 命令,用于配置 kernel。

    • 第5行:用于编译 kernel,通过第 3 行配置好 kernel 以后就可以直接 “make” 编译 kernel 了

    1. 增加可执行权限
      chmod 777 imx6ull_kernel.sh

    2. 执行脚本文件
      ./imx6ull_kernel.sh

    1. 新建名为 imx6ull_kernel.sh 的 shell 脚本文件:
      vim imx6ull_kernel.sh

    2. 然后在里面输入如下内容:

5.2 编译内核deb安装包

  • 获取野火提供U-Boot源码
    git clone https://gitee.com/Embedfire/ebf_linux_kernel_6ull_depth1

  • 安装必要软件
    sudo apt install build-essential

  • 进入工程目录
    cd ebf_linux_kernel_6ull_depth1

  • 运行野火提供的make_deb.sh脚本
    sudo ./make_deb.sh

    这种编译方式编译内核,构建出来的 deb 安装包可直接使用 sudo dpkg -i xxx.deb 命令安装在鲁班猫系统上,然后重启使用 cat /proc/version 查看内核是否更新。

    编译成功打印消息如下:

  • 生成文件
    构成生成的 deb 包在内核源码 /build_image 目录下。


关键字:编译  Linux内核 引用地址:IMX6ULL学习笔记(8)——获取和编译Linux内核

上一篇:IMX6ULL学习笔记(10)——通过TFTP烧录Linux内核
下一篇:IMX6ULL学习笔记(7)——通过SD卡启动U-Boot

推荐阅读最新更新时间:2026-03-25 12:32

(mini2440)建立交叉编译环境+配置linux内核
系统ubuntu12.04(非虚拟机下) mini2440 CPU型号:S3C2440AL-40 Nandflash型号:K9F1G08 Norflash型号:SST39VF1601 LCD:统宝 240 x 320 $:普通账户 #:root账户 *当shell下输入路径时可使用tab键自动补全 (一)建立交叉编译环境 1.将mini2440光盘中的linux文件夹拷贝到 /home/lianghuiyong 并改名为Linux_share (其中两个文档为我后面添加进去的) 2.Ctrl+Alt+T打开shell 3.$ su - root (切换root权限) 4.# cd /home/lianghuiyong/
[单片机]
(mini2440)建立交叉<font color='red'>编译</font>环境+配置<font color='red'>linux内核</font>
迅为IMX6ULL开发板Qt for Android搭建开发环境
搭建开发环境 1.安装 JDK,选择默认路径,一路点击下一步即可。 安装完成后进入相应的路径查看: 需要注意的问题: (1)建议使用我们提供的版本,如果自己下载可能会出现问题。 (2)建议大家安装到 C 盘下面,不要有中文路径。 2.安装 sdk 和 ndk,直接解压即可,解压的路径不要有中文路径。我这里是解压到了 JDK 的安装路径, 如果 C 盘空间不够可以解压到其他盘,但要记住位置,下面需要用到。 3.配置环境 打开 QTCreator,打开工具- 选项,选择如下图内容: 设置 JDK,SDK.NDK 的路径,如下图: 设置完成以后,我们点击 apply 和 ok 即可。
[单片机]
迅为<font color='red'>IMX6ULL</font>开发板Qt for Android搭建开发环境
实验分享丨迅为IMX6ULL开发板点亮第一个led灯
本章内容对应IMX6ULL开发板视频讲解链接(在线观看): 我们学 linux 、单片机的第一个操作硬件就是点亮第一个 led 灯。 在单片机上我们点亮一个 led 灯非常的简单,直接操作引脚就可以了。虽然 linux 听着比较高大上,但是点亮一个 led 灯是非常容易的。我们甚至不用去写驱动,直接命令操作就可以了,因为 linux 系统本身有好多成熟的驱动框架,使用这些框架的好处就是当我们更换平台的时候,比如换到 RK3399 平台,我们应用程序可以不用做任何改变,就可以直接在新的平台上运行。但是如果你在单片机上写一个点灯程序,比如说我在 32 上写了一个点灯我现在想把它移植到 51 上那这个移植过程是比较麻烦的,如果说用寄存
[单片机]
实验分享丨迅为<font color='red'>IMX6ULL</font>开发板点亮第一个led灯
每天学习一点丨借助U盘或TF卡拷贝程序到迅为IMX6ULL开发板上(一)每天学习一点丨借助U盘
本章内容对应视频讲解链接(在线观看): 借助 U 盘或 TF 卡拷贝程序到迅为IMX6ULL开发板 → 我们已经学习了怎么在 ubuntu 和 windows 上互传文件,那么怎么把 ubuntu 或 win 上的程序拷贝到开发板呢,这里给大家介绍第一种方法,使用 U 盘或者 TF 卡来完成,如果大家使用的是 U 盘,那么大家直接把 U 盘插到电脑上就可以了,如果大家使用的是 TF 卡,那么大家要把 TF 卡连接到读卡器上,然后把读卡器插到电脑,其他的操作方法都是一样的,我就不给大家做区分了,我现在把 U 盘插到电脑上。 步骤一:保证 U 盘或者 TF 卡的格式为 FAT32 格式,TF 卡要用读卡器和电脑相连。 我们首先要检查
[单片机]
每天学习一点丨借助U盘或TF卡拷贝程序到迅为<font color='red'>IMX6ULL</font>开发板上(一)每天学习一点丨借助U盘
迅为IMX6ULL开发板-主频和时钟配置例程
在前面几节讲的都是 GPIO 的功能,本章我们会讲解如何修改和配置 CPU 的主频,了解 iMX6ULL 的时钟系统。 15.1 i.MX6ULL 时钟系统 iMX6ULL 的系统主频为 528MHz,有些型号可以跑到 696MHz,但是默认情况下 iMX6ULL 的主频为396MHz。我们想要让 iMX6ULL 运行时候达到最大性能,就需要将主频上调至最大 528MHz,或者更大,其它的外设时钟也要设置到 NXP 官方推荐的值。 更多关于芯片的时钟可以查阅 《IMX6ULL 参考手册.pdf》的第 10 章“Chapter 10 Clock and PowerManagement”和第 18 章“Chapter 18 Clock
[单片机]
迅为<font color='red'>IMX6ULL</font>开发板-主频和时钟配置例程
迅为IMX6ULL开发板搭建Web服务器(二)
boa 拷贝到开发板的 bin 目录下 接下来在开发板根目录下建立 www 文件夹,如图 80.15。 然后在开发板上面建立的 www 目录下面建立文件夹 cgi-bin 目录,如图 80.16: 然后在开发的 etc 目录下用命令 touch group 命令建立 group 文件,如图 80.17 所示。 然后进到开发板 etc/boa目录,使用 vi boa.conf命令打开 boa.conf文件(这里改的是开发板的 boa.conf),如下图所示:打开 boa.conf 文件,找到”Group nogroup”,修改为”Group 0”。 找到“ErrorLog ”和“AccessLog”这两行,指定 log 文
[单片机]
迅为<font color='red'>IMX6ULL</font>开发板搭建Web服务器(二)
IMX6ULL开发板Ubuntu文件系统Ubuntu-base构建
1 解压Ubuntu-base 我们使用命令“tar xvf ubuntu-base-16.04.5-base-armhf.tar.gz”,如图 1.1所示: 解压完成之后就是根文件系统,使用命令“ls”查看目录。 2 安装Qemu-User-Static工具 QEMU是专门模拟不同机器架构的软件,在ubuntu中对其支持良好,若需要挂载ubuntu armhf版本的文件,必须安装qemu-user-static工具。 首先Ubuntu下使用命令“apt-get install qemu-user-static”安装,安装过程中按y继续。如图 2.1所示: 这一步骤是将qemu-user-static安装到了pc的ub
[单片机]
<font color='red'>IMX6ULL</font>开发板Ubuntu文件系统Ubuntu-base构建
iMX6ULL终结者Linux WIFI驱动实验rtl8723 Wifi联网测试
在迅为i.MX6UL终结者开发板上使用的是usb接口的RTL8723 wifi模块,原理图如图 1所示: 可以看到RTL8723模块的接口非常简单,只有DP1和DM1连接到usb HUB芯片上,就可以完成通信电路。RTL8723是realtek公司的wifi芯片,已经提供了wifi驱动源码,就不需要我们自己去编写了,只需要将提供的wifi驱动源码添加到Linux内核中进行编译就可以了。 1.1 在Linux内核中添加wifi驱动 首先获取wifi驱动源码,放到Linux内核drivers/net/wireless目录下,如图 1.1.1所示: rtl8723BU目录下内容如图 1.1.2所示: 其中Kconfig文件是rtl
[单片机]
<font color='red'>iMX6ULL</font>终结者Linux WIFI驱动实验rtl8723 Wifi联网测试
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved