1. 建立内核树
下载内核源码
在装载内核之前,需要在自己的文件系统中建立内核树。在命令行中输入#uname -a
命令查看本机的内核版本(4.4),然后到kernel.org上下载对应的版本的内核源码。内核源码的主次设备号与本机内核版本保持一致。将源码下载到本地目录/home/wlf/linux/
下。
解压
#tar -xzvf linux-4.4.176.tar.xz
,解压后生成linux-4.4.176
目录。
配置
进入目录linux-4.4.176
,将当前系统的.config
文件拷贝到本目录下:
#cp /boot/config-4.4-142-generic ./.config
编译内核
#make
//(时间较长,1-2个小时,make命令实际分为两个阶段:stage1,stage2,第一个阶段生成了内核镜像文件bzImage,第二个阶段编译模块,相当于make = make bzImage + make modules).
安装模块
#make modules_install
新内核启动配置
将生成的内核文件拷贝至系统启动目录:#cp /home/wlf/linux/linux-4.4.176/arch/x86/boot/bzImage /boot/vmlinuz-4.4.176
;
制作initrd镜像文件:mkinitramfs 4.4.176 -o initrd.img-4.4.176
(本机为ubuntu系统,不同操作系统该命令可能不同,执行后会在/boot/目录下生成initrd.img-4.4.176文件)
升级grub:#updates grub2
,该命令会自动修改grub配置文件
启动新内核
重启操作系统,在grub页面会出现新安装的内核选项,启动即可,若启动失败,还可以在grub中选择之前的内核启动。
2. 测试模块
前面都是准备工作,下面开始编写模块。
1.hello.c:
在合适的地方新建/deviceDriver/helloWolrd
目录,在目录下创建文件:hello.c
#include<linux/init.h> //初始换函数
#include<linux/kernel.h> //内核头文件
#include<linux/module.h> //模块的头文件
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello,world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye,Cruel world \n");
}
module_init(hello_init);
module_exit(hello_exit);
2.Makefile:
再创建Makefile文件:
obj-m := hello.o
KVERSION = $(shell uname -r)
all:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean
3.执行 #make
会在目录下生成hello.ko,这就是我们得到的模块。
4.安装模块:sudo insmod hello.ko
5.查看打印信息
#tail -f /var/log/kern.log
6.卸载模块
#sodu rmmod hello.ko
参考链接