【Linux设备驱动程序】基础简介

设备驱动程序的作用

  1. 设备驱动的作用在于提供机制,而不是提供策略。
    1) 机制和策略分离的好处是啥?
    可以使软件包更易开发,也更容易根据不同的需求来调整以实现不同的策略。
    2) 机制是啥?
    机制是类似于提供什么样的功能。
    3) 策略是啥?
    策略类似于如何使用上面的功能
    4) 驱动程序的机制和策略的分离有啥例子?
    以软驱为例。软驱的驱动程序不带策略,它的功能是将磁盘表示为一个连续的数据块阵列,系统高层负责提供策略。比如谁有权访问软盘驱动器,或者是直接访问驱动器还是通过文件系统访问,以及用户是否可以在驱动器上挂装文件系统等等,这些都是由系统高层决定的。每个环境可能会有不同的支持,因此驱动程序只要提供功能,尽量不带入策略。

  2. 注意:编写访问硬件的内核代码时,不要给用户强加任何特定策略。 因为不同的用户有不同的需求,驱动程序应该处理如何使硬件可用的问题,而将怎样使用硬件的问题留给上层应用程序。因此,当驱动程序只提供了访问硬件的功能而没有附加任何限制时,这个驱动程序就比较灵活。
    1) 如果有一些特殊“策略”(比如通用的功能)时,是否可以在驱动程序中实现?
    答案是肯定的。比如某个数字I/O驱动程序可以提供以字节为单位访问硬件的方法,这样就可以避免每个使用驱动程序的应用程序重复编写额外代码来处理单个数据位的麻烦。

  3. 驱动程序的设计主要还是综合考虑以下三个方面的因素:
    1) 提供给用户尽量多的选项
    2) 编写驱动程序要占用的时间
    3) 尽量保持程序简单而不至于错误丛生

  4. 不带策略的驱动程序包括的一些典型的特征:
    1) 同时支持同步和异步操作
    2) 驱动程序能够被多次打开
    3) 充分利用硬件特征
    4) 不具备用来“简化任务”的或提供与策略相关的软件层
    5) …

  5. 不带策略是软件设计者的一个共同目标

内核功能划分

在这里插入图片描述

进程管理

  • 进程管理功能负责创建和销毁进程,并处理他们和外部世界之间的连接(输入输出)。
  • 不同进程之间的通信(通过信号、管道或进程间通信原语)是整个系统的基本功能,因此也由内核处理。
  • 控制进程如何共享CPU的调度器也是进程管理的一部分。
  • 内核进程管理活动就是在单个或多个CPU上实现了多个进程的抽象。

内存管理

  • 内存是计算机的主要资源之一,用来管理内存的策略是决定系统性能的一个关键因素。
  • 内核在有限的可用资源上为每个进程都创建了一个虚拟地址空间。
  • 内核的不同部分在和内存管理子系统交互时使用一组函数调用(包括简单的malloclfree函数对 以及 其他一些复杂的函数)。

文件系统

  • Unix在很大程度上依赖于文件系统的概念,Unix中的每个对象几乎都可以当做文件来看待。
  • 内核在没有结构的硬件上构造结构化的文件系统,而文件抽象在整个系统中广泛使用。
  • Linux支持多种文件系统类型,也就是在物理介质上组织数据的不同方式。【比如:磁盘可以格式化为符合Linux标准的ext3文件系统,也可以格式化为常用的FAT文件系统或其他种类】

设备控制

  • 几乎每一个系统操作最终都会映射到物理设备上。
  • 除了处理器、内存以及其他很有限的几个对象外,所有设备控制操作都是由与被控制设备相关的代码来完成,这段代码就叫做驱动程序。
  • 内核必须为系统中的每件外设嵌入相应的驱动程序。这包括硬盘驱动器、键盘和磁带驱动器等。

网络功能

  • 网络功能也必须由操作系统来管理,因为大部分网络操作和具体进程无关:数据报的传入是异步事件。
  • 系统负责在应用程序和网络接口之间传递数据报,并根据网络活动控制程序的执行。因为在某个进程处理数据报之前必须收集、标识和分发这些数据包。
  • 所有的路由和地址解析问题都由内核处理

可装载模块

  • Linux有一个很好的特性:内核提供的特性可在运行时进行扩展。这意味着当系统启动并运行时,我们可以向内核添加/移除功能。
  • 可在运行时添加到内核中的代码被称为“模块”。Linux内核支持好几种模块类型(或者类),包括但不限于设备驱动程序。
  • 每个模块由目标代码组成(没有连接成一个完整的可执行程序),可以使用insmod程序将模块连接到正在运行的内核,也可以使用rmmod程序移除连接

设备和模块的分类

Linux系统将设备分成三种基本类型,每个模块通常实现为其中某一类:字符模块、块模块或网络模块。 注意:这种将模块分为不同类型或类的分类方式并不是非常严格,程序猿可以构造一个大的模块,在其中实现不同类型的设备驱动程序。但是,为每个新功能能创建一个不同的模块,从而可以实现良好的伸缩性和扩展性

字符设备

  • 字符设备是个能够像字节流(类似文件)一样被访问的设备,由字符设备驱动程序来实现这种特性。
  • 字符设备驱动程序通常至少要实现open、close、read和write系统调用。
  • 字符终端(/dev/console)和串口(/dev/ttys0以及类似设备)就是两个字符设备。他们能够很好地说明“流”这种抽象概念。
  • 字符设备可以通过文件系统节点来访问,比如:/dev/tty1和/dev/lp0等。
  • 设备文件和普通文件之间的差别:对普通文件的访问可以前后移动访问位置,而大多数字符设备是一个只能顺序访问的数据通道。也有特殊的可以前后移动访问位置的字符设备,比如:帧抓取器。

块设备

  • 和字符设备类似,块设备也是通过/dev目录下的文件系统节点来访问。
  • 块设备(例如磁盘)上能够容纳文件系统。
  • 大多数Unix系统中,进行I/O操作时块设备每次只能传输一个或多个完整的块,而每个块包含512字节(或2的更高次幂字)的数据。
  • Linux可以让应用程序想字符设备一样地被读写块设备,允许一次传递任意多字节的数据。
  • 块设备和字符设备的区别仅仅在于内核内部管理数据的方式,也就是内核及驱动程序之间的软件接口,而这些不同对于用户来说是透明的。
  • 在内核中,和字符驱动程序相比,块驱动程序具有完全不同的接口。

网络设备

  • 任何网络事务都经过一个网络接口形成,即一个能够和其他主机交换数据的设备。 通常,接口是个硬件设备,但也可能是个纯软件设备。比如回环(loopback)接口。
回环接口是啥?

回环接口在不同领域有不同的解释,这里只说网络设备中的回环接口。

在网络设备中,loopback被用来代表某些用于管理目的的虚拟接口,其含义中,并没有“回环”的体现。
loopback虚拟接口会分配到一个IP地址,但是这个IP地址不会对应到实际的物理接口。网络设备中的loopback地址主要用来管理目的,例如设备发出的报警。
网络设备中的应用程序(管理程序)使用loopback地址发送可接收数据流,而不是使用实际物理地址接口的地址。
对于外部来说,直接使用loopback地址来查看设备对应的信息(比如报警信息),与网卡的物理地址无关。

这里我们也可以把这种地址理解为网络设备提供的某个服务的地址。

具体解析见:https://blog.csdn.net/ljinddlj/article/details/5935520
  • 网络接口由内核中的王阔子系统驱动,负责发送和接收数据包,但它不需要了解每项事务如何映射到实际传送的数据包。
  • 许多网络连接(尤其是使用TCP协议的连接)是面向流的,但网络设备却围绕数据包的传输和接收而设计。
  • 网络驱动程序不需要知道各个连接的相关信息,它只要处理数据包即可。
  • 由于不是面向流的设备,因此将网络接口映射到文件系统中的节点(比如/dev/tty1)是比较困难的
  • Unix访问网络接口的方法仍然是给它们分配一个唯一的名字(比如eth0),但这个名字在文件系统中不存在对应的节点。
  • 内核和网络设备驱动程序间的通信,完全不同于内核和字符以及块驱动程序之间的通信,内核调用一套和数据包传输相关的函数而不是read、write等。

安全问题

几个原则性的概念

  1. 系统中的所有安全检查都是由内核代码进行的,如果内核有安全漏洞,则整个系统就会有安全漏洞。
	在正式发行的内核版本中,只有授权用户才能装载模块。
	也就是说,系统调用init_module会检查调用进程是否具有将模块装载到内核的权利。
	因此,运行正式发布的内核时,只有超级用户或者成功称为超级用户的入侵者才能使用特权代码。
  1. **驱动程序编写者应当尽量避免在代码中实现安全策略。**安全策略问题最好在系统管理员的控制之下,由内核的高层来实现。【当然了,这个也不是必须的,还需要视情况而定。】
  2. 驱动程序编写者应当避免由于自身原因引入安全方面的缺陷。比如缓冲区溢出等。
  3. 任何从用户进程得到的输入只有经过内核严格验证后才能使用。
  4. 必须小心对待未初始化的内存:任何从内核中得到的内存,都必须在提供给用户进程或者设备之前清零或以其他方式初始化,否则就有可能发生信息泄露(比如数据和密码的泄露等)。
  5. 如果设备要解释和分析发送给它的数据,则必须确保用户不能将可能破坏系统的任何东西发送给它。
  6. 考虑设备操作可能会造成的影响。比如:某些特定操作(比如格式化磁盘)可能会影响整个系统,那么就应该将这种操作限制于特权用户。
  7. 小心使用从第三方获得的软件。不应该运行一个预编译好的内核。毕竟源码是开放的,你不能保证你拿到的是无害的:)
  8. Linux内核也可编译为不支持模块方式,从而可以关闭任何模块相关的安全漏洞。但是在这种情况下,所有所需的驱动程序必须直接编译到内核中。【另外,在2.2及以后的内核版本中,我们还可以通过权能机制禁止在系统启动后装载内核模块。】
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值