1、环境搭建

vmware+Fedora

2、创建一个Hello文件
[root@localhost ~]# mkdir Hello

 Linux嵌入式内核模块程序设计_Linux

3、在Hello里面创建 hello.c 和 Makefile 两个文本文件

(1):创建hello.c

[root@localhost Hello]# vim hello.c

Linux嵌入式内核模块程序设计_Linux_02

 

hello.c:

#include <linux/init.h>
#include <linux/module.h> 

#include <linux/kernel.h> # 后来加的
#include <linux/configfs.h>  # 后来加的

MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_EMERG "hello module!\n"); return 0; } static void hello_exit(void) { printk(KERN_EMERG "bye module!\n"); } module_init(hello_init); module_exit(hello_exit);
// "GPL" 是指明了 这是GNU General Public License的任意版本

// “GPL v2” 是指明 这仅声明为GPL的第二版本

// "GPL and addtional"
// "Dual BSD/GPL"
// "Dual MPL/GPL"

// "Proprietary"  私有的

// 除非你的模块显式地声明一个开源版本,否则内核会默认你这是一个私有的模块(Proprietary)。

(2):创建Makefile

[root@localhost Hello]# vim Makefile

Linux嵌入式内核模块程序设计_Linux_03

Makefile:

obj-m := hello.o
KERNELDR := /usr/src/kernels/2.6.32-358.el6.i686
PWD := $(shell pwd)
modules:
        $(MAKE) -C $(KERNELDR) M=$(PWD) modules  
clean:
        rm -rf *.o 

(3)make编译:

Linux嵌入式内核模块程序设计_Linux_04

(4)加载模块

[root@localhost Hello]# insmod hello.ko

Linux嵌入式内核模块程序设计_Linux_05

(5)卸载模块

[root@localhost Hello]# rmmod hello.ko

Linux嵌入式内核模块程序设计_Linux_06

(6)列出模块

[root@localhost Hello]# lsmod

Linux嵌入式内核模块程序设计_Linux_07

出现错误:

make编译的时候可能会出现下面的错误:

[root@localhost Desktop]# make
make -C /usr/src/kernels/2.6.32-358.el6.i686 M=/root/Desktop modules
make[1]: Entering directory `/usr/src/kernels/2.6.32-358.el6.i686'
make[2]: *** No rule to make target `/root/Desktop/hell.c', needed by `/root/Desktop/hell.o'.  Stop.
make[1]: *** 
[_module_/root/Desktop] Error 2

向内核插入新模块时,出现了File exists错误,说明模块名称有冲突,

解决措施:

最后将模块相关的c代码文件名改掉,更新Makefile中的 obj-m := xxx.o

例如:文件名hello.c 更改成 hello.c

然后更改Makefile文件内容:

Linux嵌入式内核模块程序设计_Linux_08

编译模块,insmod 成功。