嵌入式Linux设备驱动的分类

Linux内核对设备进行分类管理,共有三类:字符设备(Character Device)、块设备(Block Device)和网络设备(Network Device也称网络接口(Network Interface))。每类设备驱动程序都向内核提供通用接口,内核使用这些通用接口与设备进行通信。

  • 字符设备:字符设备只能顺序存储或者传输不定长数据。一些字符设备不使用缓存技术并以字节为单位处理数据。另一些在内部缓冲数据,一次可以传输多字节数据。Linux内核把字符设备看成是可顺序访问的字节流。常见的字符设备有串口、键盘、触摸屏等。
  • 块设备:按可寻址的块为单位(大小从512B到32KB)进行数据处理的设备。块设备使用缓冲技术并允许随机访问。常见的块设备有硬盘、光盘驱动器等。
  • 网络设备:网络设备是通过套接口访问的设备,它负责数据包的发送和接收。网络设备不对应任何设备文件,内核设备按照UNIX标准给网络设备分配一个名字(如eth0)。

Linux设备驱动程序也分为三类

前面提到,Linux内核把设备分为三类,相应地,设备驱动程序也分为三类,分别是字符设备驱动程序、块设备驱动程序和网络设备驱动程序。

字符设备是以字节为单位逐个进行I/O操作的设备,在对字符设备发出读写请求时,实际的硬件I/O紧接着就发生了,一般来说字符设备中的缓存是可有可无的,而且也不支持随机访问。

块设备主要是针对磁盘等慢速设备设计的,其目的是避免耗费过多的CPU时间来等待操作的完成。它利用一块系统内存作为缓冲区,当用户进程对设备进行读写请求时,驱动程序先查看缓冲区中的内容,如果缓冲区中的数据能满足用户的要求就返回相应的数据,否则调用相应的请求函数来进行实际的I/O操作。网络设备是一个能够和其他主机交换数据的设备,它通常是个物理设备,但也可能是个软件设备,如回环(Loopback)设备。

网络设备驱动程序负责驱动设备发送和接收数据包。除设备类型外,内核还使用了一个主设备号和一个次设备号来唯一标识设备,主设备号标识了设备对应的驱动程序,而次设备号仅由驱动程序解释,一般用于识别在若干可能的硬件设备中,I/O请求所涉及的那个设备。

Linux操作系统基础知识

Linux操作系统分为用户态和内核态,驱动程序作为应用软件访问硬件的接口部件,具有连接用户态和内核态的功能,并能利用Linux提供的通信技术帮助应用程序和内核代码进行通信。在Linux操作系统中,最常见的用户态访问内核态的方式是系统调用,Linux操作系统向应用程序提供了一系列的函数接口用于内核态访问。

在Linux的世界里,所有东西都被看作文件,当然这也包括设备。Linux通过HAL的抽象把所有的硬件设备都看作文件,对硬件设备的操作也被抽象成对文件的读写,每个设备都被抽象成一个设备文件。Linux支持多种文件系统,设备文件系统(devfs)是专门处理设备文件而产生的,Linux为了给用户统一的文件接口,又对文件系统进行抽象,把所有的文件操作抽象出来,形成虚拟文件系统(Virtual File System,VFS),虚拟文件系统给用户提供了统一的文件操作接口。

在Linux操作系统中,添加内核代码有两种方式,一种是把代码直接编译到内核中,这样每次启动内核,这部分代码都会被加载到内存中;另一种方法是以模块的方式动态地加载到内核中:把代码编译成模块的形式,在需要的时候才加载到内核中,在不需要的时候卸载出来,这样的设计能够保证内核代码旳纯洁性,由于模块可以单独编译,这就使得内核可以快速进行编译,此外,由于可以在不重新启动内核的情况下把一个模块加载、卸载多次,因此对模块进行调试也比对内核进行调试效率要高得多。

本文节选自《嵌入式Linux驱动开发实践》,获出版社和作者授权共享。

嵌入式Linux设备驱动的分类_第1张图片

你可能感兴趣的:(linux,运维,服务器)