本章主要介绍获取内核代码的途径,编译内核的步骤以及内核代码架构的简要说明。

获取内核源码


linux内核官网

https://www.kernel.org/

如下图所示,内核版本以及更新到5.9.11,由于我都本机linux内核版本为5.4.0,为了方便编译,这里都以该版本为例。

国内archlinux镜像源 archlinux官方源_arch linux arm下载

git 仓库

git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

或下载压缩包

wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.tar.xz

国内镜像

由于网络的原因直接从官网下载代码会非常慢(实测4kbps),所以推荐使用国内镜像。国内的镜像有很多,本文使用五道口职业技术学校的镜像(https://mirrors.tuna.tsinghua.edu.cn/)

git仓库

git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux.git

或下载压缩包

wget https://mirrors.tuna.tsinghua.edu.cn/kernel/v5.x/linux-5.4.tar.xz

这下载速度超赞

国内archlinux镜像源 archlinux官方源_arch linux arm下载_02

解压

tar -Jxvf linux-5.4.tar.xz

内核编译对源码存放的位置没有要求,这里放在home目录下自建的~/linux文件,解压后的目录,

国内archlinux镜像源 archlinux官方源_arch linux arm下载_03

内核代码大概有900+M,56000+个文件,26000000+行代码。


内核源码树


目录简介如下:

目录

内容

arch/

包含各体系结构特定的代码,如arm、x86、ia64、mips等,在每个体系结构目录下通常都有:

-boot 内核需要的特定平台代码

-kernel 体系结构特有的代码

-lib 通用函数在特定体系结构的实现

-math-emu 模拟FPU的代码,在ARM中,使用mach-xxx代替

-mm 特定体系结构的内存管理实现

-include 特定体系的头文件

block/

存放块设备相关代码

crypto/

存放加密、压缩、CRC校验等算法相关代码

Documentation/

存放相关说明文档,很多实用文档,包括驱动编写等

drivers/

存放Linux内核设备驱动程序源码。驱动源码在Linux内核源码中占了很大比例,常见外设几乎都有可参考源码,对驱动开发而言,该目录非常重要。该目录包含众多驱动,目录按照设备类别进行分类,如char、block、input、i2c、spi、pci、usb等

firmware/

存放处理器相关的一些特殊固件

fs/

存放所有文件系统代码,如fat、ext2、ext3、ext4、ubifs、nfs、sysfs等

include/

存放内核所需、与平台无关的头文件,与平台相关的头文件已经被移动到arch平台的include目录,如ARM的头文件目录

init/

包含内核初始化代码

ipc/

存放进程间通信代码

kernel/

包含Linux内核管理代码

lib/

库文件代码实现

mm/

存放内存管理代码

net/

存放网络相关代码

samples/

存放提供的一些内核编程范例,如kfifo;后者相关用户态编程范例,如hidraw

srcipts/

存放一些脚本文件,如menuconfig脚本

security/

存放系统安全性相关代码

sound

存放声音、声卡相关驱动

tools/

编译过程中一些主机必要工具

usr

cpio相关实现

virt/

内核虚拟机KVM

内核编译

配置选项

linux内核采用模块化设计,可以有选择的配置哪些功能模块或驱动被编译到内核,所以在编译内核前首先要进行内核配置。系统提供了多种配置方式,在源码根目录下输入命令启动:

make config

这是最原始的配置方式,通过字符串页面对功能逐一配置,费时费力。

make menuconfig或make gconfig

这两种都是通过图形页面进行配置,效率明显提高。下图为menuconfig页面

国内archlinux镜像源 archlinux官方源_arch linux 文档下载_04

执行完之后会在根目录下生成.config文件,表示配置成功。

验证更新配置

make oldconfig

编译

make

大功告成。