认识Linux设备驱动
- 驱动:让硬件动起来,是硬件和软件的桥梁。
- 裸机驱动:没有操作系统,简单中断控制,直接操作寄存器。
- 系统驱动: 有操作系统,编写驱动比较复杂,特别基于Linux的各种驱动框架需按规定编写,统一规则后,就可以提供统一的接口给应用程序调用。
驱动分类:字符设备,块设备,网络设备三大类。
- 字符设备:串行顺序访问的设备,鼠标
- 块设备:任意顺序访问的设备,硬盘
- 网络设备:面向数据包接收和发送的设备,网卡
LInux源码目录:
第一个驱动程序
知道编写、编译、加载、卸载基本操作
-
头文件(必须有)
- 必须包含 内核头文件<linux/module.h>和<linux/init.h> 驱动加载函数(必须有)
- 加载驱动自动执行 __init 驱动卸载函数(必须有)
-
卸载驱动自动执行 __exit
(__init和__exit会将函数存放到特殊的FILE段中,加载或卸载完自动释放空间,static关键字默认生命周期为全局)
开源许可声明(必须有)
-
Linux内核是开源的,遵循GPL协议
模块参数(可选)作者版本信息(可选)
#include <linux/module.h>
#include <linux/init.h>
static int __init helloworld_init(void){
printk("hello wrold init\n");
return 0;
}
static void __exit hellowrold_exit(void){
printk("hello wrold exit\n");
}
module_init(helloworld_init); //将初始化函数加载到内核表
module_exit(hellowrold_exit); //将销毁函数加载到内核表
MODULE_LICENSE("GPL"); //不加会报错污染
MODULE_AUTHOR("fashi");
MODULE_VERSION("V1.0");
__init是告知编译器将变量或函数放在一个特殊的区域(初始化代码段或初始化数据段),代码使用后的内存使用后会被释放。__exit只在模块卸载时才会调用。