在Hello China的实现中,设备的管理是按照下列策略来实现的:
(1)采用一个统一的IO管理器对象(IOManager)来集中管理所有的设备对象、设备驱动程序等,实现设备驱动程序的加载和卸载。
(2)在IOManager对象和用户线程之间也定义了一个良好的交互接口,用户线程直接调用IOManager的用户侧接口,请求设备提供的服务。
(3)把文件系统的实现也纳入设备管理框架里面,对文件的访问也是通过IOManager的用户侧接口进行的。
(4)文件系统在实现的时候也作为驱动程序来实现,遵循设备驱动程序的体系结构,也遵循设备驱动程序与操作系统的通信机制。
(5)设备驱动程序代码和IOManager代码必须是可重入的,即多个用户线程可以同时调用同一个设备驱动程序的功能函数(或IOManager函数),而不会发生不一致的资源访问问题。为了实现这个功能,需要在IOManager的实现中引入互斥机制,在设备驱动程序的实现中,需要考虑自己可能管理多个设备的情况,并为每个设备建立一套单独的数据。也需要充分考虑可能面临多个线程同时访问的问题,通过操作系统核心提供的同步或互斥机制来保护设备相关数据,充分保证代码的可重入性。
(6)实现设备的动态发现和枚举,比如,针对PCI总线,总线驱动程序可以动态地发现连接在总线上的设备,并为之分配系统资源(中断号、端口号、内存映射区域等),并可动态加载这些设备的驱动程序。
(7)即插即用(PnP),实时监视总线状态,对于实时出现在总线上的设备,操作系统会及时做出响应,比如分配资源、加载驱动等,对于从总线上实时拆离的设备,操作系统也会及时卸载掉已经加载的驱动程序,并释放这些设备所占用的资源。
图10-4示意了Hello China设备管理框架的大致架构。(www.xing528.com)
图10-4 Hello China的设备管理框架
可以看出,在整个设备管理框架中,DeviceManager和IOManager是核心部件。IOManager提供了两个规范的接口,对于用户核心线程的接口称为用户接口(或上行接口),对于设备驱动程序称为设备接口(或下行接口),用户线程通过用户接口调用IOManager,进而获得设备服务,设备驱动程序通过设备接口调用IOManager提供的设备管理服务,或通知IOManager自己的存在。
需要注意的是,设备驱动程序之间也可能相互调用彼此的服务。这种情况的一个典型应用,就是文件系统的实现。比如,用户通过IOManager提供的调用接口访问一个文件(打开、读/写等),IOManager把这种调用转化为对相应文件系统的调用,相应的文件系统在完成内部表格的修改后,需要对实际的物理存储设备进行操作,这个时候,文件系统驱动程序(在Hello China的实现中,文件系统作为一种特殊的驱动程序来实现)就需要调用实际的物理设备驱动程序,对实际的物理设备进行操作。对文件系统的实现,可参考第12章。
对于中断管理,设备驱动程序在获得系统为自己分配的资源(中断号、端口号、内存映射区域、DMA通道等)后,可以以中断向量号和对应的中断处理程序(一个函数指针)为参数调用ConnectInterrupt函数(该函数由操作系统核心提供),注册自己的中断处理函数。当然,在设备卸载的时候,驱动程序也需要调用DisconnectInterrupt函数,解除自己注册的中断调用,从而释放中断资源。
需要注意的是,一个设备驱动程序可能管理多个设备(或逻辑的设备功能)。另外之所以把设备和设备驱动程序之间的交互关系表示为双向,是因为设备可能通过中断的方式主动与设备驱动程序交互。
下面将详细介绍该管理框架中涉及的模块以及模块之间的接口。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。