linux系列目录:
linux基础篇(一)——GCC和Makefile编译过程
linux基础篇(二)——静态和动态链接
ARM裸机篇(一)——i.MX6ULL介绍
ARM裸机篇(二)——i.MX6ULL启动过程
ARM裸机篇(三)——i.MX6ULL第一个裸机程序
ARM裸机篇(四)——重定位和地址无关码
ARM裸机篇(五)——异常和中断
linux系统移植篇(一)—— linux系统组成
linux系统移植篇(二)—— Uboot使用介绍
linux系统移植篇(三)—— Linux 内核使用介绍


一、Linux 介绍

Linux 由 Linux 基金会管理与发布, Linux 官网为 https://www.kernel.org,NXP 会从 https://www.kernel.org 下载某个版本的 Linux 内核,然后将其移植到自己的 CPU上,测试成功以后就会将其开放给 NXP 的 CPU 开发者。开发者下载 NXP 提供的 Linux 内核,然后将其移植到自己的产品上。

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

二、Linux 内核的编译与烧录

1. 获取Linux kernel

有三个方法获取 Kernel 源码,一个是 Kernel 官方内核源码,一个是 NXP 官方的 kernel 源码,一个是经过开发板厂商修改适配好板子的 kernel 源码。NXP 的 kernel 是根据 kernel 官方某一版本进行芯片适配的。作为嵌入式开发者,一般只需要
使用芯片厂商适配好的 kernel 进行开发即可,NXP官方linux仓库地址为:https://github.com/Freescale/linux-fslc
Kernel 官方内核源码: https://git.kernel.org/
NXP 内核源码: https://source.codeaurora.org/external/imx/linux-imx/
野火内核源码: https://github.com/Embedfire/ebf_linux_kernel.git
本次实验使用野火提供的适配好板子的 kernel 源码,下载方式如下:
在这里插入图片描述

2.Linux 内核目录分析

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  1. arch 目录
    这个目录是和架构有关的目录,比如 arm、 arm64、 avr32、 x86 等等架构。每种架构都对应一个目录,在这些目录中又有很多子目录,比如 boot、 common、 configs 等等.这些子目录用于控制系统引导、系统调用、动态调频、主频设置等。 arch/arm/configs 目录是不同平台的默认配置文件: xxx_defconfig,例如arch/arm/configs/npi_v7_defconfig就是我们所使用的配置文件。
    arch/arm/boot/dts 目录里面是对应开发平台的设备树文件。
    arch/arm/boot 目录下会保存编译出来的 Image 和 zImage 镜像文件,而 zImage 就是我们要用的 linux 镜像文件。
    arch/arm/mach-xxx 目录分别为相应平台的驱动和初始化文件,比如 mach-imx 目录里面就是 I.MX 系列 CPU 的驱动和初始化文件。
  2. drivers 目录
    设备驱动程序,里面列出了 linux 内核支持的所有硬件设备的驱动源代码,每个不同的
    驱动占用一个子目录,如 char、 block、 net、 mtd、 i2c 等,这是学习的重点。

3. 编译内核

# 清除之前编译环境
make mrproper
# 编译内核
make ARCH=arm npi_v7_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8

编译得到的 zImage 内核在 arch/arm/boot 目录下,设备树在 arch/arm/boot/dts 目录下,设备树分为emmc 版本 imx6ull-mmc-npi.dtb 以及 nand 版本 imx6ull-nand-npi.dtb 。
vmlinux、 Image, zImage、 uImage 的区别:
①、 vmlinux 是 ELF 格式的文件,vmlinux 是编译出来的最原始的内核文件,是未压缩的。
②、 Image 是 Linux 内核镜像文件,但是 Image 仅包含可执行的二进制数据。 Image 就是使用 objcopy 取消掉 vmlinux 中的一些其他信息,比如符号表什么的,也是未压缩的。
③、 zImage 是经过 gzip 压缩后的 Image。
④、 uImage 是老版本 uboot 专用的镜像文件, uImag 是在 zImage 前面加了一个长度为 64字节的“头”,这个头信息描述了该镜像文件的类型、加载位置、生成时间、大小等信息。但是新的 uboot 已经支持了 zImage 启动!所以已经很少用到 uImage 了

4.下载到开发板

将内核镜像和设备树文件拷贝到tftp根目录中,然后使用tftp加载,并启动:

tftp 80800000 zImage
tftp 83000000 imx6ull-mmc-npi.dtb
bootz 80800000 - 83000000

在这里插入图片描述
Linux 内核启动以后是需要根文件系统的,根文件系统存在哪里是由 uboot 的 bootargs 环境变量指定 , bootargs会传递给Linu 内核作为命令行参数 。
在构建出对应的根文件系统之前 Linux 内核是没有根文件系统可用的,所以提示内核崩溃,因为 VFS(虚拟文件系统)不能挂载根文件系统,因为根文件系统目录不存在。

下节开始构建根文件系统。

Logo

更多推荐