您当前的位置:首页 > 电脑百科 > 软件技术 > 操作系统 > linux百科

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

时间:2023-09-09 14:06:39  来源:微信公众号  作者: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=y     CONFIG_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中是否已增加了刚刚编译的新的内核选项
重启虚拟机。在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
 
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/sh
dmesg -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文件系统:
  • 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
我们也可以先不加-s和-S参数,测试验证一下编译的Linux内核是否能正常启动:
  • qemu-system-x86_64 -kernel ./bzImage -initrd ./rootfs.img -append "nokaslr console=ttyS0" -nographic
QEMU虚拟机启动参数说明如下:
-kernel ./bzImage:指定启用的内核镜像;-initrd ./rootfs.img:指定启动的内存文件系统;-append "nokaslr console=ttyS0":附加参数,其中 参数必须添加进来,防止内核起始地址随机化,这样会导致 gdb 断点不能命中;参数说明可以参见这里。nokaslr-s:监听在 gdb 1234 端口;-S:表示启动后就挂起,等待 gdb 连接((CPU 初始化之前冻结起来);-nographic:不启动图形界面,调试信息输出到终端与参数 组合使用;console=ttyS
如果要退出QEMU虚拟机,可以先按ctrl + a键,然后再按x键,即可退出QEMU。
 
3.3 gdb调试Linux内核
编译Linux内核时,会生成一个vmlinux文件,vmlinux是Linux内核编译出来的原始的内核文件,可以用来进行调试内核和定位内核问题。
gdb开始调试,设置远程调试的端口1234:
  • cd /usr/src/linux-6.4.11/gdb vmlinuxtarget remote :1234
跟gdb调试普通程序一样,我们可以设置一下断点,然后按c键继续运行:
  • b start_kernelb rest_initc
可以看到gdb在start_kernel和rest_init两个函数断点处停住了,按c键后,QMUE虚拟机成功进入了系统。start_kernel是Linux内核启动时C代码开始的地方,研究内核启动过程就可以从start_kernel开始看。


Tags:Linux   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
微软 Win11 Linux 子系统(WSL)发布 2.2.2 版本
IT之家 4 月 8 日消息,微软近日更新 Windows Subsystem for Linux(WSL),最新 2.2.2 版本中带来了诸多改进,重点更新了 nft 规则,可以让 IPv6 流量通过 Linux 容器。图源: dev.to,AI...【详细内容】
2024-04-08  Search: Linux  点击:(5)  评论:(0)  加入收藏
从原理到实践:深入探索Linux安全机制
Linux 是一种开源的类Unix操作系统内核,由Linus Torvalds在1991年首次发布,其后又衍生出许多不同的发行版(如Ubuntu、Debian、CentOS等)。前言本文将从用户和权限管理、文件系统...【详细内容】
2024-03-27  Search: Linux  点击:(13)  评论:(0)  加入收藏
在Linux系统中,如何处理内存管理和优化的问题?
本文对 Linux 内存管理和优化的一些高级技巧的详细介绍,通过高级的内存管理技巧,可以帮助系统管理员和开发人员更好地优化 Linux 系统的内存使用情况,提高系统性能和稳定性。在...【详细内容】
2024-03-26  Search: Linux  点击:(7)  评论:(0)  加入收藏
Linux 6.9-rc1 内核发布:AMD P-State 首选核心、BH 工作队列
IT之家 3 月 25 日消息,Linus Torvalds 宣布,Linux 6.9 内核的首个 RC(候选发布)版 Linux 6.9-rc1 发布。▲ Linux 6.9-rc1Linus 表示,Linux 内核 6.9 看起来是一个“相当正常”...【详细内容】
2024-03-25  Search: Linux  点击:(9)  评论:(0)  加入收藏
Linux发行版 Ubuntu 迎更新 界面设计灵感来自 Windows 11
近日,一位第三方开发者推出了一款名为“Wubuntu”的特殊Linux发行版。这款系统源自主流的Ubuntu版本,但在界面设计上却借鉴了微软最新的Windows 11风格,甚至在其中融入了微软标...【详细内容】
2024-02-27  Search: Linux  点击:(41)  评论:(0)  加入收藏
Win + Ubuntu 缝合怪:第三方开发者推出“Wubuntu”Linux 发行版
IT之家 2 月 26 日消息,一位第三方开发者推出了一款名为“Wubuntu”的缝合怪 Linux 发行版,系统本身基于 Ubuntu,但界面为微软 Windows 11 风格,甚至存在微软 Windows 徽标。据...【详细内容】
2024-02-27  Search: Linux  点击:(47)  评论:(0)  加入收藏
Linux中磁盘和文件系统工作原理解析
在Linux系统中,一切皆文件的概念意味着所有的资源,包括普通文件、目录以及设备文件等,都以文件的形式存在。这种统一的文件系统管理方式使得Linux系统具有高度的灵活性和可扩展...【详细内容】
2024-02-20  Search: Linux  点击:(49)  评论:(0)  加入收藏
Linux子系统概览
inux操作系统是一个模块化的系统,由多个子系统组成。这些子系统协同工作,使Linux能够执行各种任务。了解Linux的子系统有助于更好地理解整个操作系统的运作机制。以下是Linux...【详细内容】
2024-02-01  Search: Linux  点击:(74)  评论:(0)  加入收藏
Linux内核:系统之魂与交互之源
内核,作为任何基于Linux的操作系统的心脏,扮演着至关重要的角色。它不仅是计算机系统软件与硬件之间的桥梁,更是确保系统稳定、高效运行的关键。内核提供了一系列核心功能,为上...【详细内容】
2024-02-01  Search: Linux  点击:(65)  评论:(0)  加入收藏
如何使用PHP SSH2模块执行远程Linux命令
PHP SSH2扩展是用于在PHP程序中使用SSH(安全壳协议)的一种扩展。它允许建立加密连接和执行远程命令、上传和下载文件等操作,十分方便实用。下面我将为大家详细介绍一下该扩展的...【详细内容】
2024-01-26  Search: Linux  点击:(99)  评论:(0)  加入收藏
▌简易百科推荐
微软 Win11 Linux 子系统(WSL)发布 2.2.2 版本
IT之家 4 月 8 日消息,微软近日更新 Windows Subsystem for Linux(WSL),最新 2.2.2 版本中带来了诸多改进,重点更新了 nft 规则,可以让 IPv6 流量通过 Linux 容器。图源: dev.to,AI...【详细内容】
2024-04-08    IT之家  Tags:Linux   点击:(5)  评论:(0)  加入收藏
从原理到实践:深入探索Linux安全机制
Linux 是一种开源的类Unix操作系统内核,由Linus Torvalds在1991年首次发布,其后又衍生出许多不同的发行版(如Ubuntu、Debian、CentOS等)。前言本文将从用户和权限管理、文件系统...【详细内容】
2024-03-27  凡夫编程  微信公众号  Tags:Linux安全   点击:(13)  评论:(0)  加入收藏
在Linux系统中,如何处理内存管理和优化的问题?
本文对 Linux 内存管理和优化的一些高级技巧的详细介绍,通过高级的内存管理技巧,可以帮助系统管理员和开发人员更好地优化 Linux 系统的内存使用情况,提高系统性能和稳定性。在...【详细内容】
2024-03-26  编程技术汇  微信公众号  Tags:Linux   点击:(7)  评论:(0)  加入收藏
Linux 6.9-rc1 内核发布:AMD P-State 首选核心、BH 工作队列
IT之家 3 月 25 日消息,Linus Torvalds 宣布,Linux 6.9 内核的首个 RC(候选发布)版 Linux 6.9-rc1 发布。▲ Linux 6.9-rc1Linus 表示,Linux 内核 6.9 看起来是一个“相当正常”...【详细内容】
2024-03-25    IT之家  Tags:Linux   点击:(9)  评论:(0)  加入收藏
轻松实现Centos系统的软件包安装管理:yum指令实战详解
yum 是一种用于在 CentOS、Red Hat Enterprise Linux (RHEL) 等基于 RPM 的 Linux 发行版上安装、更新和管理软件包的命令行工具。它可以自动解决软件包依赖关系,自动下载并...【详细内容】
2024-02-27  凡夫贬夫  微信公众号  Tags:Centos   点击:(51)  评论:(0)  加入收藏
Win + Ubuntu 缝合怪:第三方开发者推出“Wubuntu”Linux 发行版
IT之家 2 月 26 日消息,一位第三方开发者推出了一款名为“Wubuntu”的缝合怪 Linux 发行版,系统本身基于 Ubuntu,但界面为微软 Windows 11 风格,甚至存在微软 Windows 徽标。据...【详细内容】
2024-02-27    IT之家  Tags:Ubuntu   点击:(47)  评论:(0)  加入收藏
Linux中磁盘和文件系统工作原理解析
在Linux系统中,一切皆文件的概念意味着所有的资源,包括普通文件、目录以及设备文件等,都以文件的形式存在。这种统一的文件系统管理方式使得Linux系统具有高度的灵活性和可扩展...【详细内容】
2024-02-20  王建立    Tags:Linux   点击:(49)  评论:(0)  加入收藏
Linux子系统概览
inux操作系统是一个模块化的系统,由多个子系统组成。这些子系统协同工作,使Linux能够执行各种任务。了解Linux的子系统有助于更好地理解整个操作系统的运作机制。以下是Linux...【详细内容】
2024-02-01    简易百科  Tags:Linux   点击:(74)  评论:(0)  加入收藏
Linux内核:系统之魂与交互之源
内核,作为任何基于Linux的操作系统的心脏,扮演着至关重要的角色。它不仅是计算机系统软件与硬件之间的桥梁,更是确保系统稳定、高效运行的关键。内核提供了一系列核心功能,为上...【详细内容】
2024-02-01  松鼠宝贝    Tags:Linux内核   点击:(65)  评论:(0)  加入收藏
如何确保Linux进程稳定与持久
在Linux系统中,进程的稳定性与持久性对于维持系统的持续运行至关重要。然而,由于各种原因,进程可能会面临崩溃或系统重启的情况。为了确保关键进程能够持续运行,我们必须采取一...【详细内容】
2024-01-19  松鼠宝贝    Tags:Linux进程   点击:(84)  评论:(0)  加入收藏
站内最新
站内热门
站内头条