Linux内核初次编译和源码结构

描述

1.Linux内核获取

Linux由 Linux基金会管理与发布,Linux官网为 https://www.kernel.org ,所以若想获取最新的 Linux版本就可以在这个网站上下载,网站界面如下图所示:

内核

一般半导体厂商会从 Linux内核官网下载某个版本,将其移植到自己的 CPU上,测试成功后就会将其开放给该半导体厂商的 CPU开发者。 开发者下载其提供的 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 -j16

给予该脚本可执行权限,然后运行,编译的时候会弹出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目录 :存放着加密文件,比如常见的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等文件系统

include目录 :头文件目录

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

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

kernel目录 :Linux 内核代码

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

mm目录 :存放内存管理相关代码

net目录 :存放网络相关代码

samples目录 :存放一些示例代码文件

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

security目录 :存放安全相关的文件

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

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

usr目录 :存放与 initramfs 有关的代码

virt目录 :存放虚拟机相关文件

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

Kbuild文件 :有些 Makefile会读取此文件

Kconfig文件 :图形化配置界面的配置文件

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

README文件 :此文件详细讲解了如何编译 Linux 源码,以及 Linux 源码的目录信息

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分