本章主要介绍获取内核代码的途径,编译内核的步骤以及内核代码架构的简要说明。
获取内核源码
linux内核官网
https://www.kernel.org/
如下图所示,内核版本以及更新到5.9.11,由于我都本机linux内核版本为5.4.0,为了方便编译,这里都以该版本为例。
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
这下载速度超赞
解压
tar -Jxvf linux-5.4.tar.xz
内核编译对源码存放的位置没有要求,这里放在home目录下自建的~/linux文件,解压后的目录,
内核代码大概有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页面
执行完之后会在根目录下生成.config文件,表示配置成功。
验证更新配置
make oldconfig
编译
make
大功告成。
交作业交作业