Sinos的驱动框架设计得很松散,驱动管理器对驱动没有太大的限制,也没有太多的服务,驱动程序设计的自由度很大 。
一般的简单设备分成两个层次的驱动:硬件接口和软件接口。
举例来说,键盘驱动就是由两层程序来完成的。硬件接口用于处理与硬件芯片(8042)的通讯,用来操作芯片寄存器和获取键盘扫描码;软件接口是对键盘设备的抽象,应用程序可以从软件接口驱动中直接获取键盘的键值 。软件接口层面的驱动负责对扫描码进行翻译,同时对键盘状态(如Num Lock、Caps Lock等)进行控制。更进一步,如果要支持国际化键盘的话,键盘软件接口驱动还应该负责键盘布局的管理。
显卡也是这样,软件接口(实际上是DC 管理器)用来实现抽象的显卡操作,而具体的硬件操作交给硬件驱动,目前可以是VGA或是SVGA驱动。
Sinos驱动的程序结构很简单,从代码层面上来讲,仅由一个回调函数组成,采用类似消息机制的方式运作。对驱动的操作,包括驱动信息的获取,都是通过这个回调函数组成的。
调用驱动回调函数的参数被称为驱动命令,包括两类:通用命令和自定义命令。
通用命令用于控制驱动状态(启动、停止)和驱动信息查询等,每一个驱动都必须支持其中一定数量的子集。
自定义命令用于多层驱动间的通讯。对于某一个特殊类型的设备,其自定义的一组驱动命令就是软硬件驱动接口间的协议。比如显卡设备,一个通用的DC管理器可以操作任何符合协议的显卡驱动,其操作就是通过给显卡驱动发送相应的驱动命令完成的。
目前Sinos所带的驱动都是PC标准设备,对系统运行或调试来说都是关键设备,所以这些驱动都被链接入内核之中。Sinos的总体设计是,大部分的驱动都位于内核之外,由内核在启动时(或其它时刻)加载,驱动在磁盘上以PE格式DLL文件形式存在。整个驱动DLL文件只需要导出一个函数,即驱动的回调函数就行了。
在驱动被最初注册之后,Sinos称这时的驱动状态为冷状态(Cold),即未初始化状态。通过正确响应(由驱动管理器发出的)后续的初始化、启动等命令,驱动的状态信息可以在停止(Stop)、运行(Running)和挂起(Suspended)之间转换。至于响应这些驱动命令时,驱动具体要干什么,由驱动自行决定,驱动管理器只是根据驱动命令的结果设置相应的驱动状态。
在驱动初始化时,一个重要工作就是申请和注册驱动所使用的资源。理想情况下,驱动应该申请和注册包括IRQL 、IO端口、IO映射内存、非分页内存等资源,以便系统统一管理,避免出现资源冲突。
在Sinos中,由于目前还不支持PCI之类的可配置总线,对于驱动硬件资源的使用没有进行管理,也就是驱动初始化时无需注册硬件资源。
虽然使用IO端口等资源不需要注册,但由于在Sinos中中断请求是统一分发的,所以驱动程序还是需要向中断管理器申请中断资源。中断分发机制请见下一节的讨论。