linux内核顶层Makefile详解

文章目录

  • 一、linux内核获取
  • 二、linux内核初次编译
  • 三、linux工程目录分析
    • 1.获取源码
    • 2.目录介绍
      • 1.总体浏览
      • 2.arch 目录
      • 3.block 目录
      • 4.crypto 目录
      • 5.Documentation 目录
      • 6.drivers 目录
      • 7.firmware 目录
      • 8.fs 目录
      • 9.include 目录
      • 10.init 目录
      • 11.ipc 目录
      • 12.kernel 目录
      • 13.lib 目录
      • 14.mm 目录
      • 15.net 目录
      • 16.samples 目录
      • 17.scripts 目录
      • 18.security 目录
      • 19.sound 目录
      • 20.tools 目录
      • 21.usr 目录
      • 22.virt 目录
      • 23..config 文件
      • 24.Kbuild 文件
      • 25.Kconfig
      • 26.Makefile
      • 27.README
  • 四、VScode工程创建
  • 五、顶层Makefile详解
    • 1.make xxxdefconfig过程
    • 2.Makefile.build脚本Fenix
    • 3.make过程
    • 4.build-in.o文件编译生成过程
    • 5.make zImage过程

一、linux内核获取

Linux 官网为 官网
所以你想获取最新的Linux 版本就可以在这个网站上下载,网站界面如图 所示:
linux内核顶层Makefile详解_第1张图片

4.x 版本的 Linux 和 5.x 版本没有本质上的区别,5.x 更多的是加入了一些新的平台、新的外设驱动而已。

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

本章的移植我们就使用 NXP 提供的Linux 源码,NXP 提供 Linux源码已经放到了开发板光盘中,路径为: 开发板光盘->1、例程源码->4、NXP 官方原版 Uboot和 Linux-> linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2

二、linux内核初次编译

编译内核之前需要先在 ubuntu 上安装 lzop 库,否则内核编译会失败!命令如下:

sudo apt-get install lzop

先看一下如何编译 Linux 源码,这里编译以 I.MX6U-ALPHA 开发板移植好的 Linux 源码,已经放到了开发板光盘中,路径为:开发板光盘->1、例程源码-> 3、正点原子 Uboot 和 Linux出厂源码-> linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2,
拷贝到ubuntu
linux内核顶层Makefile详解_第2张图片
解压后的源码根目录
linux内核顶层Makefile详解_第3张图片
以 EMMC 核心板为例,讲解一下如何编译出对应的 Linux 镜像文件。
新建名为“mx6ull_alientek_emmc.sh”的 shell 脚本,然后在这个 shell 脚本里面输入如下所示内容:

#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j4

使用 chmod 给予 mx6ull_alientek_emmc.sh 可执行权限,然后运行此 shell 脚本,命令如下:

./mx6ull_alientek_emmc.sh

编译的时候会弹出 Linux 图形配置界面
linux内核顶层Makefile详解_第4张图片
Linux 的图行界面配置和 uboot 是一样的,这里我们不需要做任何的配置,直接按两下 ESC键退出,退出图形界面以后会自动开始编译 Linux。等待编译完成,

编译大概需要10:57-11:13 大概16分钟

编译完成以后就会在 arch/arm/boot 这个目录下生成一个叫做 zImage 的文件,zImage 就是我们要用的 Linux 镜像文件。另外也会在 arch/arm/boot/dts 下生成很多.dtb 文件,这些.dtb 就是设备树文件。

在这里插入图片描述
linux内核顶层Makefile详解_第5张图片

三、linux工程目录分析

1.获取源码

将正点原子提供的 Linux 源码进行解压
linux内核顶层Makefile详解_第6张图片
我们在分析 Linux 之前一定要先在 Ubuntu 中编译一下 Linux,因为编译过程会生成一些文件,而生成的这些恰恰是分析Linux 不可或缺的文件。编译完成以后使用 tar 压缩命令对其进行压缩并使用 winsp软件将压缩后的 uboot 源码拷贝到 Windows 下。

tar -vcf aef_linux.tar.gz aef_linux

linux内核顶层Makefile详解_第7张图片
编译之后的linux目录
linux内核顶层Makefile详解_第8张图片

2.目录介绍

1.总体浏览

linux内核顶层Makefile详解_第9张图片
linux内核顶层Makefile详解_第10张图片
linux内核顶层Makefile详解_第11张图片

2.arch 目录

这个目录是和架构有关的目录,比如 arm、arm64、avr32、x86 等等架构。每种架构都对应一个目录,在这些目录中又有很多子目录,比如 boot、common、configs 等等,以 arch/arm 为例,其子目录如图 所示:
linux内核顶层Makefile详解_第12张图片
arch/arm 的一部分子目录,这些子目录用于控制系统引导、系统调用、动态调频、主频设置等。arch/arm/configs 目录是不同平台的默认配置文件:xxx_defconfig,如图 所示:
linux内核顶层Makefile详解_第13张图片
在 arch/arm/configs 中就包含有 I.MX6U-ALPHA 开发板的默认配置文件:imx_v7_defconfig,执行“make imx_v7_defconfig”即可完成配置。arch/arm/boot/dts 目录里面是对应开发平台的设备树文件,正点原子 I.MX6U-ALPHA 开发板对应的设备树文件如图 所示
linux内核顶层Makefile详解_第14张图片
arch/arm/boot 目录下会保存编译出来的 Image 和 zImage 镜像文件,而 zImage 就是我们要用的 linux 镜像文件。
arch/arm/mach-xxx 目录分别为相应平台的驱动和初始化文件,比如 mach-imx 目录里面就是 I.MX 系列 CPU 的驱动和初始化文件。

3.block 目录

block 是 Linux 下块设备目录,像 SD 卡、EMMC、NAND、硬盘等存储设备就属于块设备,block 目录中存放着管理块设备的相关文件。

4.crypto 目录

crypto 目录里面存放着加密文件,比如常见的 crc、crc32、md4、md5、hash 等加密算法。

5.Documentation 目录

此目录里面存放着 Linux 相关的文档,如果要想了解 Linux 某个功能模块或驱动架构的功能,就可以在 Documentation 目录中查找有没有对应的文档。

6.drivers 目录

驱动目录文件,此目录根据驱动类型的不同,分门别类进行整理,比如 drivers/i2c 就是 I2C相关驱动目录,drivers/gpio 就是 GPIO 相关的驱动目录,这是我们学习的重点。

7.firmware 目录

此目录用于存放固件。

8.fs 目录

此目录存放文件系统,比如 fs/ext2、fs/ext4、fs/f2fs 等,分别是 ext2、ext4 和 f2fs 等文件系统。

9.include 目录

头文件目录。

10.init 目录

此目录存放 Linux 内核启动的时候初始化代码。

11.ipc 目录

IPC 为进程间通信,ipc 目录是进程间通信的具体实现代码。

12.kernel 目录

Linux 内核代码。

13.lib 目录

lib 是库的意思,lib 目录都是一些公用的库函数。

14.mm 目录

此目录存放内存管理相关代码。

15.net 目录

此目录存放网络相关代码。

16.samples 目录

此目录存放一些示例代码文件。

17.scripts 目录

脚本目录,Linux 编译的时候会用到很多脚本文件,这些脚本文件就保存在此目录中。

18.security 目录

此目录存放安全相关的文件。

19.sound 目录

此目录存放音频相关驱动文件,音频驱动文件并没有存放到 drivers 目录中,而是单独的目录。

20.tools 目录

此目录存放一些编译的时候使用到的工具。

21.usr 目录

此目录存放与 initramfs 有关的代码。

22.virt 目录

此目录存放虚拟机相关文件。

23…config 文件

跟 uboot 一样,.config 保存着 Linux 最终的配置信息,编译 Linux 的时候会读取此文件中的配置信息。最终根据配置信息来选择编译 Linux 哪些模块,哪些功能。

24.Kbuild 文件

有些 Makefile 会读取此文件。

25.Kconfig

文件图形化配置界面的配置文件。

26.Makefile

Linux 顶层 Makefile 文件,建议好好阅读一下此文件。

27.README

此文件详细讲解了如何编译 Linux 源码,以及 Linux 源码的目录信息,建议仔细阅读一下此文件。

四、VScode工程创建

在分析 Linux 的顶层 Makefile 之前,先创建 VSCode 工程,创建过程和 uboot 一样。创建好以后将文件.vscode/settings.json 改为如下所示内容:

{
    "search.exclude": {
    "**/node_modules": true,
    "**/bower_components": true,
    "**/*.o":true,
    "**/*.su":true,
    "**/*.cmd":true,
    "Documentation":true,

     /* 屏蔽不用的架构相关的文件 */
     "arch/alpha":true,
     "arch/arc":true,
     "arch/arm64":true,
     "arch/avr32":true,
     "arch/[b-z]*":true,
     "arch/arm/plat*":true,
     "arch/arm/mach-[a-h]*":true,
     "arch/arm/mach-[n-z]*":true,
     "arch/arm/mach-i[n-z]*":true,
     "arch/arm/mach-m[e-v]*":true,
     "arch/arm/mach-k*":true,
     "arch/arm/mach-l*":true,
    
     /* 屏蔽排除不用的配置文件 */
     "arch/arm/configs/[a-h]*":true,
     "arch/arm/configs/[j-z]*":true,
     "arch/arm/configs/imo*":true,
     "arch/arm/configs/in*":true,
     "arch/arm/configs/io*":true,
     "arch/arm/configs/ix*":true,

     /* 屏蔽掉不用的 DTB 文件 */
     "arch/arm/boot/dts/[a-h]*":true,
     "arch/arm/boot/dts/[k-z]*":true,
     "arch/arm/boot/dts/in*":true,
     "arch/arm/boot/dts/imx1*":true,
     "arch/arm/boot/dts/imx7*":true,
     "arch/arm/boot/dts/imx2*":true,
     "arch/arm/boot/dts/imx3*":true,
     "arch/arm/boot/dts/imx5*":true,
     "arch/arm/boot/dts/imx6d*":true,
     "arch/arm/boot/dts/imx6q*":true,
     "arch/arm/boot/dts/imx6s*":true,
     "arch/arm/boot/dts/imx6ul-*":true,
     "arch/arm/boot/dts/imx6ull-9x9*":true,
     "arch/arm/boot/dts/imx6ull-14x14-ddr*":true,
     },
     "files.exclude": {
     "**/.git": true,
     "**/.svn": true,
     "**/.hg": true,
     "**/CVS": true,
     "**/.DS_Store": true,
     "**/*.o":true,
     "**/*.su":true,
     "**/*.cmd":true,
     "Documentation":true,
    
     /* 屏蔽不用的架构相关的文件 */
     "arch/alpha":true,
     "arch/arc":true,
     "arch/arm64":true,
     "arch/avr32":true,
     "arch/[b-z]*":true,
     "arch/arm/plat*":true,
     "arch/arm/mach-[a-h]*":true,
     "arch/arm/mach-[n-z]*":true,
     "arch/arm/mach-i[n-z]*":true,
     "arch/arm/mach-m[e-v]*":true,
     "arch/arm/mach-k*":true,
     "arch/arm/mach-l*":true,
    
     /* 屏蔽排除不用的配置文件 */
     "arch/arm/configs/[a-h]*":true,
     "arch/arm/configs/[j-z]*":true,
     "arch/arm/configs/imo*":true,
     "arch/arm/configs/in*":true,
     "arch/arm/configs/io*":true,
     "arch/arm/configs/ix*":true,
    
     /* 屏蔽掉不用的 DTB 文件 */
     "arch/arm/boot/dts/[a-h]*":true,
     "arch/arm/boot/dts/[k-z]*":true,
     "arch/arm/boot/dts/in*":true,
     "arch/arm/boot/dts/imx1*":true,
     "arch/arm/boot/dts/imx7*":true,
     "arch/arm/boot/dts/imx2*":true,
     "arch/arm/boot/dts/imx3*":true,
     "arch/arm/boot/dts/imx5*":true,
     "arch/arm/boot/dts/imx6d*":true,
     "arch/arm/boot/dts/imx6q*":true,
     "arch/arm/boot/dts/imx6s*":true,
     "arch/arm/boot/dts/imx6ul-*":true,
     "arch/arm/boot/dts/imx6ull-9x9*":true,
     "arch/arm/boot/dts/imx6ull-14x14-ddr*":true,
     }
}

linux内核顶层Makefile详解_第15张图片
创建好 VSCode 工程以后就可以开始分析 Linux 的顶层 Makefile 了。

五、顶层Makefile详解

关于这个Makefile太过于复杂,有时间的话可以去看正点原子的linux驱动开发指南。

1.make xxxdefconfig过程

2.Makefile.build脚本Fenix

3.make过程

4.build-in.o文件编译生成过程

5.make zImage过程

你可能感兴趣的:(#,阿尔法,Linux,内核,linux)