如果驱动程序中存在这个函数,且驱动程序被编译为可加载模块,则 驱动程序具有被卸载的能力。如果硬件支持热插拔,这是一个很重要的 特性。但ISA总线不支持热插拔,因此这个特性对于ISA设备不是特别 重要。卸载驱动程序的能力可能在调试时有用,但很多情况下只有在 老版本的驱动程序莫名其妙地卡住系统的情况下才需要安装新版本的 驱动程序,并且无论如何都需要重启,这样使得花费精力写分离例程 有些不值得。另一个宣称卸载允许在用于生产的机器上升级驱动程序的 论点看起来似乎更多的只是理论而已。升级驱动程序是一项危险的操作, 决不不应当在用于生产的机器上实行(并且当系统运行于安全模式时这 也是不被允许的)。然而,出于完整性考虑,还是会提供分离例程。
如果驱动程序成功分离,分离例程返回0,否则返回错误码。
分离逻辑是连接的镜像。要做的第一件事情就是将驱动程序从内核 子系统分离。如果设备当前正打开着,驱动程序有两个选择:拒绝分离 或者强制关闭并继续进行分离。选用哪种方式取决于特定内核子系统 执行强制关闭的能力和驱动程序作者的偏好。通常强制关闭似乎是 更好的选择。
struct xxx_softc *sc = device_get_softc(dev); int error; error = xxx_detach_subsystem(sc); if(error) return error;
下一步,驱动程序可能希望复位硬件到某种一致的状态。包括停止任何 将要进行的传输,禁用DMA通道和中断以避免设备破坏内存。对于大多数 驱动程序而言,这正是关闭例程所做的,因此如果驱动程序中包括关闭 例程,我们只要调用它就可以了。
xxx_isa_shutdown(dev);
最后释放所有资源并返回成功。
xxx_free_resources(sc); return 0;
本文档和其它文档可从这里下载:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.