博客内容包括:
驱动注册相关的命令;
驱动的Makefile分许;
驱动中宏的分析;
字符设备驱动的管理;
驱动的开发流程(重点)
驱动注册相关的命令:
lsmod:打印出当前内核中已经安装的模块列表;
insmod:向当前内核安装一个模块(内核会将最新安装的模块打印在最前面)
modinfo:modinfo+ xxx.ko功能是打印出一个内核模块的自带信息;
rmmod:从当前内核中卸载一个已经安装的模块;
mknod:创建字符设备文件 mknod /dev/xxx c 主设备号 次设备号
一个简单的驱动Makefile分析:
1 #ubuntu的内核源码树,如果要编译在ubuntu中安装的模块就打开这2个
2 KERN_VER = $(shell uname -r)
4 KERN_DIR = /home/liuyu/some_boards/x210/1_ok/kernel/x210_kernel_jiuding
5
6 # 开发板的linux内核的源码树目录
7 #KERN_DIR = /root/driver/kernel
8
9 obj-m += module_test.o
10
11 all:
12 make -C $(KERN_DIR) M=`pwd` modules
13
14
15 .PHONY: clean
16 clean:
17 make -C $(KERN_DIR) M=`pwd` modules clean
(1)KERN_DIR,变量的值就是我们用来编译这个模块的内核源码树的目录;
(2)obj-m += module_test.o,这一行就表示我们要将module_test.c文件编译成一个规定名字的模块;
(3)make -C $(KERN_DIR) M=`pwd` modules 这个命令用来实际编译模块,工作原理就是:利用make-C进入到我们指定的内核源码树目录下,然后在源码目录树下借用内核源码中定义的模块编译规则去编译这个模块,编译完成后把生成的文件还拷贝到当前目录下,完成编译。M=`pwd`用来在Make-C之前将当前的路径记录下来,以便在指定的内核源码树目录下编译完成后回到之前的目录;
(4)make clean 用来清除编译痕迹
总结:模块的makefile非常简单,本身并不能完成模块的编译,而是通过make-C进入到内核源码树下借用内核源码的体系来完成模块的编译链接的。这个Makefile本身是非常模式化的,3和4部分是永远不用动的,只有1和2需要动。1是内核源码树的目录,你必须根据自己的编译环境
驱动代码中常见的宏:
1.MODULE_LICENSE: 描述模块的许可证
2.MODULE_AUTHOE: 描述模块的作者
3.MODULE_DESCRIPTION: 模块的介绍信息
4.MODULE_ALIAS: 模块的别名信息
驱动的开发流程:
1.编写驱动程序,并进行编译得到xxx.ko文件(让硬件实现具体的规定的死任务,而将业务逻辑相关的放在应用程序中);
2.驱动的安装:lsmod查看当前已经安装的驱动,然后insmod安装驱动,使用cat /proc/devices检查安装是否正常,再使用完之后rmmod卸载驱动;
3.创建驱动的设备文件:
(1).设备文件:/dev下的文件,每一个文件代表一个硬件设备,是应用层与驱动层之间的锁链,应用层操作文件就相当于操作具体的硬件设备,驱动将自己封装成一个设备文件供应用使用;
(2).主次设备号:主设备号用来表示哪一类硬件设备,次设备号来表示具体哪一个硬件设备,而这个主设备号与驱动程序里面注册的主设备号一致;
(3).使用mknod创建设别文件:mknod + /dev/xxx c 主设备号 次设备号;注:c代表字符设备文件。
4.应用程序进行调用:使用驱动程序中定义的API函数(open、read、close等)对硬件设备进行操作。
几个相关文件夹的分析:
1./proc/device文件:
在使用insmod进行驱动的安装之后,此文件会记录已安装驱动的驱动名和其驱动的主设备号。
2./dev/ 目录:
此目录下是所有的驱动文件,应用程序在需要对那个硬件进行具体的操作时,使用open打开对应的驱动文件,然后得到文件描述符,进而进行操作
3./sys/class/文件:
文件内是各种已经类名的文件夹,属于那个类的设备就在那个类文件夹内存放,但文件夹内实际存放的是一个链接文件,链接至真正的设备相关信息存放的一个文件夹。
字符设备驱动的管理:
1.内核中使用数组用来存储注册的字符设备驱动(数组大小为255),在注册时默认是从后往前进行注册,先使用大的设备号;
2.使用register_chrdev()函数将我们要注册的驱动的信息(主要是)存储在数组中相应的位置;
3.内核中已经注册过的字符设备驱动(和块设备驱动)的查看:cat /proc/devices。
注:在根文件系统的制作时说过/proc文件是一个虚拟的文件夹,其中的文件都是系统根据内部的数据结构虚拟出来的一个文件夹,在这里得到解释,内核将设备虚拟成文件存放在这里。
End......