当前课程知识点:Linux 内核分析与应用 > 第9章 设备驱动 > 9.1 设备驱动概述 > 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搜索,版权归原作者所有
最后带着疑问上路
应用程序
以什么样的形式访问硬件设备
为什么要采取这种形式
谢谢大家
-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