飞行日志
常用链接
韭菜搞钱
三省吾身
知行合一
🐧内核:编译
type
status
date
slug
summary
tags
category
icon
password
1. 发展历史
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.13 Released Sun, 27 June 2021 (63 days)
- Linux_5.12 Released Sun, 25 Apr 2021 (70 days)
- Linux_5.11 Released Sun, 14 Feb 2021 (63 days)
- 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.1 Released Sun, 5 May 2019 (63 days)
- Linux_5.0 Released Sun, 3 March 2019 (70 days)
.......
2. 官网资源
- Linux 内核官网:https://www.kernel.org
- Linux 内核文档:https://www.kernel.org/doc/html/latest
- Linux 缺陷追踪:https://bugzilla.kernel.org
- Linux 补丁集合:https://patchwork.kernel.org
- Linux 模块文档:https://www.wiki.kernel.org
- Linux 邮件列表:https://www.wiki.kernel.org
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字节的头,描述镜像文件的类型,加载位置,大小信息。
注:针对 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。