Linux驱动开发入门基础

Linux驱动开发
简单的helloworld内核模块程序
源码分析
1 #include <linux/init.h> //位于内核源码include下,主要包含了内核模块的加载、卸载函数的声明,还有一些宏定义。涉及到内核模块编程需要
2 #include <linux/module.h> //一些宏定义,MODULE_LICENSE 这个是指定该内核模块的许可证,必须要有。其它看情况
3
4 //默认不输出调试信息 权限有限制
5 ***********内核模块参数**************
6 bool debug_on = 0; //布尔类型的模块参数,控制调试信息的输出,正常运行不需要,为0
7 module_param(debug_on, bool, S_IRWXU); //第三个是权限,用户拥有IRW三个权限。该宏定义在/linux/moduleparam.h
8
9
10 ******* 内核模块加载/卸载函数************
11 static int __init hello_init(void) //如果和内核源码中的函数重复则会编译失败报错,所以要static
12 {
13 if (debug)
14 printk("[ DEBUG ] debug info output\n"); //内核模块运行时无法调用C库的printf
15 printk("Hello World Module Init\n");
16 return 0; //返回值为0,初始化成功,在/sys/module 下新建一个以模块名为名的目录,
17 }
18 module_init(hello_init); //该宏告诉内核注册一个模块加载函数 hello_init,来进行模块初始化,具体见下
19
20
21 static void __exit hello_exit(void)
22 {
23 printk("Hello World Module Exit\n");
24 }
25 module_exit(hello_exit); //该宏告诉内核注册该模块的卸载函数。
26
27 *********内核模块许可证及其它信息********
28 MODULE_LICENSE("GPL"); //必须声明该模块使用遵循的许可证,这里我们设置为 GPL 协议。
29 MODULE_AUTHOR("embedfire");
30 MODULE_DESCRIPTION("hello world module");
31 MODULE_ALIAS("test_module"); //用于起别名
————————————————
版权声明:本文为CSDN博主「致丶简」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40662725/article/details/105884252
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
2020-05-08 Linux自定义服务文件编写
2019-05-08 五分钟带你搞懂子网掩码
2019-05-08 多网卡下如何配置指定IP走某个路由器(适用于外网不通,但是钉钉服务器通的情况)