ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

linux的runtime pm系统总结

linux的runtime pm系统总结 是什么runtime pm运行时电源管理是一种功耗管理策略它用于设备不活跃时关闭它的时钟和电源。怎么用1 启动设备的runtime pm设备驱动初始化probe函数中调用pm_runtime_enable()2关闭设备的runtime pm设备驱动的卸载remove函数中调用pm_runtime_disable()3进入低功耗模式开发者调用pm_runtime_put()或者pm_runtime_put_sync(),请求将设备置于低功耗模式。这里只是请求还未真正进入低功耗4退出低功耗开发者调用pm_runtime_get()或者pm_runtime_get_sync(),请求将设备退出低功耗模式。这里只是请求还未真正退出低功耗5系统级休眠唤醒pm_runtime_force_suspend()在系统准备休眠时调用。它会强制设备进入运行时挂起状态即使设备当前的使用计数usage_count不为零。它会调用驱动的 .runtime_suspend() 回调并记录设备的状态以便在唤醒时决定是否需要恢复pm_runtime_force_resume()在系统唤醒时调用。它用于撤销 pm_runtime_force_suspend() 的操作在必要时调用驱动的 .runtime_resume() 回调恢复设备状态原理决定设备能否进入低功耗的要素是设备的引用计数dev-power.usage_count。从“计数归零”到“真正挂起”的流程计数归零后PM 核心会按顺序尝试以下步骤任何一步不满足挂起就不会发生1执行 runtime_idle 回调PM 核心会调用驱动或子系统的 .runtime_idle 回调。这个回调是一个“缓冲”它的职责是检查设备是否真的空闲并决定是否要安排一次挂起。它本身不应该直接关闭硬件资源。2检查挂起条件即使 runtime_idle 决定继续PM 核心还会检查多个条件例如1运行时 PM 是否被用户空间禁用disable_depth 0。2设备是否有仍在活跃的子设备child_count 0。3是否有其他内核组件通过 QoS 机制阻止了设备断电。3执行 runtime_suspend 回调只有当以上检查都通过PM 核心才会最终调用 .runtime_suspend 回调来执行真正的挂起操作如关闭时钟、断电设备唤醒流程1内核会在工作队列中排队一个工作项来处理唤醒请求。2该工作项最终会调用设备驱动的 .runtime_resume 回调执行真正的硬件唤醒操作如上电、开时钟。3唤醒完成后设备的 Runtime PM 状态会变为 RPM_ACTIVE。4.接口说明1pm_runtime_put()只减少了设备的引用计数。当减少到0时会触发一次异步的空闲检查请求只是把检查是否空闲的工作项排入到PM工作队列然后就返回了。2pm_runtime_put_sync()减少引用计数之后会等待挂起流程结束之后才返回。返回结果可能挂起成功或不满足条件而挂起失败。3pm_runtime_get()只是增加了设备的引用计数并异步请求唤醒设备它会发起一个异步的唤醒请求通过向 PM 工作队列中排队一个工作项来实现然后函数立即返回。4pm_runtime_get_sync()增加了设备的引用计数会等待唤醒流程结束之后才返回。返回结果可能唤醒成功或不满足条件而唤醒失败。5xxxx_sync()不能在中断中使用。6pm_runtime_set_active()将设备的运行时 PM 状态设置为“活跃通常是 pm_runtime_enable 的前置步骤。它确保在运行时 PM 功能正式开启前设备的初始状态是正确的即如果硬件是开着的软件状态也应该是活跃7pm_runtime_set_suspend()将设备的运行时 PM 状态设置为“已挂起”会先 pm_runtime_disable() 禁用运行时 PM然后调用 pm_runtime_set_suspended() 将状态重置为挂起并释放父设备或供应商的引用确保资源完全释放。8pm_runtime_idle()发起一次空闲检查并且等待挂起设备流程执行结束才返回。9pm_runtime_put_noidle()原子性的减少设备引用计数但不会触发空闲检查或挂起请求。
返回列表