- A+
最近项目也和linux kernel技术有关,调试内核和内核模块、修改内核源码,是学习内核的重要技术手段之一。应用这些技术时,都有一本基本的要求,那就是编译内核。因此,在分析内核调试技术之前,本随笔给出内核的编译准备工作与具体实现过程。
开发环境
Ubuntu20.04
系统自带的内核版本:5.4.0-42-generic
kernel编译前的准备
在编译内核之前,有些准备工作需要进行。首先,就是从内核网站https://mirrors.edge.kernel.org/pub/linux/kernel/,下载好源码。这之前,需要确定下载哪个版本的内核源码。因为我目前的开发环境是ubuntu 20.04,内核版本为5.4.0。而实验选择的下载版本,就是5.4.0。因为这样编译过程不容易出现bug(理论上其他内核版本也可以,具体问题后面分析)。
接着,使用sudo apt-get install安装一些必要的软件。在进行配置时,会执行命令“make menuconfig”,它需要libncurses5-dev、flex、bison等软件。ncurses库可用于管理字符终端界面,而bison和flex是生成词法分析器的工具。除此之外,还需要安装好kernel-package、libssl-dev。
最后一项准备工作,就是禁止内核地址随机化。出于安全考虑,内核支持ASLR (Address Space Layout Randomization),即地址随机化。但是随机化在增加安全保障的同时,也给内核开发带来了一些麻烦,比如内核模块、函数等相关地址不方便直接确定。在后面的kgdb开发中,不管是开发机,还是目标机,都需要禁止内核地址随机化。禁止的方法,即修改grub配置文件。具体步骤如下:
打开/etc/default/grub文件;
在该文件中,找到GRUB_CMDLINE_LINUX,修改其为:GRUB_CMDLINE_LINUX="nokaslr";
执行命令update-grub,以更新grub配置文件等;
最后,重启系统即可。
上述步骤实质就是设置了内核命令行参数nokaslr,其意为禁止内核ASLR。一般来说,单纯编译内核是不需要这一步骤的。但是,在后面的项目中,都需要禁止内核地址随机化。因此,将其放在了编译前的准备工作中。