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

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

一文学会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
 1.3 修改Linux内核编译参数执行 sudo make menuconfig 点击save保存,生成.config文件,在vim .config修改如下内核参数配置: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.
 1.4 开始编译Linux内核使用make编译sudo make -j8 sudo make bzImage#编译内核映像文件sudo make modules#编译模块sudo make modules_install#安装模块sudo make install#安装内核安装内核后,确认/boot/grub/grub.cfg中是否已增加了刚刚编译的新的内核选项
一文学会Linux内核的编译和调试

文章插图
重启虚拟机 。在GRUB界面选择 Ubuntu 高级选项,选择刚刚的内核版本linux-6.4.11进去,就可以进入了新的内核 。
一文学会Linux内核的编译和调试

文章插图
可以看到,Ubuntu虚拟机原来的内核版本是5.4.0-156,这里给它升级了新的内核版本6.4.11:
一文学会Linux内核的编译和调试

文章插图
至此,新的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
 2.2 制作文件系统rootfs.gz拷贝相关文件到文件系统目录: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
 3 调试Linux内核Linux内核有多种调试方式,这里我们采用的是通过QEMU虚拟机加gdb远程调试的方式 。调试环境如下:物理机: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
 3.2 启动QEMU虚拟机这里需要指定上面我们编译linux内核时产生的内核映像文件bzImage和刚刚制作的rootfs.gz文件系统: