什么是驱动?驱动,通俗来说就是“驱使硬件设备行动”。驱动是一种可以使计算机和设备通信的特殊程序(就是一种程序);可以说是相当于硬件的接口,操作系统通过这个接口,可以不需要过多地去了解底层已经而可以直接操作硬件工作。驱动是硬件和系统之间的桥梁。
Linux设备驱动和整个系统之间的关系如下图
在系统中,上层是应用程序,由c库提供支持,中间是操作系统,其中含有操作系统内核,最底层是硬件。在系统正常运行时,应用程序调用c库支持的函数接口,一层一层往下调用:通过系统调用接口使程序陷入内核态执行,调用到相对应的驱动程序,由相关的驱动程序去操作硬件实现具体功能。例如一个在应用程序中利用open()函数打开一个磁盘文件:open会调用内核中的sys_open,最后会调用驱动程序中file_operations结构体中的open对应函数去对磁盘进行操作,read、write也是一样,每一个系统函数都在底层驱动中有一个与之对应的函数,完成相对应的操作。通过这样的封装和层层对应调用,使得应用程序可以在不需要了解底层硬件的情况下也可以操作硬件。
Linux设备驱动主要分为三类:字符设备驱动,块设备驱动、网络设备驱动。
字符设备:是指那些必须以串行顺序依次今进行访问的设备。如:触摸屏、鼠标
块设备:可以用任意顺序进行访问,以块为单位进行操作。如:硬盘
网络设备:是完成用户数据包在网络媒介上发送和接收的设备。
字符设备和块设备在/dev目录下都有对应的文件,用户程序通过这个文件可以操作对应硬件,体现了linux下“一切都是文件”的思想。网络设备最终是使用套接字(socket)完成与网络设备的接口,跟前两种设备有些不一样。