1 分类;
主要分为三类:字符设备(character device)、块设备(block device)和网络接口(network interface)。
字符设备是能够像字节流(比如文件)一样被被访问的设备,就是说它的读写是以字节为单位的。块设备的数据是以块的形式存放,比如NANDflash上的数据是以页的单位存放的。对用户而言,字符设备和块设备的访问方式没有差别。
块设备的特别之处:
(1)操作硬件的接口实现方式不一样;
块设备驱动先将用户发来的数据组织成块,再写入设备,或从设备中读出若干快数据,再从中跳出用户需要的数据。
(2)数据块上的数据可以有一定的格式;
2 驱动的开发:
驱动编写的难点不是硬件的具体操作,而是弄清楚现有驱动程序的框架,在这个框架中加入这个硬件。
编写一个驱动的大致流程:
(1)查看原理图,熟悉硬件设备的操作方法;
(2)在内核中找到相近的驱动程序,以这个为模板;
(3)实现驱动的初始化:比如向内核注册这个驱动程序,这样应用程序传入文件名时,内核才能找到相应的驱动程序;
(4)设计所要实现的操作,比如open,close,read,write等函数;
(5)实现中断服务(中断并不是每个设备驱动所必须的);
(6)编译该驱动到内核中,或使用insmod加载;
(7)测试驱动程序。
3 常用的命令(与模块相关)
在配置内核时,如果将某个驱动的配置项设为m,则对应的驱动将会被编译为一个模块,扩展名为.ko,可以使用
insmod加载,rmmod卸载,lsmod查看内核已经加载了哪些模块(保存在文件/proc/modules中,所以也可以用cat /proc/modules)。
modinfo 可以查看与模块有关的信息;
modprobe挂载新模块以及新模块相依赖的模块modprobe我们常用的功能就是挂载模块,在挂载某个内核模块的同时,这个模块所依赖的模块也被同时挂载;这是于insmod挂载模块有区别的地方。当然modprobe也有列出内核所有模块,还有移除模块的功能;下在我们举个例子说一说咱们常用的功能和参数;
modprobe l 可以查看所有的模块,包括挂载的和没有挂载的。
mknod:创建特殊文件,只能由root用户或是系统组成员运行, mknod name {b|c} Major Minor
顺便说下:mount命令
用于挂载一个文件系统,也可以将windows的分区作为Linux的一个文件挂载到Linux的一个空文件夹下,从而将windows的分区和/mnt这个目录联系起来,
格式:mount [-参数] [设备名称] [挂载点]