邮箱:zhuimengcanyang@163.com 痴爱嵌入式技术的蜗牛
分类: 嵌入式
2015-06-23 22:22:06
进入LDD3的篇章学习了。
1. 设备驱动简介
Linux作为自由操作系统的优点:内部系统对所有人都是公开的;任何人都可以进行验证、理解和修改操作系统。
设备驱动程序在linux内核中,相当于一个个独立的“黑盒子”,为某个特定的硬件响应提供了良好的内部编程接口。
这个编程接口能够使得驱动程序独立于内核的其它部分而建立,必要的情况下可在运行时“插入”内核。
2. 设备驱动程序的作用
设备驱动的作用在于提供机制,而不是提供策略。
大部分编程问题都分为两部分:“需要提供什么功能”(机制)和“如何使用这些功能”(策略)。驱动程序同样存在机制和策略分离的问题。
在编写驱动程序时,应该注意:编写访问硬件的内核代码时,不要给用户强加任何特定策略。因为不同的用户有不同的需求,驱动程序应该
处理如何使硬件可用的问题,而将怎样使用硬件的问题留个上层应用程序。
3. 内核功能划分
根据内核完成任务的不同,可将内核功能分成如下几个部分:
a. 进程管理:
负责创建和销毁进程,并处理它们和外部世界之间的连接(输入输出)。
不同进程之间的通信(通过信号、管道或进程间通信原语)是整个系统的基本功能,因此也由内核来处理。
b. 内存管理
内存是计算机的主要资源之一,用来管理内存的策略是决定系统性能的一个关键因素。
内核在有限的可用资源之上为每个进程都创建了一个虚拟地址空间。
c. 文件系统
内核在没有结构的硬件上构造结构化的文件系统,而文件抽象在整个系统中广泛使用。
Linux支持多种文件系统类型,也就是在物理介质上组织数据的不同方式。
d. 设备控制
几乎每一个操作系统最终都会映射到物理设备上。所有设备控制操作都由与被控制设备相关的代码来完成,这段代码就叫做驱动程序。
内核必须为系统中的每件外设嵌入相应的驱动程序。
e. 网络功能
网络功能也由操作系统来管理,因为大部分网络操作和具体进程无关:数据包的传人是异步事件。
系统负责在应用程序和网络接口之间传递数据包,并根据网络活动控制程序的执行。
所有的路由和地址解析问题都由内核处理。
内核功能划分图
4. 可装载模块
linux有一个很好的特性:内核提供的特性可在运行时进行扩展。
可在运行时添加到内核中的代码称为“模块”。
insmod将模块连接到正在运行的内核;rmmod移除连接。
5. 设备和模块的分类
a. 字符设备
- 三种基本类型:
字符设备是个能够像字节流一样被访问的设备,由字符驱动程序来实现这个种特性。字符设备通常要实现open,close,read和write系统调用。
字符设备可以通过文件系统节点来访问,这些设备文件和普通文件的唯一差别在于:对普通文件的访问可以前后移动访问位置,而大多数字符设备是一个只能循序访问的数据通道。
b. 块设备
块设备也是 通过 /dev 目录下的文件系统节点来访问。块设备(比如磁盘)上能够容纳文件系统。
Linux可以让应用程序像字符设备一样地读写块设备,允许一次传递任意多字节的数据。
块设备和字符设备的区别仅仅在于:内核内部管理数据的方式,也就是在内核中,字符设备和块设备驱动程序具有完全不同的软件接口 。
c. 网络接口
任何网络事务都经过一个网络接口形成,即一个能够和其他主机交换数据的设备。
网络接口由内核中的网络子系统驱动,负责发送和接收数据包,但它不需要了解每项事务如何映射到实际传送的数据包。说白了,也是只是提供机制,不提供策略。
就是说在网络子系统驱动中,只是负责发送数据(只是提供这个机制),至于数据是什么意思,怎么处理,交给再上一层处理(策略在这里提供)。
下面一句话,也是这个意思:
“网络驱动程序不需要知道各个连接的相关信息,它只要处理数据包即可”。 ---> “提供机制,而非策略”,牢记这句话。
注意:
内核和网络设备驱动程序间的通信,完全不同于内核和字符以及块设备之间的通信,内核调用一套和数据包传输相关的函数,而不是read、write等。
- 还有另外一种划分驱动程序模块类型的方法:
一般而言,某些驱动程序类型同内核用来支持给定类型设备的附加层一起工作。比如,每个USB设备由一个USB模块驱动,而该USB模块和USB子系统一同工作,但设备本身在系统中表现为一个字符设备(比如USB串口),一个块设备(比如USB存储卡读取器),或者一个网络设备(比如USB以太网接口)。
- 下面这句话,记住:
“内核开发者实现整个设备类型的共有特性,然后提供给驱动程序的实现者,从而避免了重复工作,降低了出现缺陷的可能,简化并增强了编写这些驱动程序的过程。”
- 除了设备驱动程序外,内核中的其他一些功能也都模块化了。比如文件系统。
6. 安全问题 & 版本编号 & 许可证条款 & 加入内核开发社团一个文件系统类型(比如yaffs,jiffs2)决定了如何在块设备上组织数据,以表示目录和文件形成的树。
文件系统并不是设备驱动程序,因为没有任何实际物理设备同这种信息组织方式相关联。文件系统是个软件驱动程序,它将底层数据结构映射到高层数据结构,决定文件名可以有多长以及在目录项中存储文件的那些信息等等。
文件系统模块必须实现访问目录和文件的最底层系统调用,方法是将文件名和路径映射到数据块中的数据结构中。这种接口完全独立于在磁盘(或者其他介质)上传输的实际数据,而数据的传输由块设备驱动程序负责完成。从这里可以看出,块设备驱动程序只是实现数据传输等功能,至于什么意思,怎么访问文件目录、路径等信息交给再上一层的文件系统来完成,同样是这句话 “驱动程序只提供机制,而非策略”。
暂且略过,以后遇到在补充吧。