近期搜了很多有关Linux PM的相关资料,但是总感觉叙述晦涩难懂,一来是由于对kernel的理解还未到高度,二来确实手头事情太多,没有办法沉下心来阅读code,今天晚上偷了个闲,仔细读了一遍有关pm的技术文档与source code,颇有心得,记于此。
开始理解一下Linux PM的一些基本概念, sleep, hibernate 两个概念,根据文档上说,sleep是 suspend to mem, hibernate是 suspend to disk, 我理解sleep比如我们的手机长期没有active后,自动锁屏,进入sleep状态;而hibernate则是关机状态,将当前在memory中的image,存放在disk之中。文中还说sleep的细节要比hibernate要来的简单,进入suspend的过程是: prepare---suspend---suspend_noirq; wakeup过程是 resume_noirq----resume---complete,具体调用过程也比较复杂,英文文档,我很烂的英文也就记得不是那么清楚,大概就是按照device topology来逐个调用device的suspend,其中suspend是从device-->class-->bus 这个过程调用,而resume是从bus-->class>device这个过程调用,而hibernate过程更加复杂,不过暂时不影响我们理解Linux pm框架。
就构架上理解,pm主要有两个目录,一是 kernel/power下的code, 还有一份是 driver/base/power下的code。
driver/base/power下主要是pm的driver实现,说到这个,我想到了driver这个概念,一般来说,driver是指对某个或某类device的控制,但是有很多很多的driver并不是对hw的device进行控制,而是去用driver来封装一些内核接口,或者内核数据,实现一些特定的功能,而并不是一定需要控制特别的device,可以是一个虚拟的device,其实真是的hw device 也就是抽象成为一个数据结构来进行管理