微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式Linux设备驱动开发之:设备驱动概述

嵌入式Linux设备驱动开发之:设备驱动概述

时间:08-13 来源:3721RD 点击:

来创建,其中指定了主设备号和次设备号。主设备号表明设备的类型(例如串口设备、SCSI硬盘),与一个确定的驱动程序对应;次设备号通常是用于标明不同的属性,例如不同的使用方法、不同的位置、不同的操作等,它标志着某个具体的物理设备。高字节为主设备号,底字节为次设备号。

例如,在系统中的块设备IDE硬盘的主设备号是3,而多个IDE硬盘及其各个分区分别赋予次设备号1、2、3…

$ ls –l /dev

crw-rw---- 1 root uucp 4, 64 08-30 22:58 ttyS0 /* 主设备号4,此设备号64 */

11.1.4 驱动层次结构

Linux下的设备驱动程序是内核的一部分,运行在内核模式下,也就是说设备驱动程序为内核提供了一个I/O接口,用户使用这个接口实现对设备的操作。图11.1显示了典型的Linux输入/输出系统中各层次结构和功能。

图11.1 Linux输入/输出系统

层次结构和功能

Linux设备驱动程序包含中断处理程序和设备服务子程序两部分。

设备服务子程序包含了所有与设备操作相关的处理代码。它从面向用户进程的设备文件系统中接受用户命令,并对设备控制器执行操作。这样,设备驱动程序屏蔽了设备的特殊性,使用户可以像对待文件一样操作设备。

设备控制器获得系统服务有两种方式:查询和中断。因为Linux的设备驱动程序是内核的一部分,在设备查询期间系统不能运行其他代码,查询方式的工作效率比较低,所以只有少数设备如软盘驱动程序采取这种方式,大多设备以中断方式向设备驱动程序发出输入/输出请求。

11.1.5 设备驱动程序与外界的接口

每种类型的驱动程序,不管是字符设备还是块设备都为内核提供相同的调用接口,因此内核能以相同的方式处理不同的设备。Linux为每种不同类型的设备驱动程序维护相应的数据结构,以便定义统一的接口并实现驱动程序的可装载性和动态性。Linux设备驱动程序与外界的接口可以分为如下3个部分。

n 驱动程序与操作系统内核的接口:这是通过数据结构file_operations(在本书后面会有详细介绍)来完成的。

n 驱动程序与系统引导的接口:这部分利用驱动程序对设备进行初始化。

n 驱动程序与设备的接口:这部分描述了驱动程序如何与设备进行交互,这与具体设备密切相关。

它们之间的相互关系如图11.2所示。

图11.2 设备驱动程序与外界的接口

11.1.6 设备驱动程序的特点

综上所述,Linux中的设备驱动程序有如下特点。

(1)内核代码:设备驱动程序是内核的一部分,如果驱动程序出错,则可能导致系统崩溃。

(2)内核接口:设备驱动程序必须为内核或者其子系统提供一个标准接口。比如,一个终端驱动程序必须为内核提供一个文件I/O接口;一个SCSI设备驱动程序应该为SCSI子系统提供一个SCSI设备接口,同时SCSI子系统也必须为内核提供文件的I/O接口及缓冲区。

(3)内核机制和服务:设备驱动程序使用一些标准的内核服务,如内存分配等。

(4)可装载:大多数的Linux操作系统设备驱动程序都可以在需要时装载进内核,在不需要时从内核中卸载。

(5)可设置:Linux操作系统设备驱动程序可以集成为内核的一部分,并可以根据需要把其中的某一部分集成到内核中,这只需要在系统编译时进行相应的设置即可。

(6)动态性:在系统启动且各个设备驱动程序初始化后,驱动程序将维护其控制的设备。如果该设备驱动程序控制的设备不存在也不影响系统的运行,那么此时的设备驱动程序只是多占用了一点系统内存罢了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top