所有操作均是linux-6.8.2版本

kernel源码下载

kernel目录结构

Linux-6.8.2一级目录

目录说明

目录 说明
arch 包含了各种不同的CPU体系架构的代码,如果ARM、x86、MIPS等
block 包含块设备相关的代码
crets 包含了用于签名和验证内核模块的证书文件和工具
crypto 包含加密相关的代码
Documentation 包含了内核的文档,包括各种文档、注释和帮助文件
drivers 含了设备驱动程序的源代码,如输入输出设备、网络设备等
fs 包含了文件系统相关的代码,如 ext4、NTFS、FAT 等
include 包含了一些头文件,用于引入定义和声明
init 包含了启动和初始化代码
io_uring 包含了与 io_uring 框架相关的代码
ipc 包含了进程间通信相关的代码
kernel 包含了内核的核心代码
lib 包含了一些通用的函数库
mm 包含了内存管理相关的代码
net 包含了网络协议栈相关的代码
rust 引入了一些rust特性
samples 包含了一些示例代码
scripts 包含了一些辅助脚本,用于构建和维护内核
security 包含了安全子系统相关的代码
sound 包含了声音子系统相关的代码
tools 包含了一些工具,用于辅助内核开发和调试
usr 包含了用户空间工具和库,这些工具和库通常用于与内核交互
virt 包含了虚拟化相关的代码

文件说明

文件 说明
COPYING 包含了许可证信息
CREDITS 包含了对 Linux 内核贡献者的致谢
Kbuild 用于管理内核源代码的编译和构建过程
Kconfig 用于配置内核编译时的各种选项和特性
MAINTAINERS 包含了 Linux 内核的维护者列表
Makefile 系统编译和构建脚本
README 从入门到入土😭

README

提供了两个非常重要的信息:

  1. Documentation/admin-guide/README.rst :什么是Linux以及如何编译和配置他?
  2. Documentation/process/changes.rst :编译内核的最小配置?编译遇到错误,参考该文章

安装内核

首次安装

使用下面的命令:该命令是将文件提取并解压到当前文件夹,当然也可以选择其他的解压方式

xz -cd linux-6.8.2.tar.xz | tar xvf -

更新patch

在linux内核源码的根目录执行下面的命令:/path/to是patch所在目录

xz -cd /path/to/patch-6.x.xz | patch -p1

或者使用scripts/patch-kernel脚本自动升级patch

配置并编译内核

可以通过make O=output/dir设置编译目录和输出目录。如果没有配置目录,则编译的临时文件都将在源码的根目录产生。如果使用了参数,后续执行的命令建议都带着参数使用

cd linux-6.8.2
make O=./output

内核配置

可以通过make menuconfig命令调用图形配置界面配置内核,当然也支持其他的方法修改配置,可以使用make help查看更多的选项。
如下图:方向键控制选项,ENTER键进入子菜单,space空格键更改编译方式,保存后会将修改后的配置保存到.config文件里:

[ ]: 不编译
[*]: 编译进内核
< >: 不编译
<*>: 编译进内核
<M>: 以可加载的形式编译

使用默认配置文件,根据当前操作架构作为默认配置

make O=./output defconfig

menuconfig

内核编译

执行下面的命令,编译过程生成的中间产物,和最终产物都会在当前目录的output目录下产生:

make O=./output

最终编译的kernel在./output/arch/x86_64/boot/bzImage

内核Makefile常用的命令行参数

参数 使用 说明
ARCH make ARCH=arm 指定目标架构,如x86、ARM等,该架构代码必须在arch文件夹中存在
CROSS_COMPILE make CROSS_COMPILE=arm-linux-gnueabi- 指定编译使用的交叉工具链前缀