LINUX 驱动入门(一)

linux驱动设备的分类及实现的基本方式

驱动的分类

按照数据交互方式的不同linux驱动可大致分为三类,他们分别是:字符设备驱动、块设备驱动以及网络设备驱动。

  • 字符设备驱动:顾名思义,应用程序与驱动程序之间的数据交互是以字符(字节)为单位的,字符设备通常没有中间缓存。常见的字符设备有:led、key、camera、显卡、串口等
  • 块设备驱动:顾名思义,应用程序与驱动程序之间的数据交互是以块为单位的,主要针对的是存储设备,通常设有中间缓存,并且带有文件系统,可以任意位置访问。常见的块设备有:U盘、eMMC、SD卡等
  • 网络设备驱动:网络设备面向数据包的发送而设计,它并不对应于文件系统的节点。即不对应 /dev 目录下的设备文件,应用程序最终通过套接字 socket 完成与网络设备的数据交互。常见的网络设备有网卡(无线网卡、有线网卡)。

驱动的大致实现方式

在了解实现方式前要首先对linux系统结构有大致了解如下图

一般用户通过应用软件(APP)调用C库函数此时会执行一个swi val指令从而触发出一个异常(类似中断),从而进入内核异常处理函数(从上图中的user space进入到了SAI(System call interface)正式进入到了系统内核),然后根据swi val 中的值调用VFS(虚拟文件系统)中不同的异常处理函数。最后VFS中的系统处理函数会根据触发时的传入参数找到对应的驱动,并调用驱动中的函数从而实现对硬件设备的控制。例如我们调用C库函数中open函数时SAI(系统调用接口)传入异常值为1从而调用VFS中的sys_open函数,sys_open()函数则会根据open传入的目标驱动的路径找到对应的驱动程序,并调用具体的驱动函数。

那么问题来了,再找到对应的驱动程序后系统处理函数是如何找到并调用具体的驱动函数的呢,这就依赖与我们的驱动程序框架。这里我会以一个简单的LED驱动为例,深度剖析系统是如何知道有这样一个驱动及有这个驱动函数可以被调用。具体请看本人的Linux驱动入门(二)LED驱动的实现。