1.内核模块的三大要素
1.1头文件 <linux/init.h>和<linux/module.h>(和模块相关的)
1.2加载模块函数module_init():在insmod模块是会调用这个函数
ps它的返回值为0,如果返回非零值,就会认为出错
1.3卸载模块函数module_exit();同上
2.代码的编写
2.1申明
MODULE_LICENSE("遵守的协议")一般是GPL
MODULE_AUTHOR("作者")
MODULE_DESCRIPTIOM("模块功能描述")
MODULE_VERSION("v1.0")
2.2模块传递参数
module_param(name,type(字符串型用charp),perm)
2.3输出
而在模块程序编写中不使用printf而使用printk。例printk(KERN_WARNING”Hello World\n”)
2.4内核中导出使用的宏
EXPORT_SYMBOL()
EXPORT_SYMBOL_GPL()只能用于含有GPL许可证的
在其他程序调用extern
3.Makefile的编写
一般分为四部分
obj-m :=name1.o name2.o
name1-obj :=file1.c file2.c...(name1模块石由多个c文件组成)
KDIR :=/内核代码路径
all:
make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm
进入KDIR中执行编译PWD中的模块命令
clean:
rm -f
4.第一次在板子卸载模块时提示没有目录
需要在lib/modules中有内核版本的目录
使用 mkdir -p /lib/modules/$(uname -r)