文档介绍:Linux设备驱动程序开发基础
课程目标
Linux设备驱动程序开发简介
Linux设备驱动程序结构
Linux设备驱动程序加载方式
实验:编写一个字符设备驱动程序(LED或蜂鸣器) 用静态编译/模块动态加载方法实现加入内核
设备驱动程序
应
用
程
序
驱
动
程
序
设
备
write
read
ioctl
ioctl
设备驱动程序特点
⑴核心代码:设备驱动程序是核心的一部分。一个编写不当的设备驱动程序甚至能够使系统崩溃导致文件系统的破坏和数据的丢失;
⑵标准接口:设备驱动程序必须为Linux核心或者子系统提供一个标准的接口;
⑶核心机制:设备驱动程序可以使用标准的核心服务比如内存分配、中断发送和等待对列等;
⑷动态可加载:多数的Linux设备驱动程序可以在核心模块发出加载请求时进行加载,可以有效地利用系统的资源
⑸可配置:可根据自己的需要进行配置来选择适合自己的驱动
用户态与内核态
Linux在两种模式,用户态;内核态。
内核态有较高的权限,可以控制处理器内存的映射和分配方式,访问外设空间和处理器状态寄存器,控制中断等。
用户态只能运行系统上的应用程序。
驱动程序作为系统内核的一部分,工作在内核态。
通过get_user put_user copy_from_user copy_to_user等函数实现应用程序和驱动程序之间传送数据(指针)。
Linux设备的分类
字符设备
以字节为单位逐个进行I/O操作字符设备中的缓存是可有可无
不支持随机访问
如串口设备
块设备
块设备的存取是通过buffer、cache来进行
可以进行随机访问
例如IDE硬盘设备
可以支持可安装文件系统
网络设备
通过BSD套接口访问
设备文件
Linux抽象了对硬件的处理,所有的硬件设备都可以作为普通文件一样来看待
可以使用和操作文件相同的、标准的系统调用接口来完成打开、关闭、读写和I/O控制操作
对用户来说,设备文件与普通文件并无区别
字符设备和块设备是通过文件节点访问的。在Linux的文件系统中,可以找到(或者使用mknod创建)设备对应的文件名,称这种文件为设备文件。
设备文件
命令 ls –l /dev 可列出系统的设备文件
主设备号和次设备号
主设备号:标识该设备的种类,也标识了该设备所使用的驱动程序
主设备号的范围只能是1-255
Linux内核支持动态分配主设备号
次设备号:标识使用同一设备驱动程序的不同硬件设备􀁺
同一个驱动程序可以管理多个设备,它们依靠次设备号来区别。次设备号只在驱动程序内部使用,系统内核直接把次设备号传递给驱动程序,由驱动程序去管理。
设备文件系统
Linux内核自己管理设备文件,完成设备文件节点的创建、删除。(devfs,device file system)
,设备文件系统可在配置内核时定制。
File systems ->/dev file system support
File systems ->Pseudo file system ->/dev file system support
系统驱动程序通过CONFIG_DEVFS_FS宏定义判断系统是否有对设备文件系统的支持。