当前课程知识点:Linux 内核分析与应用 >  第9章 设备驱动 >  9.4 字符设备驱动程序简介 >  Video

返回《Linux 内核分析与应用》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《Linux 内核分析与应用》慕课在线视频列表

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的接口函数

谢谢大家

Linux 内核分析与应用课程列表:

第1章 概述

-1.1 Linux操作系统概述

--1.1 Linux 操作系统概述

-1.2 Linux内核结构以及内核模块编程

--Video

-1.3 Linux内核源码中的双链表结构

--Video

-1.4 源码分析-内核中的哈希表

--Video

-1.5 动手实践-Linux内核模块的插入和删除

--Video

-第1章 概述--章节测验

-第1章导学--引领你进入Linux内核的大门

第2章 内存寻址

-2.1 内存管理之内存寻址

--Video

-2.2 段机制

--Video

-2.3分页机制

--Video

-2.4 动手实践-把虚拟地址转换成物理地址

--Video

-第2章 内存寻址--章节测验

-第二章导学-从零打造自己的操作系统

第3章 进程管理

-3.1 进程概述

--Video

-3.2 Linux进程创建

--Video

-3.3 Linux进程调度

--Video

-3.4 动手实践-打印进程描述符task_struct中的字段

--Video

-3.5工程实践-基于内核模块的负载监控

--Video

-第3章 进程管理--章节测验

-第三章导学-进程背后琳琅满目的宝贝到哪里挖?

第4章 内存管理

-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章 中断

-5.1 中断机制概述

--Video

-5.2 中断处理机制

--Video

-5.3 中断下半部处理机制

--Video

-5.4 时钟中断机制

--Video

-5.5 动手实践-中断上半部的代码分析及应用

--Video

-5.6 动手实践-中断下半部的代码分析及应用

--Video

-第5章 中断--章节测验

第6章 系统调用

-6.1 Linux中的各种API

--Video

-6.2 系统调用机制

--Video

-6.3 动手实践-添加系统调用(系统调用日志收集系统)

--Video

-第6章 系统调用--章节测验

第7章 内核同步

-7.1 内核同步概述

--Video

-7.2 内核同步机制

--Video

-7.3 动手实践-内核多任务并发实例(上)

--Video

-7.4 动手实践-内核多任务并发实例(下)

--Video

-第7章 内核同步--章节测验

第8章 文件系统

-8.1 虚拟文件系统的引入

--Video

-8.2 虚拟文件系统的主要数据结构

--Video

-8.3 文件系统中的各种缓存

--Video

-8.4 页高速缓存机制以及读写

--Video

-8.5 动手实践-编写一个文件系统(上)

--Video

-8.6 动手实践-编写一个文件系统(中)

--Video

-8.7 动手实践-编写一个文件系统(下)

--Video

-第8章 文件系统--章节测验

第9章 设备驱动

-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

直播视频:从Linux内核学习到自主操作系统研发

-从Linux内核学习到自主操作系统研发

附录:实验代码、课件以及相关素材

-各章实验代码

-《Linux内核分析与应用》课件

-《Linux操作系统原理与应用》教材课堂视频

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。