扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在手持设备设计中,电源管理历来为重要的研究课题之一。我们日常所说的省电就属于电源管理的范畴,这也是我们最关心的一个部分。通过挂起不必要的设备、降低CPU的频率或者其它方法,可以减少能量的消耗,达到省电的目的。电源管理实际上是一个系统工程,从应用程序到内核框架,再到设备驱动和硬件设备,都要参与进来,才能达到电源管理的最优化。本文介绍一下gnome-power-manager的工作原理。
为什么要研究gnome-power-manager呢?我们说过,电源管理是一个系统工程,不但与内核有关,与应用程序也有很大关系,而gnome-power-manager其名称就暗示了它是与电源管理关系最大的应用程序之一。研究gnome-power-manager的工作原理,我们可以更好的理解应用程序与底层电源管理服务之间的交互关系。
gnome-power-manager具有哪些功能呢?从官方网站上我们可以看到:
1. 电源状态。
2. 电源管理。
3. 设置电源选项。
交流电源选项:其中包括显示器/计算机进入休眠的时间、显示器的亮度和笔记本合上时的动作。
电池电源选项:其中包括显示器/计算机进入休眠的时间、显示器的亮度和笔记本合上时的动作。
常用选项:休眠的类型和panel上的通知区的行为。
通过以上几幅图片,我们已经了解到gnome-power-manager的基本功能,但这些功能都是从用户角度来看的。下面我们再从程序内部来看看,在gnome-power-manager的代码中,有一个名为gpm-manager.xml的文件,从其内容我们知道这是一个dbus服务对象接口定义,它实现了一个org.gnome.PowerManager接口,这个接口提供了基本的电源管理功能。在acpid一文中,我们说过acpid是内核与应用程序之间的接口,但是acpid对普通应用程序来说还是过于底层,而gnome-power-manager才是普通应用程序应该调用的接口。
gpm-manager.xml中定义的主要接口有:
1. GetLowPowerMode 是否使用了低耗能模式。
2. GetOnAc 是否使用的交流电源。
3. AllowedSuspend 能否挂起。
4. AllowedHibernate 能否睡眠。
5. AllowedShutdown 能否关机。
6. AllowedReboot 能否重起。
7. Hibernate 睡眠
8. Suspend 挂起
9. Shutdown 关机
10. Reboot 重起
11. GetDpmsMode 得到显示器电源管理模式。
12. SetDpmsMode 设置显示器电源管理模式。
13. Inhibit 禁用电源管理功能。比如文件管理在拷贝文件时,为了防止系统在此时挂起或者睡眠,可以暂时禁用电源管理,直到拷贝完成。
14. UnInhibit 恢复电源管理功能。
下面我们再看以上这些函数的实现方式,这才是我真正关心的。
1. GetLowPowerMode
这个函数实现很简单,只是一项简单的配置信息,通过gconf_client_get_bool获取GPM_PREF_AC_LOWPOWER或者GPM_PREF_BATTERY_LOWPOWER,这取决于当前的电源类型。
2. GetOnAc
通过向hal服务进程发送FindDeviceByCapability请求,可以得到是否支持交流电源的属性。然后发送GetPropertyBoolean(ac_adapter.present) 请求,可以得到交流电源是否存在。
3. AllowedSuspend
4. AllowedHibernate
以上函数都是通过向hal服务进程发送GetPropertyBoolean请求,得到对应的属性值。
5. AllowedShutdown
6. AllowedReboot
以上函数都是通过向hal服务进程发送IsUserPrivileged请求,查看当前用户是否具有权限决定。
7. Hibernate 睡眠
8. Suspend 挂起
9. Shutdown 关机
10. Reboot 重起
以上函数都是通过向hal服务进程发送相应请求来实现。请求分别为Hibernate、Suspend、Shutdown和Reboot。
11. GetDpmsMode 得到显示器电源管理模式。
12. SetDpmsMode 设置显示器电源管理模式。
以上函数都是通过X11的DPMS扩展实现的。当然X11只是封装了DPMS功能,真正的实现是在内核的显示驱动程序里。DPMS比较重要,因为显示设备通常是耗电大户,如果可能的话,我们会用专门一章来讲解。
13. Inhibit
14. UnInhibit
这两个函数的实现很简单:Inhibit把应用程序的dbus-connection(标识发送请求的应用程序)加入到一个链表中。UnInhibit则从该链表中删除应用程序的dbus-connection。如果该链表不为空,则禁用电源管理功能。
综上所述,gnome-power-manager即是一个直接面对最终用户的应用程序,也是一个中间层。作为中间层,它把hal和x11提供的底层细节封装起来了,同时为其它应用程序提供了更高层的服务接口。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者