设备驱动程序概述是一类软件,它控制设备的运行,并提供一些可用的程序接口,以便其他程序可以与设备进行交互。 设备驱动程序不一定控制物理硬件外部设备,例如/dev/(用于生成随机数据)。 它们只是从内核获取数据然后将其发送到应用程序的一种手段。 它们通常可以被称为软件设备。 设备驱动程序概述 设备驱动程序将复杂的硬件抽象为结构良好的设备,并通过提供统一的程序接口为系统的其他部分提供使用该设备的能力。 设备驱动程序(应该)为系统的其他部分提供使用该设备的能力。 使用设备的各种能力以及使用设备的方法应由应用程序确定。 设备驱动概述对驱动程序有统一的接口,以文件的形式定义系统驱动程序:用户态和内核态以两种模式运行,一种是用户态,一种是内核态。 内核态具有较高的权限,可以控制处理器内存的映射和分配、访问外设空间和处理器状态寄存器、控制中断等。
应用程序和驱动程序之间通过诸如、等函数传输数据(指针)。设备驱动程序作为内核的一部分,直接编译到内核中,即静态编译。 设备驱动程序单独编译为模块(),并在需要时动态插入到内核中。 不需要的时候也可以从内核中删除,即动态链接。 设备分类通过 BSD 套接字访问驱动程序和应用程序之间的差异。 核心代码:设备驱动程序是核心的一部分。 与核心中的其他代码一样,错误会对系统造成严重损害。 设备驱动程序编写不当甚至会导致系统崩溃,导致文件系统损坏和数据丢失; 标准接口:设备驱动程序必须向核心或其从属子系统提供标准接口; 核心机制:设备驱动程序可以使用内存分配、中断发送、等待队列等标准核心服务; 可动态加载:大多数设备驱动程序可以在核心模块发出加载请求时加载,在设备不使用时卸载,从而使核心能够有效地优化利用系统资源; 可配置:设备驱动是核心的一部分小程序开发蓝牙打印,用户可以根据自己的需要进行配置,选择适合自己的驱动。
块设备驱动程序 字符设备驱动程序 网络设备驱动程序 当模块与内核链接时,会检查该模块与当前内核版本是否匹配。 每个模块定义一个版本符号。 每个内核版本都需要特定版本编译器的支持,高版本编译器不适合低版本内核。 主设备号和次设备号 主设备号:标识设备的类型,也标识设备使用的驱动程序。 同一个驱动程序可以管理多个设备,它们通过次设备号来区分。 次设备号仅由驱动程序内部使用。 系统内核直接将次设备号传递给驱动程序,由驱动程序管理。 ls /dev 命令可以列出系统的设备文件。 C 字符设备/B 块设备。 C 字符设备/B 块设备。 主要设备编号。 主要设备编号。 次要设备号。 次要设备号。 设备文件抽象了硬件的处理。 所有的硬件设备都可以像普通文件一样对待。 您可以使用与操作文件相同的标准系统调用接口来完成打开、关闭、读写以及I/O控制操作。
字符设备和块设备是通过文件节点访问的。 在文件系统中,可以找到(或用来创建)设备对应的文件名,称为设备文件。 设备文件 /dev/: 字符设备 b: 块设备 主设备号 次设备号 设备文件 crw-----,00:/设备文件系统 内核自行管理设备文件,完成设备的创建和删除文件节点。 (,)-/--/系统驱动通过宏定义来判断系统是否支持设备文件系统。 配置设备文件系统设备驱动接口 设备驱动接口通常指的是结构体{},其定义在 //fs.ns{*;(*read)(,*);(*)(,*); int(*)(*,t,);int(*open)(*,(*)(*,在执行写操作之前验证该地址是否可写。
在执行读操作之前验证该地址是否可读。 文件锁定用于共享文件时的互斥访问。 lock 实现内存和设备之间的异步通信。 实现内存和设备的同步,比如将内存数据写入硬盘。 关闭设备并释放资源。 清除内容一般只用于网络文件系统。 打开设备并对其进行初始化。 open 将设备内存映射到进程地址空间,通常仅用于块设备。 mmap控制设备,除读写操作外的其他控制命令。 仅用于文件系统,不适用于设备。 将数据写入字符设备。 从设备读取数据。 read 重新定位读取和写入位置。 所有者。 说明:成员名文件数据结构描述了该文件对应的目录项结构。 一般在驱动中使用filp--访问索引节点时使用。 Open 系统调用在调用驱动程序的 open 方法之前将此指针设置为 NULL。 驱动程序可以将此字段用于任何目的。 一般指向已分配的数据,但必须在内核销毁文件结构之前在方法中释放。 记忆。 文件操作的结构体指针。 内核在 OPEN 操作期间将 f_op 文件标志分配给该指针。 主要用于阻塞/非阻塞操作时检查当前读写位置。 类型是 64 位数字。 它只能读取但无法识别该文件。 读写权限 22 TM 22 Tony驱动代码结构 驱动注册与取消、设备打开与释放、设备读写操作、设备控制操作、设备中断与轮询处理。
最简单的字符驱动程序由以下5个函数和1个结构体组成。 int (void) {初始化硬件、注册设备、创建设备节点...} void (void) {删除设备节点、注销设备...} 23 TM 23 Tony int ( , file ( , file ( file *file, char , , 24TM 24 Tony设备初始化 int (void){ //硬件初始化//角色设备注册//创建设备文件(",!\n"); 设备注销 void (void) //删除设备文件//注销设备("Good-bye,\n"); 25TM 25 Tony(); //初始化系统录音设备的函数名 (); //退出系统录音设备的函数名 这两个函数、()和(),用来告诉内核在一个驱动程序加载和退出(或撤销)时需要执行的操作,除了向内核注册基本的设备驱动程序外,不同的驱动程序还有自己的设备特定加载和退出时的操作 26 TM 26 Tony 驱动代码 # /init.h # /.h int (void)