日期:2014-05-16  浏览次数:20609 次

真心请教Linux kernel进入Suspend问题
我想在linux kernel进入suspend之前,应用程序可以做点事情,不知道是否可行?
目前想了一个方法,linux kernel进入suspend之前,好像会有PM_SUSPEND_PREPARE事件,是否可以在这里给上层应用发个消息,然后等待上层应用回复后,再继续执行?

请大家指点,谢谢!

------解决方案--------------------
请先明确下是纯linux还是android的哪个版本
如果允许该内核代码的话,这样的功能小意思了
------解决方案--------------------
可是,我觉得只有线程有suspend,内核是不会suspend的呀。如果你在线程suspend前通知一下用户空间的程序,倒是很容易的。
------解决方案--------------------
发送一个信号给应用即可。
需要注意,所有的硬件是否支持suspend和resume。
------解决方案--------------------
在纯linux,以2.6.36为例,每当linux要进入suspend,会执行
suspend_prepare()->pm_notifier_call_chain(PM_SUSPEND_PREPARE);
这个pm_notifier_call_chain属于内核自定义的内核通知链。所有需要支持SUSPEND的驱动,都会用register_pm_notifier把自己注册到这条通知连上。
这样pm_notifier_call_chain就能把PM_SUSPEND_PREPARE事件通知到每一个驱动。
但是我在pm_notifier_call_chain里没有找到对应用程序有什么统一的通知。所以我觉得你要在suspend_prepare()里对某一个进程发自定义的通知是很容易的,但不能对所有进程都发通知,我想linux本生没有这样的机制。

android对电源管理作了较多修改,这个我不知道。

------解决方案--------------------
看代码内核驱动收到PM_SUSPEND_PREPARE 通知的时候用户进程还没被挂起的。
也许真的是可以在这里个用户进程发信号,等待用户进程把事情,再继续,这通知处理里面是可以block住的,也就是说可以等待用户应用。可以试一下