我们先来看看An Introduction to Device Drivers章节是如何对设备驱动扮演的角色进行描述的:
对用户端来说,设备驱动是一个完完全全的“黑盒”,其命令的执行和下发,以及对硬件端的操作彻底“躲藏”在标准系统调用之下,用户要想操作这个设备,只需要调用厂商提供的命令即可,同时用户也确实不会去关心对设备实现的细节。linux下的设备驱动有一个非常便利的特点-“随插随卸”,即随时可以嵌套到内核中使用,也可随时卸载摒弃于内核之外(画外音:这个特性解放了像你我这样千千万万个程序猿的发量)。
当然,理解归理解。如果光有理解,没有实际的分析,那岂不是如空中阁楼,起底不稳,各位看官老爷能不着急?
言归正传,我们来看看内核的组成,上图:
跟老版内核的划分不一样,新的内核划分标准将内核划分成以下五个部分:
1.Process management
Process management主要包括进程的创建与销毁,进程间的通信,以及调度器的使用。
2.Memory management
计算机的内存首先是一种资源,在资源有限的前提下,一定会发生资源的分配和抢占,当然这种资源的利用和分配一定是需要一个强有力的“部门”来进行有序监管,linux内核采用了虚拟内存地址空间和一些简单的接口例如malloc和free作为策略之一来实施管理。
3.Filesystems
总所周知,linux是继承Unix的衣钵而来:一切均可视为文件。文件系统是对底层硬件设备和设备驱动等的一种抽象集合。
4.Device control
不多说,设备驱动是一组负责驱动特定设备的代码,Device control是设备驱动总集合的一个别称。
5. Networking
linux内核五个部分之间并不是老死不相往来的状态,相反而是相互间协调,交互完成工作。就拿我们设备驱动举例,设备驱动的初始化过程一定要使用内存资源-涉及到内存的管理,要经由文件系统下发命令道设备驱动层,要利用进程实现驱动的功能等。
说完了linux内核组成的五个部分,再来说说硬件设备的分类:
1.Character devices
2.Block devices
3.Network interfaces
最后总结一下,设备驱动是要挂载到内核当中才能使用,已经挂载的设备驱动提供了“双向通道”(或者叫做pipe,可能不止一个哦)的作用:来自上一层命令经过设备驱动打包和封装传递给硬件设备(对应上面划分的三类设备),再处理来自硬件设备的信息和请求,处理后返回给上一层。
题外话:linux设备驱动的学习更多的是来源于内核特性,然后才是各种通信协议和规范。



