【一文学会Linux内核的编译和调试】

文章插图
前言虽然我们很多人都是在linux系统上做应用程序开发,一般接触不到Linux内核代码,但是了解Linux内核的底层实现机制,对应用程序的开发,尤其是性能方面的优化提升会有很大的帮助 。研究Linux内核,我们可以看看源码,并且把内核代码给跑起来,通过gdb来调试它 。下面我们来具体实操看一下Linux内核的编译以及调试方法 。 1 编译Linux内核 1.1 下载Linux内核源码并解压
cd /usr/srcwget https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-6.4.11.tar.xztar -xf linux-6.4.11.tar.xzcd/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=yCONFIG_KGDB=y#启用内置的内核调试器,该调试器允许进行远程调试CONFIG_DEBUG_INFO_REDUCED=nCONFIG_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 rootfscd 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 syscd ..chmod 777 -R rootfs/cd rootfs/touch init制作init文件,把如下内容写入init文件#!/bin/shdmesg -n 1mount -t devtmpfs none /devmount -t proc none /procmount -t sysfs none /syssetsid cttyhack /bin/sh制作生成文件系统rootfs.gz:chmod 777 initfind . | 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% 以上的问题
