[原创] i.MX6ULL嵌入式Linux开发3-Kernel移植

DDZZ669   2021-8-2 22:41 楼主

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

sudo apt-get install lzop
sudo apt-get install build-essential 
sudo apt-get install libncurses5-dev 

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

tar -vxf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2

        解压完成后:

 

 

        进入该文件夹,新建一个build.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键退出图形界面

 

 

        之后会自动开始编译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内核启动测

   

提示词:如果您需要查看本帖隐藏内容,请登录或者注册

回复评论 (2)

看着这Linux内核启动成功,有点看不太懂

点赞  2021-8-4 08:40
引用: Jacktang 发表于 2021-8-4 08:40 看着这Linux内核启动成功,有点看不太懂

Linux内核启动过程的具体细节,这篇没有介绍,我也还没仔细研究。这篇只是在NXP提供的内核文件上进行修改(本质其实是复制了一些文件改了下名称),使得内核能够在自己的板子上运行起来。

点赞  2021-8-4 22:39
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复