编写适用于 Oracle® Solaris 11.2 的设备驱动程序

退出打印视图

更新时间: 2014 年 9 月
 
 

通用于所有驱动程序的入口点

有些操作可由任何类型的驱动程序执行,如装入模块所需的函数以及必需的自动配置入口点所需的函数。本节介绍通用于所有驱动程序的入口点类型。Summary of Common Entry Points中列出了通用入口点,并包含指向手册页以及其他相关讨论的链接。

设备访问入口点

字符设备和块设备的驱动程序导出 cb_ops(9S) 结构,该结构定义用于块设备访问和字符设备访问的驱动程序入口点。这两种类型的驱动程序都需要支持 open(9E)close(9E) 入口点。块驱动程序需要支持 strategy(9E),而字符驱动程序可选择实现适用于设备类型的 read(9E)write(9E)ioctl(9E)mmap(9E)devmap(9E) 入口点的任意组合。字符驱动程序还可通过 chpoll(9E) 支持轮询接口。块驱动程序以及那些可使用块文件系统和字符文件系统的驱动程序可通过 aread(9E)awrite(9E) 支持异步 I/O。

可装入模块入口点

所有驱动程序都需要实现可装入模块入口点 _init(9E)_fini(9E)_info(9E),以便装入、卸载和报告有关驱动程序模块的信息。

驱动程序应在 _init(9E) 中分配并初始化所有全局资源,驱动程序应在 _fini(9E) 中释放其资源。


注 - 在 Oracle Solaris OS 中,只有可装入模块例程必须在驱动程序对象模块的外部可见。其他例程可以具有存储类 static

自动配置入口点

对于设备自动配置,驱动程序需要实现 attach(9E)detach(9E)getinfo(9E) 入口点。设备(如 SCSI 目标设备)在引导过程中无法标识自己时,驱动程序还可以实现可选入口点 probe(9E)。有关这些例程的更多信息,请参见Chapter 6, Driver Autoconfiguration

内核统计信息入口点

Oracle Solaris 平台提供了一组丰富的接口来维护和导出内核级统计信息(也称为 kstat)。驱动程序可以自由使用这些接口导出驱动程序和设备的统计信息,用户应用程序可使用这些统计信息来查看驱动程序的内部状态。提供了两个入口点来处理内核统计信息:

  • ks_snapshot(9E),可在特定时间捕获 kstat。

  • ks_update(9E),可用于根据需要更新 kstat 数据。在设置设备来跟踪内核数据但是提取该数据很耗时的情况下,ks_update() 非常有用。

有关更多信息,请参见 kstat_create(9F)kstat(9S) 手册页。另请参见Kernel Statistics

电源管理入口点

提供电源管理功能的硬件设备的驱动程序可支持可选的 power(9E) 入口点。有关此入口点的详细信息,请参见Chapter 12, Power Management

系统停止入口点

对设备进行管理的驱动程序必须实现 quiesce(9E) 入口点。不管理设备的驱动程序可以将 dev_ops 结构中的 devo_quiesce 字段设置为 ddi_quiesce_not_needed ()。只有当处于高 PIL(priority interrupt level,优先中断级别)且禁用了抢占的系统是单线程时,才可以调用 quiesce() 函数。因此,该函数不得阻塞。如果设备有一个已定义的重置状态配置,则作为停止操作的一部分,驱动程序应当将该设备返回为相应的重置状态。此类情况的一个示例是快速重新引导,在这种情况下,当引导到新的操作系统映像时将绕过固件。

通用入口点汇总

下表列出了所有类型驱动程序都可使用的入口点。

表 1-1  用于所有驱动程序类型的入口点
类别/入口点
使用情况
说明
cb_ops 入口点
必填
获取访问设备的权限。其他信息:
必填
放弃访问设备的权限。STREAMS 驱动程序的 close() 版本具有不同于字符驱动程序和块驱动程序的签名。其他信息:
可装入模块入口点
必填
初始化可装入模块。有关其他信息,请参见Loadable Driver Interfaces
必填
准备可装入模块以进行卸载。该入口点是所有驱动程序类型所必需的。有关其他信息,请参见Loadable Driver Interfaces
必填
返回有关可装入模块的信息。有关其他信息,请参见Loadable Driver Interfaces
自动配置入口点
必填
在初始化过程中向系统添加设备。此外,还用于恢复已暂停的系统。有关其他信息,请参见attach() Entry Point
必填
从系统中分离设备。此外,还用于临时暂停设备。有关其他信息,请参见detach() Entry Point
必填
获取特定于驱动程序的设备信息,如设备编号和相应实例之间的映射。其他信息:
请参见说明
确定是否存在非自标识设备。对于无法进行自标识的设备,该入口点是必需的。其他信息:
内核统计信息入口点
可选
捕获 kstat(9S) 数据的快照。有关其他信息,请参见Kernel Statistics
可选
动态更新 kstat(9S) 数据。有关其他信息,请参见Kernel Statistics
电源管理入口点
必填
设置设备的电源级别。如果不使用此入口点,请设置为 NULL。有关其他信息,请参见power() Entry Point
系统停止入口点
请参见说明
停止设备以便设备不再生成中断或者修改或访问内存。
其他入口点
请参见说明
报告驱动程序属性信息。除非替换 ddi_prop_op (9F),否则此入口点是必需的。其他信息:
请参见说明
系统出现故障时将内存转储到设备。对于出现紧急情况时要用作转储设备的任何设备,该入口点是必需的。其他信息:
identify(9E)
过时
请勿使用此入口点。请在 dev_ops 结构中将 nulldev(9F) 指定给此入口点。