1. 内核树的构建过程:
1.1 安装所需软件
$ sudo apt-get install build-essential kernel-package libncurses5-dev
1.2 查看可用源码包
$ sudo apt-cache search linux-source
1.3 获取源码包
$ sudo apt-get install linux-source-x.x.x
1.4 解压源码包
$ tar jxvf linux-source-x.x.x.tar.bz2
1.5 利用.oldconfig初始化.config
$ make oldconfig
1.6 切换root
$ sudo -i
1.7 编译内核树
$ make -j4
2. 编译内核树遇到错误:
2.1提示有关CONFIG_DEBUG_SECTION_MISMATCH=y错误
请将左侧条目添加到.config文件相应位置即可。
2.2如提示有关__modver_version_show错误
- ERROR: "__modver_version_show" [drivers/staging/rts5139/rts5139.ko]undefined!
- WARNING: modpost: Found 5 section mismatch(es).
- To see full details build your kernel with:
- 'make CONFIG_DEBUG_SECTION_MISMATCH=y‘
- make[1]: *** [__modpost] Error 1
- make: *** [modules] Error 2
请将.config对应条目设置为CONFIG_RTS5139=N
3. 自定义简单模块
3.1 自定义模块的源码
#include <linux/module.h>
#include <linux/init.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\n");
}
module_init(hello_init);
module_exit(hello_exit);
3.2 自定义模块的Makefile
obj-m := hello.o
KERNELDIR := /usr/src/linux-source-x.x.x
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
需要注意tab与space的区别,行首缩进是制表符,不是多个连续空格。
3.3 编译自定义模块
确保Makefile文件编写正确,否则出现各种各样的奇葩问题,进入模块目录,$ make 即可,使用此Makefile不需要使用make -C ...M=...复杂编译命令。
3.4 测试自定义模块
3.4.1启用tty1
Ubuntu系统请按住ctrl+shift+ f1键启用tty1,普通shell看不到printk的输出,并切换为root
3.4.2 测试加载模块
$ insmod hello.ko
3. 4.3测试移除模块
$ rmmod hello.ko