【一文学会Linux内核的编译和调试】
文章插图
前言虽然我们很多人都是在linux系统上做应用程序开发,一般接触不到Linux内核代码,但是了解Linux内核的底层实现机制,对应用程序的开发,尤其是性能方面的优化提升会有很大的帮助 。研究Linux内核,我们可以看看源码,并且把内核代码给跑起来,通过gdb来调试它 。下面我们来具体实操看一下Linux内核的编译以及调试方法 。 1 编译Linux内核 1.1 下载Linux内核源码并解压
cd /usr/src
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-6.4.11.tar.xz
tar -xf linux-6.4.11.tar.xz
cd/usr/src/linux-6.4.11
1.2 安装依赖库sudo apt install libncurses5-dev libssl-dev bison flex libelf-dev gcc make openssl libc6-dev dwarves
CONFIG_DEBUG_INFO=y#在内核和内核模块中包含调试信息
CONFIG_FRAME_POINTER=y#将调用帧信息保存在寄存器或堆栈上的不同位置,使gdb在调试内核时可以更准确地构造堆栈回溯跟踪(stack back traces) 。CONFIG_GDB_SCRIPTS=y
CONFIG_KGDB=y#启用内置的内核调试器,该调试器允许进行远程调试
CONFIG_DEBUG_INFO_REDUCED=n
CONFIG_RANDOMIZE_BASE=n#KASLR会更改引导时放置内核代码的基地址, 无法从gdb设置断点
CONFIG_SYSTEM_TRustED_KEYS=""
CONFIG_SYSTEM_REVOCATION_KEYS=""
如果CONFIG_SYSTEM_TRUSTED_KEYS和CONFIG_SYSTEM_REVOCATION_KEYS没有修改,会报如下错误:No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'. Stop.
sudo make -j8
sudo make bzImage#编译内核映像文件
sudo make modules#编译模块
sudo make modules_install#安装模块
sudo make install#安装内核
安装内核后,确认/boot/grub/grub.cfg中是否已增加了刚刚编译的新的内核选项文章插图
重启虚拟机 。在GRUB界面选择 Ubuntu 高级选项,选择刚刚的内核版本linux-6.4.11进去,就可以进入了新的内核 。
文章插图
可以看到,Ubuntu虚拟机原来的内核版本是5.4.0-156,这里给它升级了新的内核版本6.4.11:
文章插图
至此,新的linux内核已经编译完成 。 2 制作文件系统2.1 编译文件系统制作工具busybox下载busybox源码并解压:
wget https://busybox.NET/downloads/busybox-1.36.1.tar.bz2
tar -xvf busybox-1.36.1.tar.bz2
修改.config编译参数:先执行make defconfig,在.config文件中添加CONFIG_STATIC=y 编译安装busybox:make busybox install
mkdir rootfs
cd rootfs/
cp -r ../busybox-1.36.1/_install/bin/ .
cp -r ../busybox-1.36.1/_install/sbin/ .
cp -r ../busybox-1.36.1/_install/usr/ .
mkdir dev proc sys
cd ..
chmod 777 -R rootfs/
cd rootfs/
touch init
制作init文件,把如下内容写入init文件#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
setsid cttyhack /bin/sh
制作生成文件系统rootfs.gz:chmod 777 init
find . | cpio -R root:root -H newc -o | gzip > ../rootfs.gz
物理机:windows系统
调试机: Ubuntu 20.04.5 LTS虚拟机,安装在VMware上,内核版本为5.4.0-156
被调试机:QEMU虚拟机,使用新编译的内核6.4.11版本和自制的简易文件系统
3.1 安装QEMU虚拟机apt install qemu qemu-utils qemu-kvm virt-manager libvirt-daemon-system libvirt-clients bridge-utils
qemu-system-x86_64 -kernel /usr/src/linux-6.4.11/arch/x86_64/boot/bzImage -initrd /home/kernel/rootfs.gz -Append "nokaslr console=ttyS0" -s -S -nographic
推荐阅读
- Linux 系统中使用inotifywait监控文件变化
- 保护Linux文件和目录的秘密武器:chattr命令详解
- 自行车怎么学才能学会 电动自行车怎么学才能学会
- 我是大专学会计的 ,可不可以考公安的岗位,大专生考公好考吗?
- 在Linux系统中实现容器化的消息中间件:RabbitMQ和Kafka
- 野钓鲫鱼,学会4个“万金油”招数,在哪儿都能爆护
- 如何在 Linux 中查找映射到 VxVM 磁盘的 SAN LUN
- 一文带你了解Docker与Containerd的区别
- 野钓选钓位,学会这些技巧,深浅都能找到鱼窝
- Linux 最常用命令:能解决 95% 以上的问题