[一] 、Linux驱动
1.软件驱动
驱动硬件,使硬件处于某种工作模式,提供控制硬件方法
2.驱动的地位
驱动是连接内核与设备的桥梁
[二]、设备分类
1.字符设备 --->>>字符设备驱动 --->>> 字符设备文件
2.网络设备 --->>>网络设备驱动
3.块设备 --->>>块设备驱动 --->>>块设备文件
[三]、字符设备驱动
1.驱动编写
2.驱动编译
3.驱动使用
[四)、模块编写
<linux/init.h>
<linux/ module .h>
三要素:
1.入口(加载)
module_init (入口函数名):
int __init XX_func(void)
{
}
2.出口(卸载)
module_exit (卸载函数名) ;
void __exit XXX_func (void)
3. GPL协议中明
MODULE_LICENSE ("GPL") ;
#include <linux/init.h>
#include <linux/ module. h>
int__init demo_ init(void)
{
printk("---%s---%s---%d---\n",__ FILE__,__func__, LINE__) ; //打印文件名、函数名、行数 printk(KERN_INFO "%d",a);打印级别可设置7种
return 0;
}
void__exit demo_ exit(void)
printk("---%s---%s---%d---\n",__ FILE__,__func__, LINE__ ) ;
}
module init(demo_ init);
module exit(demo_ exit);
MODULE LICENSE("GPL");|
编译内核模块
编译器:gcc 交叉编译工具
预处理、汇编、链接
编写编译内核模块的Makefile
内部编译:将内核模块源文件放在内核源码申进行编译, 修改Kconfig,Makefile ,配置make menuconfig
静态编译:将内核模块编译进uImage中
外部编译:将内核模块源文件放在内核源码外进行编译
动态编译:编译生成动态模块xxx. ko
kernel-3.4.39 /Documentat ion/ kbui ld/modules . txt
KERNDIR:= /1ib/modu1es/3.2. 0-29-generic-pae/build/
PWD:=$ (shell pwd)
obj-m: =demo .o
all:
make -C $ (KERNDIR) M=$ (PWD) modules
clean:
make -C $ (KERNDIR) M=$ (PWD) clean
模块的使用:
查看内核模块信息的命令:
Modinfo demo.ko
$ modinfo demo.ko
filename :demo. ko
license :GPL
srcversion:CF9 6C788C51 FEFA1CF2C9CD
depends :
ve rmagic:3.2.0-29-generic-pae SMP mod unload modversions 686
作者:
描述:
查看当前内核中已经插入的动态模块
lsmod
查看内核的日志信息命令
dmesg
选项:
-c: 清除内核日志信息
将内核模块加载到内核中,和内核形成一个整体,运行。
insmod xxxx.ko --->>>加载函数会被调用
将内核中的内核模块,从内核中卸载出来。
rmmod xxx --->>>卸载函数会被调用
内核模块加载的时候执行加载函数,并只会执行1次。
内核模块卸载的时候执行卸载函数,并只会执行1次。