现在的位置: 首页 > 综合 > 正文

linux 设备驱动

2013年06月09日 ⁄ 综合 ⁄ 共 9553字 ⁄ 字号 评论关闭

设备驱动最通俗的解释就是“驱使硬件设备行动“。操作系统是通过各种驱动程序来驾驭硬件设备的,它为用户屏蔽了各种各样的设备,驱动硬件是操作系统最基本的功能,并提供统一的操作方式。系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,
应用程序可以象操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能:

1
对设备初始化和释放。

2
把数据从内核传送到硬件和从硬件读取数据。

3
读取应用程序传送给设备文件的数据和回送应用程序请求的数据。

4 检测和处理设备出现的错误。

一.驱动设备分类

以 Linux 的方式看待设备可区分为 3 种基本设备类型字符设备、块设备、网络接口。

字符设备 

一个字符( char ) 设备是一种可以当作一个字节流来存取的设备( 如同一个文件 ); 一个字符驱动负责实现这种行为. 这样的驱动常常至少实现 open, close, read, 和 write 系统调用. 文本控制台( /dev/console )和串口( /dev/ttyS0 及其友 )是字符设备的例子, 因为它们很好地展现了流的抽象. 字符设备通过文件系统结点来存取, 例如 /dev/tty1 和 /dev/lp0. 在一个字符设备和一个普通文件之间唯一有关的不同就是,
你经常可以在普通文件中移来移去, 但是大部分字符设备仅仅是数据通道, 你只能顺序存取.然而, 存在看起来象数据区的字符设备, 你可以在里面移来移去. 例如, frame grabber 经常这样, 应用程序可以使用 mmap 或
者 lseek 存取整个要求的图像.

块设备 

如同字符设备, 块设备通过位于 /dev 目录的文件系统结点来存取. 一个块设备(例如一个磁盘)应该是可以驻有一个文件系统的. 在大部分的 Unix 系统, 一个块设备只能处理这样的 I/O 操作, 传送一个或多个长度经常是
512 字节( 或一个更大的 2 的幂的数 )的整块. Linux, 相反, 允
许应用程序读写一个块设备象一个字符设备一样 -- 它允许一次传送任意数目的字节. 结果就是, 块和字符设备的区别仅仅在内核在内部管理数据的方式上, 并且因此在内核/驱动的软件接口上不同. 如同一个字符设备, 每个块设备都通过一个文件系统结点被存取的,
它们之间的区别对用户是
透明的. 块驱动和字符驱动相比, 与内核的接口完全不同.  

网络接口

 

任何网络事务都通过一个接口来进行, 就是说, 一个能够与其他主机交换数据的设备. 通常, 一个接口是一个硬件设备, 但是它也可能是一个纯粹的软件设备, 比如环回接口. 一个网络接口负责发送和接收数据报文, 在内核网络子系统的驱动下, 不必知道单个事务是如何映射到实际的被发送的报文上的. 很多网络连接( 特别那些使用 TCP 的)是面向流的, 但是网络设备却常常设计成处理报文的发送和接收. 一个网络驱动对单个连接一无所知; 它只处理报文.

二.驱动设备设备号

 Linux设备驱动中,设备号设一个很重要的概念和变量。每个设备在 /dev目录下都有一个对应的文件(节点)。可以通过 cat /proc/devices
命令查看当前已经加载的设备驱动程序的主设备号。内核能够识别的所有设备都记录在原码树下的 documentation/devices.txt 文件中。在 /dev 目录下除了字符设备和块设备节点之外还通常还会存在:fifo管道、socket、软/硬连接、目录。这些东西没有主/次设备号。
$ ls -l /dev/rfd0 /dev/fd0
brw-r-----  9 root operator 2, 0 nov 12 13:32 /dev/fd0
crw-r-----  9 root operator 9, 0 nov 12 13:32 /dev/rfd0
   
可以看到原来显示文件大小的地方,现在改为显示两个用逗号分隔的数字。这是系统用来表示设备的两个重要的序号,第一个为主设备号(major number),用来表示设备使用的硬件驱动程序在系统中的序号;第二个为从设备号(minor number)。

$ ls -l /dev/rfd0 /dev/fd0

brw-r-----  9 root operator 2, 0 nov 12 13:32 /dev/fd0

crw-r-----  9 root operator 9, 0 nov 12 13:32 /dev/rfd0

    可以看到原来显示文件大小的地方,现在改为显示两个用逗号分隔的数字。这是系统用来表示设备的两个重要的序号,第一个为主设备号(major number),用来表示设备使用的硬件驱动程序在系统中的序号;第二个为从设备号(minor number)。

了解这些设备的最基本要求就是对 每个设备文件的含义了如指掌,下面就医列表的形式列出常见的设备文件以及相应的含义:

----------------------------------------------------------------------

主 设备号        设备类型

               次设备号=文件名          简要说明

----------------------------------------------------------------------

 0                未命名设备(例如:挂载的非设备)

                 0 = 未空设备号保留

 1 char        内存设备

                 1 = /dev/mem                  直接存取物理内存

                 2 = /dev/kmem               存取经过内核虚拟之后的内存

                 3 = /dev/null                   空设备。任何写入都将被直接丢弃,任何读取都将得到eof。

                 4 = /dev/port                   存取 i/o 端口

                 5 = /dev/zero                 零字节源,只能读取到无限多的零字节。

                 7 = /dev/full                    满设备。任何写入都将失败,并把errno设为enospc以表示没有剩余空间。

                 8 = /dev/random           随机数发生器。完全由用户的输入来产生随机数。 如果用户停止所有动作,则停止产生新的随机数。 
                                 
 

                 9 = /dev/urandom       更快,但是不够安全的随机数发生器。尽可能由用户的输入来产生随机数, 如果用户停止所有动作,则把已经产生的随机数做为种子来产生新的随机数。

                10 = /dev/aio                   异 步 i/o 通知接口

                11 = /dev/kmsg              任何对该文件的写入都将作为 printk 的输出

 1 block        ram disk

                 0 = /dev/ram0               第1个 ram disk (initrd只能使用ram0)

                 1 = /dev/ram1              第2个 ram disk

                   ...

               200 = /dev/ram200      第200个 ramdisk

 4 char        tty(终端)设备

                 0 = /dev/tty0               当前虚拟控制台

                 1 = /dev/tty1              第1个虚拟控制台

                   ...

                63 = /dev/tty63       第63个虚拟控制台

 4 block        如果根文件系统以是以只读方式挂载的,那么就不可能创建真正的设备节点,

               此时就使用该设备作为动态分配的主(major)设备的别名

                 0 = /dev/root

 5 char        其他 tty 设备

                 0 = /dev/tty              当前 tty 设备

                 1 = /dev/console       系统控制台

                 2 = /dev/ptmx               所有 pty master 的复用器

 7 char        虚拟控制台捕捉设备(这些设备既允许读也允许写)

                 0 = /dev/vcs               当前虚拟控制台(vc)的文本内容

                 1 = /dev/vcs1               tty1 的文本内容

                   ...

                63 = /dev/vcs63       tty63 的文本内容

               128 = /dev/vcsa              当前虚拟控制台(vc)的文本/属性内容

               129 = /dev/vcsa1       tty1 的文本/属性内容

                   ...

               191 = /dev/vcsa63      tty63 的文本/属性内容

代码:  7 block        回环设备(用一个普通的磁盘文件来模拟一个块设备)

               对回环设备的绑定由 mount(8) 或 losetup(8) 处理

                 0 = /dev/loop0      第1个回环设备

                 1 = /dev/loop1       第2个回环设备

                   ...

 8 block        scsi 磁盘(0-15)

                 0 = /dev/sda              第1个 scsi 磁盘(整个磁盘)

                16 = /dev/sdb              第2个 scsi 磁盘(整个磁盘)

                32 = /dev/sdc              第3个 scsi 磁盘(整个磁盘)

                   ...

               240 = /dev/sdp               第16个 scsi 磁盘(整个磁盘)

               分区表示方法如下(以第3个 scsi 磁盘为例)

                33 = /dev/sdc1              第1个分区

                34 = /dev/sdc2              第2个分区

                   ...

                47 = /dev/sdc15         第15个分区 对于linux/i386来说,分区1-4是主分区,5-15是逻辑分区。

 9 block        metadisk(raid)设备

                 0 = /dev/md0               第1组 metadisk

                 1 = /dev/md1               第2组 metadisk

                   ...

               metadisk 驱动用于将同一个文件系统分割到多个物理磁盘上。

10 char        非串口鼠标,各种杂项设备和特性

                 1 = /dev/psaux      ps/2鼠标

               131 = /dev/temperature       机器内部温度

               134 = /dev/apm_bios       apm(高级电源管理) bios

               135 = /dev/rtc              实时时钟(realtime clock)

               144 = /dev/nvram       非易失配置 ram

               162 = /dev/smbus       系统管理总线(system management bus)

               164 = /dev/ipmo              intel的智能平台管理(intelligent platform management)接口

               173 = /dev/ipmikcs       智能平台管理(intelligent platformmanagement)接口

               175 = /dev/agpgart      agp图形地址重映射表(graphics addressremapping table)

               182 = /dev/perfctr       性能监视计数器

               183 = /dev/hwrng      通用硬件随机数发生器

               184 = /dev/cpu/microcodecpu微代码更新接口

               186 = /dev/atomicps      进程状态数据的原子快照

               188 = /dev/smbusbios      smbus(系统管理总线) bios

               200 = /dev/net/tun      tap/tun 网络设备(tap/tun以软件的方式实现了网络设备)

                                      tap模拟了以太网帧(第二层),tun模拟了ip包(第三层)。

               202 = /dev/emd/ctl      增强型 metadisk raid (emd) 控制器

               220 = /dev/mptctl      message passing technology (mpt) control

               223 = /dev/input/uinput      用户层输入设备驱动支持

               227 = /dev/mcelog       x86_64 machine check exception driver

               228 = /dev/hpet              hpet driver

               229 = /dev/fuse               fuse(用户空间的虚拟文件系统)

               231 = /dev/snapshot      系统内存快照

               232 = /dev/kvm              基于内核的虚构机(基于amd svm和intel vt硬件虚拟技术)

11 block        scsi cd-rom 设备

                 0 = /dev/scd0              第1个 scsi cd-rom

                 1 = /dev/scd1              第2个 scsi cd-rom

                   ...

13 char        核心输入设备

                32 = /dev/input/mouse0               第1个鼠标

                33 = /dev/input/mouse1              第2个鼠标

                   ...

                62 = /dev/input/mouse30      第31个鼠标

                63 = /dev/input/mice               所有鼠标的统一

                64 = /dev/input/event0              第1个事件队列

                65 = /dev/input/event1               第2个事件队列

                   ...

                95 = /dev/input/event1               第32个事件队列

21 char        通用 scsi 设备(通常是scsi光驱)

                 0 = /dev/sg0               第1个通用 scsi 设备

                 1 = /dev/sg1              第2个通用 scsi 设备

                   ...

29 char        通用帧缓冲(frame buffer)设备

                 0 = /dev/fb0              第1个帧缓冲设备

                 1 = /dev/fb1               第2个帧缓冲设备

                   ...

                31 = /dev/fb31              第32个帧缓冲设备

30 char        ibcs-2 兼容设备

                 0 = /dev/socksys      套接字访问接口

                 1 = /dev/spx               svr3 本地 x 接口

                32 = /dev/inet/ip       网络访问接口

                33 = /dev/inet/icmp

                34 = /dev/inet/ggp

                35 = /dev/inet/ipip

                36 = /dev/inet/tcp

                37 = /dev/inet/egp

                38 = /dev/inet/pup

                39 = /dev/inet/udp

                40 = /dev/inet/idp

                41 = /dev/inet/rawip

               此外,ibcs-2 还需要下面的连接必须存在

               /dev/ip ->/dev/inet/ip

               /dev/icmp ->/dev/inet/icmp

               /dev/ggp -> /dev/inet/ggp

               /dev/ipip ->/dev/inet/ipip

               /dev/tcp ->/dev/inet/tcp

               /dev/egp ->/dev/inet/egp

               /dev/pup ->/dev/inet/pup

               /dev/udp ->/dev/inet/udp

               /dev/idp ->/dev/inet/idp

               /dev/rawip ->/dev/inet/rawip

               /dev/inet/arp ->/dev/inet/udp

               /dev/inet/rip ->/dev/inet/udp

               /dev/nfsd ->/dev/socksys

               /dev/x0r -> /dev/null

代码: 36 char        netlink 支持

                 0 = /dev/route       路由, 设备更新, kernel to user

                 3 =/dev/fwmonitor       firewall packet 复制

59 char        sf 防火墙模块

                 0 = /dev/firewall      与 sf 内核模块通信

65 block        scsi 磁盘(16-31)

                 0 = /dev/sdq               第17个 scsi 磁盘(整个磁盘)

                16 = /dev/sdr               第18个 scsi 磁盘(整个磁盘)

                32 = /dev/sds               第19个 scsi 磁盘(整个磁盘)

                   ...

               240 = /dev/sdaf               第32个 scsi 磁盘(整个磁盘)

66 block        scsi 磁盘(32-47)

                 0 = /dev/sdag              第33个 scsi 磁盘(整个磁盘)

                16 = /dev/sdah              第34个 scsi 磁盘(整个磁盘)

                32 = /dev/sdai              第35个 scsi 磁盘(整个磁盘)

                   ...

               240 = /dev/sdav               第48个 scsi 磁盘(整个磁盘)

89 char        i2c 总线接口

                 0 = /dev/i2c-0      第1个i2c 适配器

                 1 = /dev/i2c-1       第2个i2c 适配器

                   ...

98 block        用户模式下的虚拟块设备(分区处理方式与 scsi 磁盘相同)

                 0 = /dev/ubda               第1个用户模式块设备

                16 = /dev/udbb              第2个用户模式块设备

                   ...

103 block        审计(audit)设备

                 0 = /dev/audit      审计(audit)设备

128-135 char        unix98 pty master

               这些设备不应当存在设备节点,而应当通过 /dev/ptmx 接口访问。

136-143 char        unix98 pty slave

               这些设备节点是自动生成的(伴有适当的权限和模式),不能手动创建。

               方法是通过使用适当的 mount 选项(通常是:mode=0620,gid=)

               将 devpts 文件系统挂载到 /dev/pts 目录即可。

                 0 = /dev/pts/0       第1个unix98 pty slave

                 1 = /dev/pts/1       第2个unix98 pty slave

                   ...

代码:153 block        enhancedmetadisk raid (emd) 存储单元(分区处理方式与 scsi 磁盘相同)

                 0 = /dev/emd/0         第1个存储单元

                 1 = /dev/emd/0p1      第1个存储单元的第1个分区

                 2 = /dev/emd/0p2       第1个存储单元的第2个分区

                   ...

                15 = /dev/emd/0p15      第1个存储单元的第15个分区

                16 = /dev/emd/1       第2个存储单元

                32 = /dev/emd/2      第3个存储单元

                   ...

               240 = /dev/emd/15      第16个存储单元

180 char        usb 字符设备

                96 = /dev/usb/hiddev0      第1个usb人机界面设备(鼠标/键盘/游戏杆/手写版等人操作计算机的设备)

                   ...

               111 = /dev/usb/hiddev15       第16个usb人机界面设备

180 block        usb 块设备(u盘之类)

                 0 = /dev/uba               第1个usb 块设备

                 8 = /dev/ubb                第2个usb 块设备

                16 = /dev/ubc              第3个usb 块设备

                    ...

192 char        内核 profiling 接口

                 0 = /dev/profile          profiling 控制设备

                 1 = /dev/profile0      cpu 0 的 profiling 设备

                 2 = /dev/profile1       cpu 1 的 profiling 设备

                   ...

193 char        内核事件跟踪接口

                 0 = /dev/trace       跟踪控制设备

                 1 = /dev/trace0      cpu 0 的跟踪设备

                 2 = /dev/trace1       cpu 1 的跟踪设备

                   ...

195 char        nvidia 图形设备(比如显卡)

                 0 = /dev/nvidia0               第1个 nvidia 卡

                 1 = /dev/nvidia1              第2个 nvidia 卡

                   ...

               255 = /dev/nvidiactl               nvidia 卡控制设备

202 char        特定于cpu模式的寄存器(model-specific register,msr)

                 0 =/dev/cpu/0/msr                cpu 0 的 msrs

                 1 =/dev/cpu/1/msr               cpu 1 的 msrs

                   ...

203 char        cpu cpuid 信息

                 0 =/dev/cpu/0/cpuid                cpu 0 的 cpuid

                 1 =/dev/cpu/1/cpuid               cpu 1 的 cpuid

抱歉!评论已关闭.