记录CentOS7下编写驱动模块
2022/5/1 7:14:58
本文主要是介绍记录CentOS7下编写驱动模块,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
记录Centos7下编写驱动模块
参考自以下文章。
Linux驱动基础开发
Linux内核入门——驱动模块
《嵌入式应用程序设计》--华清远见
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程序也能调用呢,但是好像不太行。
这篇关于记录CentOS7下编写驱动模块的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享