参考自以下文章。
Linux驱动基础开发
Linux内核入门——驱动模块
《嵌入式应用程序设计》--华清远见
hello.c
#include<linux/init.h> #include<linux/module.h> int __init start(void) { printk(KERN_INFO "this is module onl oad finish\n");//中间就是空格,一开始写的,,怎么也没有输出,还看了好久。 return 0; } void __exit end(void) { printk(KERN_INFO "this is module on close last\n"); } module_init(start); module_exit(end); MODULE_AUTHOR("yyjeqhc"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("simple hello");
Makefile
obj-m :=hello.o CONFIG_MODULE_SIG=n all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules //注意都是Tab,不是空格 clean: echo "clean"
注意Makefile里面hello.o和文件hello.c是同名的,然后直接make即可
insmod hello.ko //加载模块 rmmod hello.ko //卸载模块 lsmod //查看所有模块 dmesg //查看系统输出,可以看加载和卸载模块的输出 dmesg -c 清除系统输出
hello.c
#include<linux/init.h> #include<linux/module.h> static int num = 1234; static char *str = "this is default printstr"; static int __init start(void) { printk(KERN_INFO "this is module onl oad finish\n"); printk("<1> num is %d str = %s\n",num,str); return 0; } static void __exit end(void) { printk(KERN_INFO "this is module on close last\n"); } module_init(start); module_exit(end); module_param(num,int,S_IRUGO); module_param(str,charp,S_IRUGO); MODULE_AUTHOR("yyjeqhc"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("simple hello");
Makefile和上面一样。
之前已经清除系统输出了。
不带参数的加载/卸载模块。
不带参数,就输出的默认的值。
带参数的加载模块:
需要注意的是,参数的值和参数之间不能有空格;然后参数是字符串,中间也不能有空格。
hello.c
#include<linux/init.h> #include<linux/module.h> int addNum(int a,int b) { return a + b; } int subNum(int a,int b) { return a - b; } EXPORT_SYMBOL(addNum); EXPORT_SYMBOL(subNum); MODULE_AUTHOR("yyjeqhc"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("simple hello");
Makefile不变,直接make即可。
/proc/kallsyms //查看系统符号,添加grep过滤一下
可见这个导出符号已经装载了。
这时,编写其它模块就可以调用它,只需要extern即可。
test.c
#include<linux/init.h> #include<linux/module.h> extern int addNum(int,int); extern int subNum(int,int); static int __init start(void) { printk(KERN_INFO "this is module onl oad finish\n"); int a = 25; int b = 7; printk("<1> test add %d + %d = %d \n",a,b,addNum(a,b)); printk("<1> test sub %d + %d = %d \n",a,b,subNum(a,b)); return 0; } static void __exit end(void) { printk(KERN_INFO "this is module on close last\n"); } module_init(start); module_exit(end); MODULE_AUTHOR("yyjeqhc"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("simple hello");
Makefile改一下对应的名称即可。
重新make,然后装载,可以看见调用了上面hello.ko中的函数
本来以为普通的C程序也能调用呢,但是好像不太行。