苦学kernel(一)——kernel的下载和编译
kernel的下载和编译
本系列的环境均为ubuntu 20.04,本文的内核使用的是linux-5.4.98
下载内核
curl -O -L https://mirrors.tuna.tsinghua.edu.cn/kernel/v5.x/linux-5.4.98.tar.xz
这个下载指令需要用到curl,没有的可以用一下指令安装
sudo apt install curl
如果出现如下报错

那么请输入以下指令升级apt-get
sudo apt-get update
下载完成后进行解压
unxz linux-5.4.98.tar.xz
经过这样一系列的操作我们就下载完成了
验证内核签名
为了防止内核被恶意修改,在发布内核时,发布者会对内核进行签名,所以我们需要对内核的签名进行校验
下载内核签名
curl -O -L https://mirrors.tuna.tsinghua.edu.cn/kernel/v5.x/linux-5.4.98.tar.sign
第一次验证
gpg --verify linux-5.4.98.tar.sign

可以看到是有报错的,其报错信息显示的是没有公钥即public key,所以我们去下载对应的公钥
公钥下载
gpg --locate-keys torvalds@kernel.org gregkh@kernel.org
第二次验证
gpg --verify linux-5.4.98.tar.sign

可以看到报了一个错误,表示的是这个密钥没有使用信任的签名进行认证,所以我们设置信任对应的密钥
信任密钥
gpg --tofu-policy good 647F28654894E3BD457199BE38DBBDC86092693E

第三次验证
gpg --trust-model tofu --verify linux-5.4.98.tar.sign
可以发现这个验证指令和之前的有点不一样,因为我们使用了TOFU信任密钥

可以看到这次验证成功了
解压内核
tar -xf linux-5.4.98.tar
编译选项配置
第一次配置
make menuconfig

根据这个报错我们可以知道需要去下载ncurses-dev
下载ncurses-dev
sudo apt install ncurses-dev
第二次配置
make menuconfig

可以发现缺少了flex和bison
下载flex和bison
sudo apt-get install flex
sudo apt-get install bison
第三次配置
make menuconfig

可以看到进入了配置页面,接下来进入Kernel hacking -> Compile-time checks and compiler options,然后勾选Compile the kernel with debug info,便于后面的调试
ps:如果要使用kgdb调试内核,需要选择Kernel hacking下的KGDB:kernel debugger,并选中KGDB下的所有选项
编译内核
make -j3 bzImage
第一个报错

这时候我们修改.config文件
gedit .config
把CONFIG_SYSTEM_TRUSTED_KEYS赋值成空,即
CONFIG_SYSTEM_TRUSTED_KEYS=""
第二个报错

这个是缺少dwarves软件包
sudo apt-get install dwarves
编译成功
编译成功的话最后的信息回事这样的

内核文件
编译成功后我们发现文件夹里一堆文件,这边对这些核心文件进行介绍
bzImage:位于arch/x86/boot/bzImage文件目录下,目前主流的kernel镜像格式,即big zImage,适用于较大的(大于512KB)Kernel。这个镜像会被加载到内存的高地址,(地址高于1MB)。bzImage是用gzip压缩的,文件的开头部分有gzip解压缩的代码,所以我们不能用gunzip解压缩
zImage:比较老的kernel镜像格式,适用于较小的(不大于512KB)Kernel。启动时,这个镜像会被加载到内存的低地址(内存的前640KB)。zImage也不能用gunzip解压缩
vmlinuz:vmlinuz不仅包含了压缩后的vmlinux,还包含了gzip解压缩的代码。实际上就是zImage或者bzImage文件。该文件是bootable的。bootable是指它能够把内核加载到内存中。对于Linux系统而言,该文件位于boot目录下,该目录包含了启动系统时所需要的文件。
vmlinux:位于根目录下,静态链接的Linux kernel,以可执行文件的形式存在,尚未经过压缩,该文件往往是在生成vmlinuz的过程中产生的。该文件适合用于调试,但是该文件不是bootable的。
vmlinux.bin:静态链接的Linux kernel,只是以一个可启动的(bootable)二进制文件存在。所有的符号信息和重定位信息都被删除了,生成命令为:objcopy -O binary vmlinux vmlinux.bin。
uImage:uImage是U-boot专用的镜像文件,是在zImage之前加上了一个长度为0x40的tag构成的,这个tag说明了这个镜像文件的类型、加载位置、生成时间、大小等信息

浙公网安备 33010602011771号