当前课程知识点:Linux 内核分析与应用 > 第9章 设备驱动 > 9.4 字符设备驱动程序简介 > Video
大家好 这一讲我们来讲字符设备驱动程序
首先我们来对字符设备驱动程序的基础知识做一个介绍
字符设备是指
只能一个字节一个字节进行读写操作的设备
不能随机读取设备中的某一个数据
读取数据要按照先后次序来进行
字符设备是面向流的设备
常见的字符设备有鼠标
键盘 串口 控制台
和LED等等 如图所示
一般每个字符设备或块设备呢
都会在/dev下对应一个设备文件
Linux用户层程序
通过设备文件来使用驱动程序
操作字符设备或者块设备
如何描述字符设备呢
Linux内核中使用struct
cdev来表示一个字符设备
其中最关键的是file_operations结构
它是实现字符设备的操作集
如图所示 给出了这个结构体的
主要字段以及对应的含义
那么cdev与file operations的
关系是什么样子的呢 这里我们给出一个图
每个字符设备都有一个描述
字符设备操作集的file_operations数据结构
它与cdev的关系如图所示
那么file_operations的原型到底是什么样子的呢
那么在这里我们给出file_operations数据结构
他所对应的相关字段
从中我们可以看出它其中的每个字段呢
都是一个函数 都是指向
我们在vfs层呢
所调用的系统
调用所对应的函数
那么字符设备驱动的框架是什么样子的呢 如图所示
在Linux内核的代码中呢
他是使用struct cdev结构体
抽象一个字符设备
那么通过一个dev_t类型的
设备号来确定字符设备的唯一性
通过struct file_operations类型的操作方法集呢
定义字符设备提供给
VFS的接口函数
那么到底如何来编写字符设备呢
在这里我们给出一个大体的框架图
如图编写字符设备需要三大步骤
首先先对驱动要进行初始化
其中我们要调用不同的函数接口
第二步实现设备的操作
那么最后呢是驱动的注销
那么其中的
调用的接口函数的功能如下表所示
第一个函数cdev_alloc(),它表示呢
动态申请(或者构造)cdev内存
那么第二个函数是初始化函数cdev_init()
初始化cdev的成员并建立起
cdev和file_operations之间的关联关系
第三个函数是注册cdev设备对象
也就是添加到字符设备列表中
第四个函数是cdev_del()
将cdev对象从系统中
删除也就是注销
那么最后呢
函数cdev_put()那 就是释放cdev内存
那么设备号来如何进行申请和释放呢
一个字符设备或块设备都有一个主设备号和次设备号
主设备号用来标识
与设备文件相连的驱动程序
用来反应设备的类型
而次设备号被驱动程序用来
辨别操作的到底是哪一个设备
用来区分同类型的设备
那么在这里给出三个宏
和三个函数 分别从设备号中
提取主设备号 次设备号
将主设备号呢
拼凑为一个设备号
和静态的申请设备号
动态的申请设备号以及释放设备号
那么下面我们来给出
字符设备表的结构在Linux呢
我们字符设备是用一个叫做字符设备结构的数据结构
char_device_struct来描述的
为了管理上的方便 系统维护了一个
这样的数组chrdevs[]数组
该数组的每一项呢
都代表一个字符设备
那么这个字符设备定义在
char-dev.c这个文件里头
那么具体的字段给出了代码的截图
我们说一个字符设备呢
如果要得到系统的认可呢
那么前面已经介绍了 它有专门的注册函数
那么注册以后是什么样的状况呢
char_device_struct结构中的域
cdev中的fops
那么他就是是指向文件的操作
函数集结构的指针
那么每个注册的驱动呢
在chrdevs表中都有对应的一项
那么这个表呢我们就叫做字符设备表
下面呢 我们看一下从系统调用
到驱动程序 他们是怎样的
关联如何起来的
那么当用户进程在调用write系统调用的时候呢
这个时候他就会陷入到内核
首先呢他会查找到系统调用表
找到write系统调用的服务例程总入口
那么如何找到你自己写的驱动程序
mydev_write()呢
当我们打开文件的时候呢
open()的第一个参数是设备文件名
文件描述符fd就用着
设备文件关联起来了
因此呢 通过主设备号呢
在字符设备表中呢就可以找到对应的
驱动程序的入口函数了
那么在驱动开发中呢
用户空间与内核空间的数据是
何进行传送的
内核提供专门的接口函数
比如说 当调用读函数的时候呢
也就可以通过内核提供的copy_to_user()函数了
把内核空间缓冲区中的数据呢
拷贝到用户空间的缓冲区
那么当你写
数据的时候呢 可以调用写函数
通过内核的copy_from_user()
把用户空间缓冲区中的数据呢
拷贝到内核空间的缓冲区
关于驱动程序的开发一定要动手实践
在这里头呢
我们就不给具体的代码了 网上有大量的相关代码
而且在动手实践环节呢
将给出一个字符设备驱动程序的
编写过程以及运行机制
下面我们给出参考文献《Linux驱动开发》
网上有大量的详细的
字符驱动开发资料 都是可以自行查阅
在这里我们给出一篇链接
那么 文中的大多数图片来自谷歌搜索 版权归原作者所有
最后呢们带着疑问上路
在原理上说明file_operations操作方法集
为什么定义了字符设备
提供给VFS的接口函数
谢谢大家
-1.1 Linux操作系统概述
-1.2 Linux内核结构以及内核模块编程
--Video
-1.3 Linux内核源码中的双链表结构
--Video
-1.4 源码分析-内核中的哈希表
--Video
-1.5 动手实践-Linux内核模块的插入和删除
--Video
-第1章 概述--章节测验
-2.1 内存管理之内存寻址
--Video
-2.2 段机制
--Video
-2.3分页机制
--Video
-2.4 动手实践-把虚拟地址转换成物理地址
--Video
-第2章 内存寻址--章节测验
-3.1 进程概述
--Video
-3.2 Linux进程创建
--Video
-3.3 Linux进程调度
--Video
-3.4 动手实践-打印进程描述符task_struct中的字段
--Video
-3.5工程实践-基于内核模块的负载监控
--Video
-第3章 进程管理--章节测验
-4.1 Linux内存管理机制
--Video
-4.2 进程用户空间管理机制
--Video
-4.3 物理内存分配与回收机制(上)
--Video
-4.4 物理内存分配与回收机制(下)
--Video
-4.5 动手实践-Linux内存映射基础(上)
--Video
-4.6 动手实践-Linux内存映射实现(中)
--Video
-4.7 动手实践-Linux内存映射测试(下)
--Video
-4.8 初学者对内存管理的常见疑惑
-第4章 内存管理--章节测验
-5.1 中断机制概述
--Video
-5.2 中断处理机制
--Video
-5.3 中断下半部处理机制
--Video
-5.4 时钟中断机制
--Video
-5.5 动手实践-中断上半部的代码分析及应用
--Video
-5.6 动手实践-中断下半部的代码分析及应用
--Video
-第5章 中断--章节测验
-6.1 Linux中的各种API
--Video
-6.2 系统调用机制
--Video
-6.3 动手实践-添加系统调用(系统调用日志收集系统)
--Video
-第6章 系统调用--章节测验
-7.1 内核同步概述
--Video
-7.2 内核同步机制
--Video
-7.3 动手实践-内核多任务并发实例(上)
--Video
-7.4 动手实践-内核多任务并发实例(下)
--Video
-第7章 内核同步--章节测验
-8.1 虚拟文件系统的引入
--Video
-8.2 虚拟文件系统的主要数据结构
--Video
-8.3 文件系统中的各种缓存
--Video
-8.4 页高速缓存机制以及读写
--Video
-8.5 动手实践-编写一个文件系统(上)
--Video
-8.6 动手实践-编写一个文件系统(中)
--Video
-8.7 动手实践-编写一个文件系统(下)
--Video
-第8章 文件系统--章节测验
-9.1 设备驱动概述
--Video
-9.2 I/O空间管理
--Video
-9.3 设备驱动模型
--Video
-9.4 字符设备驱动程序简介
--Video
-9.5 块设备驱动程序简介
--Video
-9.6 动手实践-编写字符设备驱动程序
--Video
-9.7工程实践-编写块设备驱动的基础(上)
--Video
-9.8 工程实践-块设备驱动程序分析(中)
--Video
-9.9 工程实践-块设备驱动程序实现(下)
--Video
-第9章 设备驱动--章节测验
-致谢与说明
--Video