说明:
1. Based on linux2.6.32, only for mem(SDR)
2. 有兴趣请先参考阅读: 电源管理方案APM和ACPI比较.doc
Linux系统的休眠与唤醒简介.doc
3. 本文先研究标准linux的休眠与唤醒,android对这部分的增改在另一篇文章中讨论
4. 基于手上的一个项目来讨论,这里只讨论共性的地方
虽然linux支持三种省电模式:standby、suspend to ram、suspend to disk,但是在使用电池供电的手持设备上,几乎所有的方案都只支持STR模式(也有同时支持standby模式的),因为STD模式需要有交换分区的支持,但是像手机类的嵌入式设备,他们普遍使用nand来存储数据和代码,而且其上使用的文件系统yaffs一般都没有划分交换分区,所以手机类设备上的linux都没有支持STD省电模式。
一、项目power相关的配置
目前我手上的项目的linux电源管理方案配置如下,.config文件的截图,当然也可以通过make menuconfig使用图形化来配置:
#
# CPU Power Management
#
# CONFIG_CPU_IDLE is not set
#
# Power management options
#
CONFIG_PM=y
# CONFIG_PM_DEBUG is not set
CONFIG_PM_SLEEP=y
CONFIG_SUSPEND=y
CONFIG_SUSPEND_FREEZER=y
CONFIG_HAS_WAKELOCK=y
CONFIG_HAS_EARLYSUSPEND=y
CONFIG_WAKELOCK=y
CONFIG_WAKELOCK_STAT=y
CONFIG_USER_WAKELOCK=y
CONFIG_EARLYSUSPEND=y
# CONFIG_NO_USER_SPACE_SCREEN_ACCESS_CONTROL is not set
# CONFIG_CONSOLE_EARLYSUSPEND is not set
CONFIG_FB_EARLYSUSPEND=y
# CONFIG_APM_EMULATION is not set
# CONFIG_PM_RUNTIME is not set
CONFIG_ARCH_SUSPEND_POSSIBLE=y
CONFIG_NET=y
上面的配置对应下图中的下半部分图形化配置。。。,看来是直接在Kconfig文件中删除了配置STD模式的选项。

使用上面的配置编译出来的系统,跑起来之后,进入sys目录可以看到相关的接口:
# pwd
/sys/power
# ls
state wake_lock wake_unlock wait_for_fb_sleep wait_for_fb_wake
# cat state
mem
如果配置了宏CONFIG_PM_DEBUG,那么在power目录下会多出一个pm_test文件,cat pm_test后,列出的测试选项有:[none] core processors platform devices freezer。关于这个test模式的使用,可以参考kernel文档:/kernel/documentation/power/Basic-pm-debugging.txt
这个文档我也有详细的阅读和分析。
二、sys/power和相关属性文件创建
系统bootup时候在sys下新建power和相关属性文件,相关源码位置:
kernel/kernel/power/main.c
static int __init pm_init(void)
{
int error = pm_start_workqueue();// CONFIG_PM_RUNTIME not set, so this fun is null
if (error)
return error;
power_kobj = kobject_create_and_add("power", NULL);
// 建立power对应的kobject和sysfs_dirent对象,同时建立联系:kobject.sd =
// &sysfs_dirent, sysfs_dirent.s_dir->kobj = &kobject。
if (!power_kobj)
return -ENOMEM;
return sysfs_create_group(power_kobj, &attr_group);
// 建立一组属性文件,可以在power下建立一个子目录来存放这些属性文件, // 不过需要在结构体attr_group中指定name,否则直接将这些属性文件放在 // power_kobj对应的目录下。
}
core_initcall(pm_init); // 看的出来,该函数是很早就被调用,initcall等级为1
static struct attribute_group attr_group = {
.attrs = g,
};
struct attribute_group {
const char *name;
mode_t (*is_visible)(struct kobject *,
struct attribute *, int);
struct attribute **attrs;
};
// 属性文件都是以最基本得属性结构struct attribute来建立的
static struct attribute * g[] = {
&state_attr.attr,
#ifdef CONFIG_PM_TRACE // not set
&pm_trace_attr.attr,
#endif
#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PM_DEBUG) // not set
&pm_test_attr.attr,
#endif
#ifdef CONFIG_USER_WAKELOCK // set
&wake_lock_attr.attr,
&wake_unlock_attr.attr,
#endif
NULL,
};
#ifdef CONFIG_PM_SLEEP
#ifdef CONFIG_PM_DEBUG
power_attr(pm_test);
#endif
#endif
power_attr(state);
#ifdef CONFIG_PM_TRACE
power_attr(pm_trace);
#endif
#ifdef CONFIG_USER_WAKELOCK
power_attr(wake_lock);
power_attr(wake_unlock);
#endif
#define power_attr(_name) \
static struct kobj_attribute _name##_attr = { \
.attr = { \
.name = __stringify(_name), \
.mode = 0644, \
}, \
.show = _name##_show, \
.store = _name##_store, \
}
// 而这些被封装过的属性结构体,将来会使用kobject的ktype.sysfs_ops->show(store)这两个通用函数通过container_of()宏找到实际的属性结构体中的show和store函数来调用。
关于更多sysfs的内容,请查看其他关于这部分内容的详细解析文档。
分享到:
相关推荐
综上所述,《Linux内核分析》一书从Linux内核的历史背景、开发模式、结构特征、硬件基础、中断机制以及进程管理等方面,提供了深入浅出的讲解,对于想要深入了解Linux内核工作原理的读者来说,是一本不可多得的技术...
特色平台前端linu移植项目可行性分析报告.pdf
1. **数字电路与模拟电路**:理解数字电路的基本原理,掌握模拟电路的工作机制。 2. **计算机组成原理**:熟悉计算机系统的各个组成部分及其工作原理。 3. **微机原理与接口技术**:掌握微型计算机的基本原理及接口...
总的来说,Linux内核的QoS实现机制是一个复杂而精细的体系,它通过灵活的策略和调度算法,确保了网络资源的高效利用和业务的优质体验。网络管理员可以根据具体需求,利用内核提供的接口和工具,定制适合的QoS策略,...
FTP 是一种用于在网络上进行文件传输的标准协议和服务。通过 FTP,用户可以在两台计算机之间上传或下载文件。它支持多种文件类型,并且可以实现基本的文件管理功能。 - **FTP Count**(文中提到的“FTPCount”)...
Linu系统安全配置标准V.pdf
1. **掌纹识别(Palm Recognition)**:这是一种生物特征识别技术,通过分析和比较个人的掌纹特征来进行身份验证。掌纹具有独特的纹理、线形结构和细节,使其成为生物识别系统中的一个可靠选项。在实现时,通常需要...
这份"Linu系统安全配置标准.pdf"文档提供了一系列针对Linux服务器的安全加固技术要求,以增强系统的稳定性和防止未授权访问。以下是根据文档内容提炼出的关键知识点: 1. **补丁管理**: - **系统补丁**:建议定期...
“支持qt和linu通信的qssh库”即是在这种背景下应运而生的一个开源项目。这个库的出现,极大地简化了Qt应用程序中集成SSH功能的复杂性,使得开发者可以在自己的应用程序中轻松实现安全的网络通信。qssh库提供了一...
### Linu系统配置DNS服务器知识点详解 #### 一、实验环境 - **操作系统**: CentOS 6.4 - **DNS服务器软件**: BIND (Berkeley Internet Name Domain) #### 二、DNS服务器配置概述 DNS服务器(Domain Name System)...
总的来说,这个"linu下cadence的patch包"是一个用于提升Linux环境下Cadence工具性能和稳定性的更新,对于那些依赖Cadence进行复杂电路设计的专业人士来说,定期检查和应用这些补丁是保持工作效率和数据安全的重要...
解决方案:通过分析系统负载和进程状态,找出 CPU 使用率过高的原因。如果是由于高负载应用导致的,可以优化应用代码或增加服务器资源。 * 问题 2:内存泄漏 解决方案:通过内存检测工具找出内存泄漏的原因,并进行...
通过阅读和分析源代码,学习者可以了解到如何设计和实现一个复杂的操作系统内核,同时也能提升解决问题的能力。此外,源代码分析也有助于理解操作系统与硬件之间的交互,以及如何通过内核模块扩展系统功能。 总之,...
"Windows客户端访问Linu服务器NFS" 本文档主要讲解Windows客户端如何访问Linux服务器的NFS(Network File System),以解决异构环境中的文件共享问题。文中介绍了跨平台通讯工具SFU(Services For Unix),它能够...
### Linu编程GCC手册知识点概览 #### 一、GCC简介 GCC(GNU Compiler Collection)是一套由GNU项目开发的编译器集合,它支持多种编程语言,包括但不限于C、C++、Objective-C、Fortran、Ada、Go等。本手册主要介绍了...
新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。 Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、...
myself linu x(2)myself linu x(2)myself linu x(2)myself linu x(2)myself linu x(2)
《Linux0.01内核分析与操作系统设计》介绍LINUX0.01的内核,0.01是拥有比较少的代码,对于初学者来说容易理解。(共4个文件,第1个文件扣分,其余不扣。4/4)
linu下安装websphere手册,一目了然
JSONPointer是JSON(JavaScript Object Notation)标准的一个扩展,用于在JSON文档中引用和操作特定的数据元素。在本文中,我们将深入探讨JSONPointer的概念、语法、使用方法以及它在Linux环境中的应用。JSONPointer...