Menu

Linux 内核开发环境搭建

因为一直想从事安全方面的工作,所以,我也要学习和熟悉Linux内核,以及内核相关的开发。

在研究内核的开始,就必须构建一套开发环境,这个是每个程序员好像做某个特定事情之前,必须要经历的步骤。

我选用的Ubuntu18.04作为开发机,然后采用了linux-4.19.157这个版本的内核。

第一步就是下载内核,直接在 https://www.kernel.org/ 下载,选择你需要的内核下载下来就好。

解压内核文件, sudo tar -xavf linux-4.19.157.tar.xz,然后为自己开发机安装相关开发编译工具。

  • sudo apt-get install gcc make libncurses5-dev openssl libssl-dev
  • sudo apt-get install build-essential
  • sudo apt-get install pkg-config
  • sudo apt-get install libc6-dev
  • sudo apt-get install bison
  • sudo apt-get install flex
  • sudo apt-get install libelf-dev

然后构建一个默认的内核编译配置文件,将/boot/config-XXXXXX-generic这个文件复制你的内核源码根目录,并改为 .config 。

sudo cp /boot/config-4.15.0-20-generic ~/linux-4.19.157/.config

执行 sudo make menuconfig后,直接Exit,采用默认选项。

紧接着就开始编译,命令是:

sudo make 和 sudo make modules_install

这里根据机器的不同,需要等待编译完成。

编译完成后,你需要将编译好的内核,替换现在的内核。然后拷贝内核到系统目录,具体的操作步骤:

  • sudo mv ~/linux-4.19.157 ~/../../usr/src/
  • cd usr/src/linux-4.19.157
  • sudo make install
  • sudo mkinitramfs -o /boot/initrd.img-4.19.157
  • sudo update-initramfs -c -k 4.19.157
  • sudo update-grub2

这个时候,基本的内核编译和安装操作已经完成了。你可以重启一下,然后使用uname -a查看下当前的内核版本是否为你编译的。

接下来,就是要测试开发环境。

 

一个Sample内核模块程序:

#include <linux/init.h> 
#include <linux/module.h> 
MODULE_LICENSE("Dual BSD/GPL"); 
static int hello_init(void)
{ 
    printk(KERN_ALERT "Hello world, By Garfield!\n"); 
    return 0; 
}

static void hello_exit(void) 
{ 
    printk(KERN_ALERT "Goodbye , Garfield.\n"); 
}

module_init(hello_init); 
module_exit(hello_exit);

然后编写一个makefile文件

ifneq ($(KERNELRELEASE),)
CONFIG_MODULE_SIG=n
obj-m:=hello.o
else
PWD:=$(shell pwd)
KDIR:=/lib/modules/$(shell uname -r)/build
 all:
        $(MAKE) -C $(KDIR) M=$(PWD)
 clean:
        rm -rf *.o *.mod.c *.ko *.symvers *.order *.markers
endif

其中,CONFIG_MODULE_SIG=n这一句话很重要。如果你没有这一句话,在新的内核版本中,内核是无法被加载,加载后,会提示: altera_cvp:module verification failed : signature and/or required key missing – tainting kernel

然后,你就可以使用make编译刚刚的代码了。如果提示:*** /lib/modules/*/build Stop…则需要去映射一下内核源码。

具体操作为:

  • 首先进入 lib/modules/xxxxx/ 然后查看是否有build这个目录,如果有,就删除。 sudo rm build
  • 然后将源码映射过去,使用命令 ln -sv /usr/src/kernels/xxxx/ /lib/modules/xxxx/build

然后再次编译,理论上就会通过了。

最后,就是3个内核加载,删除,查看的命令了。内核输出的日志,用sudo dmesg查看,清楚日志则为sudo dmesg -c。

  • insmod: 将模块插入内核中,使用方法:#insmod XXX.ko
  • rmmod: 将模块从内核中删除,使用方法:#rmmod XXX.ko
  • lsmod: 列表显示所有的内核模块,可以和grep指令结合使用。使用方法:#lsmod | grep XXX

Categories:   Garfield's Diary

Comments