什么是驱动?
以下百度百科中对驱动解释。
驱动(计算机软件术语)
驱动程序全称设备驱动程序,是添加到操作系统中的特殊程序,其中包含有关硬件设备的信息。此信息能够使计算机与相应的设备进行通信。驱动程序是硬件厂商根据操作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。
可以看到,驱动相对于一般的软件而言最大的区别是,它是直接与硬件设备进行通讯的。
Linux驱动的分类
Linux中,将设备分为三种基本的类型。
- 字符设备
- 块设备
- 网络接口
Linux中还有一个很重要的概念,模块。
可在运行时添加到内核中的代码被称为模块。
一般来说一个设备驱动总是被写成一个模块。
一个简单的模块
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL")
static int hello_init(void) {
printk(KERN_ALERT "Hello world");
}
static void hello_exit(void) {
printk(KERN_ALERT "Bye");
}
module_init(hello_init);
module_exit(hello_exit);
这里看到两个特殊的宏module_init和module_exit,这两个宏指明了模块被装载和卸载时所执行的函数。
printk函数定义在Linux内核中,和c标准库中的printf类似,最大的区别是它缺乏对于浮点的支持,因为内核代码不能实现浮点数运算。
模块的编译
对于上面的代码来说。在makefile文件中添加下面一行就足够了。
obj-m := hello.o
假设有两个源文件则可以写成如下形式。
obj-m := module.o
module-objs := file1.o file2.o
最后使用make命令编译即可
模块的装载和卸载
装载:insmod、modprobe
这里看到,装载时有两个方法可选,区别在于,modprobe会根据depmod所产生的相依关系,决定要载入哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块。
modprobe是处理层叠模块的一个实用工具。
卸载:rmmod
显示已载入系统的模块:lsmod