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 源码的目录信息
-
NXP
+关注
关注
60文章
1278浏览量
184046 -
内核
+关注
关注
3文章
1372浏览量
40278 -
Linux
+关注
关注
87文章
11292浏览量
209328 -
源码
+关注
关注
8文章
639浏览量
29185 -
编译
+关注
关注
0文章
657浏览量
32852
发布评论请先 登录
相关推荐
评论