设备驱动程序简介
概述:
- Linux驱动程序的核心:作为一个黑盒子,使某个特定硬件相应相应的内部编程接口,如posix。其需要隐藏体的工作细节。
- Linux驱动程序编写为什么简单:其是使独立于内核的其他部分而建立的,其是模块化的。
驱动程序的作用
- 驱动程序的妥协: 在编写驱动程序所需要的时间和驱动程序的灵活性之间实现折中
- 驱动程序的核心思想: 驱动程序提供机制(需要提供什么功能),而不是提供策略(如何使用这些功能)。
例子:软驱的驱动程序将磁盘表示为一个连续的数据块阵列,由高层提供访问策略。 - 驱动程序的基本概念: 由此,引申出了驱动程序的基本概念:编写访问硬件的内核代码时,不要给用户添加任何特定策略(可以实现基本策略,如按字节读写)。因此,其本质是应用程序和实际设备中的一个软件层。
- 驱动程序编写的核心原则: 提供给用户尽可能多的选项;编写驱动程序占用时间尽可能短;尽量保持程序的简单性。
- 驱动程序的典型特征: 支持同步异步操作、能被多次打开、充分利用硬件特性、不带策略
内核功能划分
- 进程管理: 创建/销毁进程;进程间通信;进程调度。本质:在CPU上实现多个进程的抽象;
- 内存管理: 使用虚拟地址空间管理内存,同时保障进程/内核的隔离性;
- 文件系统: Unix和核心-一切皆文件。本质是在没有结构的硬件上构造的结构化的文件系统,对不同的物理硬件进行高层抽象。(在物理介质上组织数据)
- 设备控制: 内核对于设备(外设)控制的操作需要依赖于相应的代码,这部分即是驱动程序。
- 网络功能: 由于网络功能和具体进程无关,因此操作系统需要在应用程序和网络接口之间对数据包进行传递(协议栈);
可装载模块
- Linux特性: 在系统运行时,可以向内核添加相应功能,通过对相应模块类的加载(insmod)和移除(rmmod)
设备和模块的分类
- 字符设备: 其本质是字节流访问设备,其类似于文件。大多数只能顺序访问,但是少数可以由数据区特性。其往往利用/dev目录下的文件系统节点访问。
- 块设备: 与字符设备类似,其往往利用/dev目录下的文件系统节点访问。但是其传输过程中一次只能传出一个/多个完整的块(大小通常为512b或者更高)。其与字符设备的区别是内核管理数据方式不同,对于用户来说,其是一样的。
- 网络接口: 由内核中的网络子系统驱动,其负责发送/接受数据包。由于其不是面向流的设备,因此其不在文件系统中,其和内核的通信是使用数据包传输相关的函数。
- 子系统分类法: 使用支持某种给定类型的设备的附加层一起工作(USB、I2C等),通过高层抽象,简化了驱动程序的编写,避免了bug的可能性(抽象工厂模式)
安全问题
- 安全问题核心: 如果内核存在安全漏洞,则整个系统就会存在安全漏洞;因此,之后超级用户才能使用特权代码
- 原则1: 驱动程序应当尽量避免在代码中实现安全策略,但是当设备访问会影响整个系统时(设置中断/磁盘驱动)时,相关的安全检查必须由驱动程序本身完成。
- 原则2: 避免由与自身原因引入安全方面的缺陷。
- 其他原则: 用户输入必须经过内核验证才能使用;内存使用前一定要初始化;考虑设备操作可能造成的影响;小心使用第三方获得的软件。
版本编号
- 版本问题文档: 内核原文件:Documentation/Changes
- 内核编号: 偶数版本为稳定版本,奇数版本为快照;
许可证条款
- linux使用的是GPL2
加入内核开发社团
书籍上的链接已经失效,使用http://vger.kernel.org/vger-lists.html 进行订阅
标签:驱动程序,简介,文件系统,访问,内核,编写,设备 From: https://www.cnblogs.com/David-Dong/p/18156828