【linux内核分析与应用-陈莉君】设备驱动概述

目录

 

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

2.设备驱动程序的作用-隐藏细节

3.设备纳入文件管理体系下

4.如何标识设备

5.设备的分类

6.如何建立设备文件

7.设备驱动程序的位置

8.内核配置选项及驱动程序编译

9.参考资料与思考问题


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

计算机中三个最基础的物质基础是:
CPU
内存
输入输出设备.

与I/O设备相比,文件系统是一种逻辑意义上的存在,它只不过使得对设备的操作更方便,更有组织,更接近人类的
思维方式,可以说文件操作是对设备操作地组织与抽象,而设备操作是对文件操作的最终实现.

如何让机器般冰冷的硬件设备拥有灵性,从而使得控制设备像操作文件一样方便有效,这个是本章需要讨论的设备驱动问题.

2.设备驱动程序的作用-隐藏细节

设备驱动程序有什么作用呢?
它其实就是隐藏设备的细节.
什么是设备驱动程序?
设备驱动程序在linux内核中扮演着特殊的角色,它们是一个个独立的黑盒子,使每一个硬件享用一个
定义良好的内部编程接口,这些接口完全隐藏了设备的工作细节,用户的操作通过一组标准化的调用
执行.这些调用独立于特定的驱动程序的任务,将这些调用映射到作用于实际硬件的设备特有操作上,
就是驱动程序的任务.

3.设备纳入文件管理体系下

linux操作系统把设备纳入文件系统的范畴来管理,每一个设备都对应着一个文件名,在
内核中也就对应一个索引节点.对文件操作的所有系统调用,大都适合于设备文件,从应用
程序的角度来看,设备文件逻辑上的空间是一个线性空间,也就是起始地址为0,每读取一个
字节加一,从这个逻辑空间到具体设备物理空间,比如说磁盘的磁道,扇区等的映射则是
由内核完成,并被划分成文件操作和设备驱动两个层次.



对于一个具体的操作而言,文件操作和设备驱动是一个事务的不同层次,从这种观点出发,
从概念上可以把一个系统分为应用层,文件系统层和设备驱动层这三个层次.如图所示,对
于不同的设备,其文件系统层的厚度有所不同:

对于像磁盘这样的结构性很强并且内容需要进一步组织和抽象的设备来说,其文件系统就
很厚重,这个是由磁盘系统的复杂性所决定的,一方面是对磁盘物理空间的立体描述,如
柱面,磁道,扇区等,另一方面是物理空间到逻辑空间的一个抽象,如第一次抽象,即线性
地址空间中的块以及在块之上又一次组织或抽象即磁盘文件,这样在物理介质上的第一层
抽象使得操作者不必关心读写的物理位置究竟在哪一个磁道和哪一个扇区.
所以我们把第一层抽象归为设备驱动,而把第二层抽象归为文件系统.

另一方面还有一些像字符帧段这样的字符设备其文件系统就比较薄,其设备驱动成也比较
简单.

4.如何标识设备

与文件用唯一的索引节点标识类似,一个物理设备也可以用唯一的索引节点来标识,索引节点中
记录着与特定设备建立连接所需要的信息,这种信息由三部分组成,包括:
设备的类型,
主设备号,
次设备号.
其中设备的类型和主设备号两者唯一确定了设备驱动程序及其接口,而次设备号则说明目标设备是同类设备中的
第几个,如图所示,通过索引节点 主设备号+次设备号来标识一个设备.(感觉这里说的有点乱啊~~回头再看下)

我认为是一个设备类型+主设备号+次设备号标识了一个设备,
老师这里写的索引节点 主设备号+次设备号来标识一个设备是什么意思?
索引节点和设备类型有什么关系?

5.设备的分类

推荐阅读:字符设备,块设备与网络设备

linux将设备分为三大类:
一类是像磁盘那样以块或者扇区为单位,成块进行输入输出的设备,称为块设备;
一类是像键盘那样以字符为单位,逐个字符进行输入输出的设备,称为字符设备;
第三类就是网络设备.


不同设备之间有什么差异呢?
linux网络设备,字符设备与块设备有很大的不同.
字符设备和块设备对应dev下的一个设备文件,而网络设备不存在这样的设备文件,网络设备
使用套接字来访问,虽然也用read,write等系统调用,但是这些调用只作用于软件对象.
块设备只响应来自于内核的请求,而网络驱动程序异步接受来自外部世界的数据包,并发
送到内核.文件系统通常都建立在块设备上,也有很多文件系统放在内存中,比如说proc
文件系统,那么放在内存中的文件系统就是不需要驱动程序的.

6.如何建立设备文件

7.设备驱动程序的位置

设备驱动程序在整个系统中处于什么样的位置呢?
系统调用是内核与应用程序之间的接口,而驱动程序是内核与硬件之间的接口,也就是内核与硬件之间的
桥梁,它为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以
像操作普通文件一样对硬件设备进行操作.


设备驱动程序在子系统中处于什么样的位置呢?
linux内核分为五个子系统:进程管理,内存管理,文件系统,设备控制和网络管理.
每一部分都有承上启下的作用,对上提供API接口,提供给应用开发工程师使用,
对下通过驱动程序屏蔽不同的硬件构成,完成硬件的具体操作,如图.


设备驱动程序在应用开发中处于什么样的位置呢?
应用程序调用一系列函数库通过对文件的操作完成一系列的功能,应用程序以文件形式访问各种硬件设备函数
库,部分函数无需内核的支持,如库函数内部通过代码实现直接完成功能,部分函数涉及硬件操作或内核的文件,
由内核完成对应的功能,我们称其为系统调用.内核处理系统调用根据设备文件类型+主设备号+次设备号调用
设备驱动程序,设备驱动程序最后直接与硬件进行通信.

8.内核配置选项及驱动程序编译

如果在内核中添加程序,比如说驱动程序,并且使得这个驱动程序能够编译进内核,那么基本
就分为两个步骤:
1.告诉内核,请您下次编译的时候捎带上我,也就是说需要我们进行内核的相关配置,这就需要对
  相关的Makefile文件和Kconfig文件进行修改,以便让内核知道将要对这个新的驱动程序进行
  编译内核.
  为了简化对内核的编译,如图中所示的机制.


当执行menuconfig命令的时候,配置程序会依次从目录由浅入深查找每一个kbuild文件.依照
这个文件中的数据生成一个配置菜单,kbuild像是一个分布在各个目录中的配置数据库,通过
这个数据库可以生成配置菜单.在配置菜单中根据需要配置完成后会在主目录下生成一个.config
文件,此文件保存了配置信息,然后执行make命令,会依赖生成的config文件以确定哪些内容
将编译到内核中,哪些功能不能编译到内核中,然后递归进入每一个目录中寻找Makefile文件
编译相应的代码.

9.参考资料与思考问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值