当前课程知识点:Linux 内核分析与应用 >  第9章 设备驱动 >  9.1 设备驱动概述 >  Video

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

Video在线视频

Video

下一节:Video

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

Video课程教案、知识点、字幕

大家好

今天我们来开始讲

最后一章

设备驱动

首先我们对设备驱动程序

进行一个概要的介绍

为什么要引入设备驱动程序

计算机中三个

最基本的物质基础是

CPU 内存和输入输出(I/O)设备

与I/O设备相比

文件系统

是一种逻辑意义上的存在

它只不过使对设备的操作

更为方便 有效

更有组织 更接近人类的

思维方式

可以说 文件操作是对

设备操作的组织和抽象

而设备操作则是对

文件操作的最终实现

那么 如何才能使

没有感觉的硬件

变得有 灵性

从而控制设备像

操作普通文件一样的

方便有效

这就是本章要讨论的

设备驱动问题

设备驱动程序

它起什么样的作用呢

它其实就是隐藏设备的细节

那么什么是设备驱动程序

设备驱动程序在Linux内核中

扮演着特殊的角色

它们是一个个

独立的 黑盒子

使某个硬件响应一个

定义良好的内部编程接口

这些接口完全隐藏了

设备的工作细节

用户的操作通过一组

标准化的

调用执行

而这些调用独立于特定的

驱动程序的任务

将这些调用映射到

作用于实际硬件的

设备特有操作上

则是驱动程序的任务

在前面文件系统我们介绍了

一切皆为文件

所以设备也纳入到了文件系统体系下

Linux操作系统把设备

纳入文件系统的范畴来管理

每个设备都对应一个文件名

在内核中也就对应一个

索引节点

对文件操作的

所有系统调用大都适用于设备文件

从应用程序的角度看

设备文件逻辑上的空间是一个线性空间

也就是起始地址为0

每读取一个字节加1

从这个逻辑空间到

具体设备物理空间比如说

磁盘的磁道 扇区等等的映射呢

则是由内核完成

并被划分为文件操作

和设备驱动两个层次

如图所示

对于一个具体的设备而言

文件操作和设备驱动是一个事物的

不同层次

从这种观点出发

从概念上可以把一个系统

划分为应用 文件系统和设备驱动三个层次

如图所示对于不同的设备

其文件系统层的 厚度

有所不同

对于像磁盘这样结构性很强

并且内容需要进一步组织和抽象的设备来说

其文件系统就很 厚重

这是由磁盘设备的复杂性决定的

一方面是对磁盘物理空间的立体描述

如柱面 磁道 扇区

另一方面是从物理空间

到逻辑空间的抽象

如第一层抽象 即线性地址空间中的 块

以及在块之上又一层组织和抽象

即 磁盘文件

这样 在物理介质上的

第一层抽象使操作者不必关心

读/写的物理位置究竟在哪一个磁道 哪一个扇区

而第二层抽象则使

操作者不必关心

读/写的内容在哪一个逻辑 块 中

于是 我们把第一层抽象归为设备驱动

而把第二层抽象归为文件系统

另一方面 还有一些像字符终端这样的字符设备

其文件系统就比较 薄

其设备驱动层也比较简单

那么如何标识一个设备

与文件用唯一的索引

结点标识类似

一个物理设备也可以用唯一的索引节点标识

索引节点中记载着与

特定设备建立连接所需的信息

这种信息由三部分组成

包括设备的类型 主设备号和次设备号

其中设备类型和主设备号结合在一起

唯一地确定了设备的驱动程序及其接口

而次设备号则说明目标设备

是同类设备中的第几个

如图所示 通过索引节点

主设备号+次设备号来标识一个设备

Linux将设备分成三大类

一类是像磁盘那样以块或扇区为单位

成块进行输入/输出的设备

称为块设备

另一类像键盘那样以字符为单位

逐个字符进行输入/输出的设备

称为字符设备 还有一类是网络设备

那不同设备类型 它们到底有什么样的差异性呢

Linux网络设备驱动与字符设备和块设备有很大的不同

字符设备和块设备对应/dev下的一个设备文件

而网络设备不存在这样的设备文件

网络设备使用套接字socket访问

虽然也使用read write系统调用

但这些调用只作用于软件对象

块设备只响应来自内核的请求

而网络驱动程序异步接收

来自外部世界的数据包

并发送到内核

文件系统通常都建立在块设备上

也有很多文件系统放在内存 比如/proc文件系统

不需要驱动程序

如何建立设备文件

那么这里我们给出两种方式

一种是通过系统调用mknod

一种是通过命令mknod

如图所示

那么设备驱动程序在整个系统中处于什么样的位置

系统调用是内核和应用程序之间的接口

而驱动程序是内核和硬件之间的接口

也就是内核和硬件之间的桥梁

它为应用程序屏蔽了硬件的细节

这样在应用程序看来

硬件设备只是一个设备文件

应用程序可以像操作普通文件一样对

硬件设备进行操作

如图所示

驱动程序在子系统中

处于什么样的位置

Linux内核分为5大部分

进程管理 内存管理 文件系统管理 设备管理 网络管理

每一部分都有承上启下的作用

对上提供API接口

提供给应用开发工程师使用

对下通过驱动程序屏蔽不同的硬件构成

完成硬件的具体操作

如图所示

驱动程序在应用开发中处于什么样的位置

我们说应用程序调用一系列函数库

通过对文件的操作

完成一系列功能

应用程序以文件形式

访问各种硬件设备函数库

部分函数无需内核的支持

由库函数内部通过代码实现直接完成功能

部分函数涉及到硬件操作或内核的文件

由内核完成对应功能

我们称其为系统调用

内核处理系统调用 根据设备文件类型

主设备号 次设备号调用

设备驱动程序

设备驱动程序最后直接与硬件进行通信

最后我们来说一下

内核配置选项以及驱动程序的编译

我们要在内核中增加程序比如说驱动程序

并且使这个驱动程序能够编译进内核

那么基本分为两大部分

首先我们要告诉内核

请您下次编译的时候捎带上我

也就是说需要我们进行内核的相关配置

这就需要对相关Makefile和Kconfig文件进行修改

以便让内核知道将要对这个新的驱动程序进行编译

也就是编译内核

为了简化内核的编译

有如下这么几种机制

第一种是Makefile文件

它分布在 Linux 内核源代码

根目录及各层目录中

定义 Linux 内核的编译规则

第二个是Kconfig文件

它为用户提供一个层次化的配置选项集

第三个是.config文件

也就是配置文件

当用户配置完后

将配置信息保存在.config 文件

最后是配置工具 包括配置命令解释器

和配置用户界面

当执行menuconfig 命令时候呢

配置程序会依次从

目录由浅入深查找

每一个Kbuild文件

依照这个文件中的数据

生成一个配置菜单

Kbuild像是一个分布在

各个目录中的配置数据库一样

通过这个数据库可以生成配置菜单

在配置菜单中

根据需要配置完成后会在

主目录下生成一个.config文件

此文件保存了配置信息

然后执行make命令

会依赖生成的.config文件

以确定哪些功能将

编译入内核中

哪些功能不编译入内核中

然后递归地进入每一个目录中

寻找Makefile文件

编译相应的代码

以上对驱动程序相关的基础知识进行了概要介绍

下面介绍一下参考文献

Linux 驱动开发 Linux Device Driver

是最经典的参考书

网上有大量详尽的驱动开发资料

读者可自行查阅 推荐一篇文章链接

文中的很多图片,来自google搜索,版权归原作者所有

最后带着疑问上路

应用程序

以什么样的形式访问硬件设备

为什么要采取这种形式

谢谢大家

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笔记与讨论

也许你还感兴趣的课程:

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