一、设备驱动程序简介
系统调用是操作系统内核和应用程序之间的接口,
设备驱动程序是操作系统内核和机器硬件之间的接口。
设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件只是个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。
设备驱动与用户程序的区别:
1、应用程序以main 开始;驱动程序没有main,它以一个模块初始化函数作为入口。
2、应用程序从头到尾执行一个任务;驱动程序完成初始化之后不再运行,等待系统调用。
3、应用程序可以使用GLIBC 等标准C 函数库;驱动程序不能使用标准C库。
4、设备驱动提供什么能力,应用程序提供策略即如何使用这些能力。
设备驱动程序是内核的一部分,它主要完成4个功能:
1、对设备初始化和释放;
2、把数据从内核传送到硬件,从硬件读取数据;
3、读取应用程序传送给设备文件的数据和回送应用程序请求的数据;
4、检测和处理设备出现的错误。
用户态和内核态:
1、系统运行时一般情况下,分用户态和内核态,这两种运行态下的数据互不可见的。
2、驱动程序是内核的一部分,工作在内核态;应用程序工作在用户态。
3、这样就存在数据空间访问的问题: 无法通过指针直接将二者的数据地址进行传递。
系统提供一系列函数帮助完成数据空间转移如:
get_user 、put_user 、copy_from_user 、copy_to_user等函数
关系图:
(1)、硬件、驱动、操作系统和应用程序的关系:
(2)、设备驱动与软硬件系统
(3)、应用程序与库函数、内核、驱动
二、设备的分类和特点
1.字符设备
(1)、字符设备是面向数据流的设备,没有请求缓冲区,对设备的存取只能按顺序按字节的存取而不能随机访问。
(2)、Linux下的大多设备都是字符设备。应用程序是通过字符设备节点来访问字符设备的。通常至少需要实现 open, close, read, 和 write 等系统调用。
(3)、设备节点一般都由mknod命令都创建在/dev目录下,包含了设备的类型、主/次设备号以及设备的访问权限控制等,如:
crw-rw---- 1 root root 4, 64 Feb 18 23:34 /dev/ttyS0
(4)\常见的字符设备有鼠标、键盘、串口、控制台等。
当然,也有可以随机访问的字符设备,比如磁带驱动器,但访问随机数据所需要的时间很大程度上依赖于数据在设备内的位置。
2.块设备
(1)、存储设备一般属于块设备,块设备有****请求缓冲区,并且支持随机访问而不必按照顺序去存取数据,比如你可以先存取后面的数据,然后在存取前面的数据,这对字符设备来说是不可能的。
(2)、尽管在Linux下有块设备节点,但应用程序一般是通过文件系统及其高速缓存来访问块设备的,而不是直接通过设备节点来读写块设备上的数据。
(3)、每个块设备在/dev/目录下都有一个对应的设备文件,即设备节点,它们包含了设备的类型、主/次设备号以及设备的访问权限控制等 ,如
brw-rw---- 1 root root 3, 1 Jul 5 2000 /dev/hda1
(4)\块设备既可以作为普通的裸设备用来存放任意数据,也可以将块设备按某种文件系统类型的格式进行格式化,然后按照该文件系统类型的格式来读取块设备上的数据。
常见的块设备有各种硬盘、flash磁盘、RAM磁盘等。
3.网络设备
(1)、不同于字符设备和块设备,它是面向报文的而不是面向流的,它不支持随机访问,也没有请求缓冲区。
(2)、在Linux里一个网络设备也可以叫做一个网络接口,它没有像字符设备和块设备一样的设备号,只有一个唯一的名字如eth0、 eth1等,这个名字也不需要与设备文件节点对应,应用程序是通过Socket而不是设备节点来访问网络设备,在系统里根本就不存在网络设备节点。