Linux驱动程序开发 003- 设备与驱动的关系

序言
前面两章我们了解了Linux驱动程序的基本框架,也了解了如何编译Linux的驱动程序。接下来我们有必要介绍Linux系统的设备了,这样我们才能清楚的知道应用程序和设备驱动程序是如何的工作的,或者说应用程序是如何控制驱动程序的,进而知道应用程序是如何通过驱动程序操作设备的。

Linux设备分类
Linux下的设备通常分为三类,字符设备,块设备和网络设备。
  • 字符设备
一个字符设备是一种字节流设备,对设备的存取只能按顺序按字节的存取而不能随机访问,字符设备没有请求缓冲区,所有的访问请求都是按顺序执行的。Linux下的大多设备都是字符设备。应用程序是通过字符设备节点来访问字符设备的。设备节点一般都由mknod命令都创建在/dev目录下,下面的例子显示了串口设备的设备节点。字符设备文件的第一个标志是前面的“c”标志。
root#ls -l /dev/ttyS[0-3]
crw-rw----  1 root  root 4, 64 Feb 18 23:34 /dev/ttyS0
crw-r-----  1 root  root 4, 65 Nov 17 10:26 /dev/ttyS1
crw-rw----  1 root  root 4, 66 Jul  5  2000 /dev/ttyS2
crw-rw----  1 root  root 4, 67 Jul  5  2000 /dev/ttyS3
  • 块设备
存储设备一般属于块设备,块设备有请求缓冲区,并且支持随机访问而不必按照顺序去存取数据,比如你可以先存取后面的数据,然后在存取前面的数据,这对字符设备来说是不可能的。Linux下的磁盘设备都是块设备,尽管在Linux下有块设备节点,但应用程序一般是通过文件系统及其高速缓存来访问块设备的,而不是直接通过设备节点来读写块设备上的数据。
root# ls -l /dev/hda[1-3]
brw-rw----  1 root  root  3, 1 Jul  5  2000 /dev/hda1
brw-rw----  1 root  root  3, 2 Jul  5  2000 /dev/hda2
brw-rw----  1 root  root  3, 3 Jul  5  2000 /dev/hda3
  • 网络设备
网络设备不同于字符设备和块设备,它是面向报文的而不是面向流的,它不支持随机访问,也没有请求缓冲区。在Linux里一个网络设备也可以叫做一个网络接口,如eth0,应用程序是通过Socket而不是设备节点来访问网络设备,在系统里根本就不存在网络设备节点。

相对于这三类设备,Linux设备驱动程序也分为对应的三类:字符设备驱动程序、块设备驱动程序和网络设备驱动程序。

设备节点、设备驱动及设备的关联
当我们访问一个设备节点是,系统是如果知到使用哪个设备驱动及访问哪个设备的呢?这个是通过设备号来实现的。当我们创建一个设备节点时需要指定主设备号和次设备号。对于设备节点来说,名字不是重要的,设备号才是最重要的,它实际指定了对应的驱动程序和对应的设备。
  • 主设备号
驱动程序在初始化时,会注册它的驱动及对应主设备号到系统中,这样当应用程序访问设备节点时,系统就知道它所访问的驱动程序了。你可以通过/proc/devices文件来驱动系统设备的主设备号。
  • 次设备号
驱动程序遍历设备时,每发现一个它能驱动的设备,就创建一个设备对象,并为其分配一个次设备号以区分不同的设备。这样当应用程序访问设备节点时驱动程序就可以根据次设备号知道它说访问的设备了。

Linux中设备节点是通过“mknod”命令来创建的。一个设备节点其实就是一个文件,Linux中称为设备文件。有一点必要说明的是,在Linux中,所有的设备访问都是通过文件的方式,一般的数据文件程序普通文件,设备节点称为设备文件。在Linux内核中网络设备也是通过文件操作的,称为网络设备文件,在用户空间是通过socket接口来访问的。socket号就是网络设备文件描述符。

后记
这一章我们了解了Linux设备、设备节点与设备驱动的关系,也了解了应用程序是如何通过设备驱动程序访问设备的。下一章我们就可以给Hello World程序添加读写功能了,并且为它创建一个设备节点,这样我们就可以通过应用程序来操作Hello World驱动程序的内容了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章