真实面经题目 · 原创解析
Linux 驱动 probe 失败时资源清理策略是什么,devm_* 如何简化清理?
这题考驱动资源生命周期管理,回答要说明手动清理需按申请逆序 unwind,devm_* 把资源绑定到 device 生命周期并在失败或移除时自动释放。
真实面经题目 · 原创解析
这题考驱动资源生命周期管理,回答要说明手动清理需按申请逆序 unwind,devm_* 把资源绑定到 device 生命周期并在失败或移除时自动释放。
probe 里通常会申请内存、映射寄存器、获取 clock/regulator/gpio、注册 IRQ、注册子设备等。如果中途某一步失败,已经申请成功的资源必须按相反顺序释放,否则会泄漏、重复注册或硬件状态残留。传统写法是每一步失败 goto 到对应标签,逆序 free、iounmap、free_irq、clk_disable、regulator_disable。devm_* 系列把资源挂到 struct device 的 devres 列表上,比如 devm_kzalloc、devm_ioremap_resource、devm_request_threaded_irq、devm_gpiod_get;probe 返回失败或设备 remove 时,内核会自动按逆序释放这些 managed resources,减少错误路径样板代码。注意 devm 不是万能的:硬件已经启动、runtime PM、工作队列、子设备注册、buffer 对外暴露等副作用仍可能需要显式停止和注销。
probe 是分阶段初始化。第 N 步失败时,前 N-1 步的资源已经生效,必须按依赖关系反向撤销,避免后续重试或卸载时状态不一致。
传统错误处理需要很多 err_free_x 标签。写得清楚可以工作,但资源多时很容易漏掉某条失败路径或释放顺序错误。
devm 资源记录在 device 的 devres 栈里。probe 失败、驱动解绑或设备销毁时,内核自动释放,释放顺序通常与申请顺序相反。
devm 只管理资源释放,不自动理解硬件状态机。已经启动的 DMA、定时器、工作队列、runtime PM 引用、注册到其他子系统的对象可能仍要手动停止或注销。
通常不需要手动 free_irq,设备释放时会自动释放;但如果要在设备生命周期结束前提前停止中断,需要显式禁用或释放。
有些资源生命周期不是整个 device,或者释放顺序需要精确控制,或者涉及外部可见对象和硬件状态,手动管理更清晰。
我会先看 dmesg 和返回码,再查 /sys 下设备、驱动和资源状态,必要时加 trace/ftrace 或最小日志,先证明问题出在设备生成、匹配、资源获取、回调路径还是用户态交互。