probe、remove 与资源清理

这页讲的是:驱动不是匹配上设备就算结束,它还要在 probe 阶段把资源接起来,在 remove 阶段把现场收干净。学这页的重点,是理解驱动真正难的地方,常常不是“怎么开始工作”,而是“怎么安全进入、稳定存在、完整退出”。

这块是什么

probe、remove 与资源清理,讲的是驱动在和设备成功匹配之后,如何逐步把中断、内存映射、DMA、队列、后台工作等资源接入系统,又如何在设备离开、驱动卸载或错误回滚时,把这些关系安全撤掉。它是驱动生命周期里最容易体现系统工程味道的一段。

可以把 probe 理解成“正式接手现场并把设备布置妥当”,把 remove 理解成“有序撤场,确保没有线头还悬着”。

它负责什么

把设备真正接起来

  • 匹配成功后完成初始化接管
  • 建立中断、缓冲区、映射和回调关系
  • 把硬件能力接入对应子系统
  • 让设备从“被看见”变成“真的可用”

处理失败与回滚

  • 不是每次 probe 都会顺利到底
  • 中途失败时要收回已经拿到的资源
  • 避免半初始化状态留在系统里
  • 让失败不是随机烂尾,而是可控退出

有序退出与清理

  • remove 时要停掉仍在运行的工作
  • 解除绑定、释放资源、撤销关联
  • 避免异步任务继续碰已失效对象
  • 让设备离开或驱动卸载不留下后患

为什么 remove 常常比 probe 更难

原因你现在怎么理解为什么麻烦
系统里已经有很多关系probe 后驱动已和中断、内存、队列、子系统建立了联系。退出时必须按正确次序逐步拆开。
异步工作可能还没结束后台 work、超时、唤醒路径可能仍在飞。如果清理太早,就容易碰到已失效对象。
资源不总是一步拿齐probe 常是分阶段拿资源、逐步接管。失败回滚和最终 remove 都要知道已经走到哪一步。
退出时机往往更复杂热插拔、错误恢复、模块卸载都可能触发 remove。不是单一 happy path,而是多种场景下都要成立。

关键概念

概念现在怎么理解
probe驱动和设备匹配成功后,真正开始接管和初始化的入口。
remove设备或驱动退出时,撤销接管并收回资源的入口。
资源清理把中断、映射、缓冲区、异步工作等关系安全收掉。
回滚probe 中途失败时,把已经做过的部分撤回来。
悬空引用对象明明已经清理了,别的路径却还想继续访问它。

为什么重要

常见误解

它不负责什么

和其他模块的关系

相关模块关系
总线、设备发现与驱动匹配那页讲设备如何遇到驱动,这页细看遇到之后如何真正接手和撤离。
模块加载与生命周期驱动模块装入后常会进入 probe,卸载前又常要经过 remove 与清理。
workqueue / 定时器退出时常要先停掉后台工作和超时路径,避免异步访问失效资源。
DMA / 中断 / 内存映射这些资源多半在 probe 阶段建立,并在 remove 阶段按顺序拆除。

读完这页后,你应该能回答

后面适合继续问:为什么很多驱动初始化代码像在一层层搭脚手架?remove 时最容易漏掉哪类后台关系?失败回滚和最终卸载的思路有什么共通之处?