注:加粗的是需要输入的命令,蓝色的是输入命令后对应的显示内容
第一步:编译内核树
1、查看内核版本及源码
changyijia@changyijia-Lenovo-Z50-70:~$uname -r
3.13.0-77-generic //我的是这个版本的,下面这个都替换成自己版本的哈
接着看下有没有下载好的源码
changyijia@changyijia-Lenovo-Z50-70:~$cd /usr/src
changyijia@changyijia-Lenovo-Z50-70:/usr/src$ls linux-4.3 linux-headers-3.13.0-68
linux-headers-3.13.0-44 linux-headers-3.13.0-77
linux-headers-3.13.0-44-generic linux-headers-3.13.0-77-generic
linux-headers-3.13.0-45
linux-headers-3.13.0-45-generic
发现并没有我们需要的linux-source-3.13.0,就需要下载内核源码,有的话就不用了
2、下载内核源码
首先查看目前可下载的我们这个版本的源码
changyijia@changyijia-Lenovo-Z50-70:/usr/src$apt-cache search linux-sourcelinux-source - Linux kernel source with Ubuntu patches
linux-source-3.13.0 - Linux kernel source for version 3.13.0 with Ubuntu patches
changyijia@changyijia-Lenovo-Z50-70:/usr/src$sudo apt-get install linux-source-3.13.0
changyijia@changyijia-Lenovo-Z50-70:/usr/src$ ls
linux-4.3 linux-headers-3.13.0-68
linux-headers-3.13.0-44 linux-headers-3.13.0-77
linux-headers-3.13.0-44-generic linux-headers-3.13.0-77-generic
linux-headers-3.13.0-45 linux-source-3.13.0.tar.bz2
linux-headers-3.13.0-45-generic
发现出现了linux-source-3.13.0.tar.bz2,说明下载成功
changyijia@changyijia-Lenovo-Z50-70:/usr/src$ sudo tar jxvf linux-source-3.13.0.tar.bz2
changyijia@changyijia-Lenovo-Z50-70:/usr/src$ cd ./linux-source-3.13.0
changyijia@changyijia-Lenovo-Z50-70:/usr/src/linux-source-3.13.0$ sudo make oldconfig //按照配置原版的方法进行配置
changyijia@changyijia-Lenovo-Z50-70:/usr/src/linux-source-3.13.0$ sudo make//开始编译,过程略长,去睡一觉吧
changyijia@changyijia-Lenovo-Z50-70:/usr/src/linux-source-3.13.0$ ls //这一步会发现显示一个vmlinux的文件,说明成功
changyijia@changyijia-Lenovo-Z50-70:/usr/src/linux-source-3.13.0$ sudo make modules//编译模块
changyijia@changyijia-Lenovo-Z50-70:/usr/src/linux-source-3.13.0$ sudo make modules_install//安装模块
这一步结束后,内核就编译完成了,在/lib/modules下会生成一个新的目录
changyijia@changyijia-Lenovo-Z50-70:~$cd /lib/modules
changyijia@changyijia-Lenovo-Z50-70:/lib/modules$ls
3.13.0-43-generic 3.13.0-45-generic 3.13.0-77-generic
3.13.0-44-generic 3.13.0-68-generic 3.13.11-ckt32
我新生成的目录是3.13.11-ckt32,下面也替换成自己的哈
3、编译及连接hello_world模块
changyijia@changyijia-Lenovo-Z50-70:/lib/modules~$cd
changyijia@changyijia-Lenovo-Z50-70:~$mkdir ./moduleTest //在主文件夹里新建了个文件夹moduleTest
接着新建两个文档,分别命名为hello.c和Makefile
hello.c:
<span style="font-family:Microsoft YaHei;font-size:12px;">#include <linux/init.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);
</span>
Makefile:
<span style="font-family:Microsoft YaHei;font-size:12px;">ifneq ($(KERNELRELEASE),)
obj-m :=hello.o
else
KERNELDIR ?=/lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
clean:
rm -rf *.o *~ .depend .* .</span>
changyijia@changyijia-Lenovo-Z50-70:~$ cd ./moduleTest
changyijia@changyijia-Lenovo-Z50-70:~/moduleTest$ sudo make//编译模块
changyijia@changyijia-Lenovo-Z50-70:~/moduleTest$ sudo insmod ./hello.ko//插入模块,本来应该显示,结果啥都没有
changyijia@changyijia-Lenovo-Z50-70:~/moduleTest$cat /var/log/syslog |grep world //这一步可以查看系统日志,在这里应该有显示
Feb 23 00:37:05 changyijia-Lenovo-Z50-70 kernel: [89235.050838] Hello,world//出现这个说明成功了
changyijia@changyijia-Lenovo-Z50-70:~/moduleTest$ sudo rmmod ./hello.ko//卸载模块
changyijia@changyijia-Lenovo-Z50-70:~/moduleTest$cat /var/log/syslog |grep world //再次查看系统日志,在这里应该有显示
Feb 23 00:37:05 changyijia-Lenovo-Z50-70 kernel: [89235.050838] Hello,world
Feb 23 00:38:11 changyijia-Lenovo-Z50-70 kernel: [89300.556694] Goodbye,cruel world
ok,大功告成!!