记录CentOS7下编写驱动模块
作者:互联网
记录Centos7下编写驱动模块
参考自以下文章。
《嵌入式应用程序设计》--华清远见
1.最简单模块
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 清除系统输出
2.带参数模块
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和上面一样。
之前已经清除系统输出了。
不带参数的加载/卸载模块。
不带参数,就输出的默认的值。
带参数的加载模块:
需要注意的是,参数的值和参数之间不能有空格;然后参数是字符串,中间也不能有空格。
3.导出符号。
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程序也能调用呢,但是好像不太行。
标签:int,void,MODULE,CentOS7,module,模块,编写,printk,hello 来源: https://www.cnblogs.com/dayq/p/16210757.html