Linux设备驱动(一)-驱动基础概述

Linux系统的设备分为三种基本类型:字符设备(char device),块设备(block device)和网络设备(network device)三种。

  • 字符设备指存取时没有缓存必须以串行顺序依次进行访问的设备。
  • 块设备指以块为单位进行操作,读写操作都有缓存来支持,并且可以任意顺序进行访问的设备。
  • 网络设备在Linux里做专门的处理,主要对数据包的接收和发送而设计的。Linux的网络系统主要是基于BSD unix的socket机制。在系统和驱动程序之间定义有专门的数据结构(sk_buff)进行数据的传递。系统里支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多协议的支持。但内核与网络设备的通信方式和内核与字符设备、块设备之间的通信方式完全不同。

设备文件一般都在/dev/下面,用ll(ls -l)命令可以查看到相应的文件属性,Linux-2.6的内核已经使用了udev的设备文件系统用来代替devfs。

udev完全工作在用户态,利用设备加入或者移除时内核所发送的热插拔时间来工作。在热插拔时,设备的详细信息会由内核输出到位于/sys的sysfs文件系统。(摘选Linux设备驱动开发详解)

所有在/dev目录下的设备文件都是真实存在的设备(包括可以使用的虚拟设备),这是由于udev要求在成功加载驱动模块的时候就因建立对象的设备文件,这与devfs不同,devfs可以在被使用的时候创建,反之,udev在模块卸载的时候就应该删除对应的设备文件。详细的可以查看udev的主页(http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html)

Linux的驱动设备文件有设备号这个概念,由主设备号和次设备号构成。主设备号主要是区别不同类型设备,而次设备号是用来却别同类型设备中的不同设备。内核用dev_t类型来定义设备号。在2.6的内核里dev_t类型由32位构成。其中主设备号占有12位,次设备号占有20位。关于公共定义的设备号可以查看Linux内核目录中的”Documentation\devices.txt”文件,里面定义了一些参考。

下面几个函数用于设备号的使用:

1
2
3
MKDEV(int major, int minor);// 获取设备号
MAJOR(dev_t dev);//获取主设备号
MINOR(dev_t dev);//获取次设备号

使用例子1:

1
2
3
4
5
dev_t dev_no;//设备号
int major_no,minor_no;//major_no为主设备号变量,minor_no为次设备号变量
dev_no=MKDEV(180,96);
major_no=MAJOR(dev_no);//获取设备号中的主设备号
monir_no=MONIR(dev_no);//获取设备号中的次设备号

手工创建设备文件

View Code SHELL
1
2
3
4
5
mknod filename type major minor
filename:设备文件名
type:设备文件类型(c:字符设备文件,b:块设备文件)
major:主设备号
minor:次设备号

使用例子2:

View Code SHELL
1
mknod leds c 180 96

发表评论

电子邮件地址不会被公开。 必填项已用*标注