🐧内核:编译

type
status
date
slug
summary
tags
category
icon
password

1. 发展历史

notion image
Linux 内核的发展,堪称传奇。
Linux 是 Unix 操作系统的克隆,由 Linus Torvalds 在一个松散的网络黑客团队的协助下从头开始编写。它的目标是符合 POSIX 规范和单一 UNIX 规范。
它具有现代成熟 Unix 中所期望的所有功能,包括真正的多任务处理、虚拟内存、共享库、按需加载、共享的写时拷贝可执行文件、适当的内存管理以及包括IPv4和IPv6在内的多级网络。
虽然 Linux 最初是为基于 32 位 x86 的 PC (386 或更高版本)开发的,但今天它也运行在多种其他处理器体系结构上,包括 32 位和 64 位变体。
这里只给出 5.x 版本的发布时间,全部的时间记录在 https://kernelnewbies.org/LinuxVersions 上可以看到。另外,Linus 本人有一本自传 "Just for Fun" 可以读一读。
5.x
  • Linux_5.10 Released Sun, 13 December 2020 (63 days)
  • Linux_5.9 Released Sun, 11 October 2020 (70 days)
  • Linux_5.8 Released Sun, 2 August 2020 (64 days)
  • Linux_5.7 Released Sun, 31 May 2020 (63 days)
  • Linux_5.6 Released Sun, 29 March 2020 (63 days)
  • Linux_5.5 Released Sun, 26 January 2020 (63 days)
  • Linux_5.4 Released Sun, 24 Nov 2019 (70 days)
  • Linux_5.3 Released Sun, 15 September 2019 (70 days)
  • Linux_5.2 Released Sun, 7 July 2019 (63 days)
  • Linux_5.0 Released Sun, 3 March 2019 (70 days)
.......

2. 官网资源

3. 正式编译

首先明确如下观点:
  • 配置内核就是你来决定编译哪些代码;
  • 编译内核就是生成可执行文件的过程。
后面会用到的名词解释:
  • vmlinux:原始的,未经压缩的内核可执行文件
  • zImage:压缩过的可执行文件——压缩vmlinux后,加上一个head part(用来解压)
  • uImage:用于给uboot引导的zImage
  • bzImage:即bigzImage ,通过gzip压缩的
当前使用的系统是 Ubuntu 20.04,所以使用 apt 安装依赖。

3.1. 源码

3.1.1. 官网源码

首先下载最新的内核:
如果下载太慢,也可以通过国内镜像网站下载。
  • 阿里云镜像源
  • 中科大镜像源
  • 清华镜像源

3.1.2. 发行版源码

不同的发行版,维护了不同的代码已经适用于该版本的补丁,如果你只是想体验最新版本的内核,请使用发行版自带的补丁。

3.2. 编译

3.2.1. 编译器

默认是使用当前版本自带的编译器,如果你想要使用不同的编译器,可以自主选择。

3.2.2. 架构

生成的目标系统与当宿主机架构不同,就需要使用交叉编译器,Linaro 公司的交叉编译器(https://releases.linaro.org/components/toolchain/binaries)。目前主流的架构有:amd64、arm64、mips、i386等。

3.2.3. 配置类型

配置分为自动化配置和手动化配置,一般来说都是自动化配置再加上后面手动微调。
  • 自动配置
allyesconfig:最大化配置
defconfig:默认配置
allnoconfig:最小化配置
  • 手动配置
make config:基于文本的最为传统的配置界面,不推荐使用
make menuconfig:基于文本选单的配置界面,字符终端下推荐使用
make xconfig:基于图形窗口模式的配置界面,Xwindow下推荐使用
make gconfig:GTK 图形界面配置
make kconfig:KDE 图形界面配置
之后执行编译命令:
等待编译完成即可。

3.3. 格式

嵌入式开发中,常见 Linux 嵌入式开发中的内核格式有:vmlinux、Image、zImage、uImage。
vmlinux:Linux内核编译出来的原始内核文件,elf格式,未压缩处理;
Image:Linux 内核编译时,使用objcopy处理vmlinux后生成的二进制内核镜像,未压缩处理;
zImage:使用gzip压缩Image后,使用objcopy命令生成的Linux内核镜像。
uImage:在zImage之前加入了一个64字节的头,描述镜像文件的类型,加载位置,大小信息。
notion image
注:针对 aarch64 架构,原生内核不提供 zImage 编译,可以使用 make Image.gz 编译,但此处 Image.gz 与 zImage 相比,仅仅是使用 gzip 压缩,而缺少自解压代码。

4. 安装内核

新版本内核未来都将使用 zstd 格式来压缩,因此建议安装 zstd。
以下针对不支持 zstd 的情况,可以主动修改内核压缩格式,配置中将内核压缩,initramfs support 修改为 lz4,/etc/initramfs-tools/initramfs.conf 文件中 COMPRESS=gzip 改为 COMPRESS=lz4。重新生成 grub。
中年码农的困境log-001-我与计算机