应用程序与库函数、内核、驱动之间的关系
应用程序、库、内核、驱动程序的关系:应用程序调用应用程序函数库完成功能、应用程序以文件形式访问各种资源、应用程序函数库、部分函数直接完成功能、部分函数通过系统调用。
内核组成: 内核子系统 + 设备驱动程序
系统调用 -> 设备驱动程序 -> 硬件
系统调用 -> 内核子系统 -> 设备驱动程序 -> 硬件
由内核完成内核处理系统调用。
调用设备驱动程序,设备驱动直接与硬件通信。
它们之间的关系如下图所示
设备类型:
常见的设备有三类:字符设备、块设备、网络设备。
字符设备:对字符设备发出读/写请求时,实际的硬件I/O操作一般紧接着发生。
块设备:块设备与之相反,它利用系统内存作为缓冲区。
网络设备:网络设备是一类特殊的设备,它不像字符设备或块设备那样通过对应的设备文件节点访问,也不能直接通过read或write进行数据访问请求。
设备号
硬件设备以主设备号和从设备号区分。在设备管理中,除了设备类型外,内核还需要对被称为主从设备号的参数,才能唯一标识一个设备。主设备号相同的设备使用相同的驱动程序,从设备号用于区分具体设备的实例。在/dev目录下使用ll命令(ls -l)可以查看各个设备的设备类型、主从设备号等。cat /proc/devices可以查看系统中所有设备对应的主设备号。
设备文件
设备类型、主从设备号是内核与设备驱动程序通信时使用的,应用程序使用设备文件节点访问对应设备。Linux 2.4引入了设备文件系统(devfs)所有的设备文件作为一个可以挂载的文件系统,每个主从设备号确定的设备都对应一个文件节点。每个设备文件都有其文件属性(c代表字符设备或者b代表块设备),都有2个设备号:1、主设备号,用于标识驱动程序;2、从设备号:用于标识同一驱动程序的不同硬件。设备文件的主设备号必须与设备驱动程序在登记时申请的主设备号一致。需要注意的是,系统调用是内核与应用程序之间的接口,设备驱动程序是内核与硬件之间的接口。
驱动程序与应用程序的区别
1、应用程序以main开始,驱动程序没有main,它以一个模块初始化函数作为入口。
2、应用程序从头到尾执行一个任务,驱动程序完成初始化之后不再运行,等待系统调用。
3、应用程序可以使用GLIBC等标准C函数库,驱动程序不能使用标准C库。
用户态与内核态
系统运行时一般情况下,分用户态和内核态,这两种运行态下的数据互不可见的。驱动程序是内核的一部分,工作在内核态,应用程序工作在用户态。这样就存在数据空间访问的问题:无法通过指针直接将二者的数据地址进行传递。问题的解决办法是:系统提供一系列函数帮助完成数据空间转换:例如,get_user 、put_user 、copy_from_user 、copy_to_user
等函数。
Linux驱动程序功能
驱动程序的一般功能是:对设备初始化和释放、把数据从内核传送到硬件和从硬件读取数据、读取应用程序传送给设备文件的数据和回送应用程序请求的数据、检测和处理设备出现的错误等。