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

退出打印视图

更新时间: 2014 年 9 月
 
 

驱动程序的装入和卸载

系统从用于自动配置的内核模块目录的 drv 子目录装入驱动程序二进制模块。请参见Copying the Driver to a Module Directory

将模块读入内存且解析了所有符号之后,系统将调用此模块的 _init(9E) 入口点。_init() 函数将调用 mod_install(9F),实际上就是装入此模块。


注 - 调用 mod_install() 期间,一旦调用了 mod_install(),其他线程也能够调用 attach(9E)。从编程角度来看,在调用 mod_install() 之前必须执行所有 _init() 初始化。如果 mod_install() 失败(即返回非零值),则必须取消初始化。

一旦 _init() 成功完成,便会在系统中正确注册驱动程序。实际上,此时驱动程序并不管理任何设备。设备管理是在设备配置过程中进行的。

为了节省系统内存或根据用户的明确请求,系统会卸载驱动程序二进制模块。从内存中删除驱动程序代码和数据之前,将调用该驱动程序的 _fini(9E) 入口点。当且仅当 _fini() 返回成功信息时,才会卸载驱动程序。

下图概述了设备驱动程序的结构。阴影区域突出显示驱动程序的数据结构和入口点。阴影区域的上半部分包括支持驱动程序装入和卸载的数据结构和入口点。下半部分与驱动程序配置相关。

图 6-1  模块装入和自动配置入口点

image:图中显示了用于自动配置和模块装入的结构和入口点。