当前位置:首页 > 电源 > 电源
[导读]1.概述 虽然 linux 可以在任何一台 386 以上的 PC 上运行,目前大多数人使用的都是新型的,带有各种外设的桌面PC或者笔记本电脑,这样,电源管理功能(PM)就逐渐变得越来

1.概述

虽然 linux 可以在任何一台 386 以上的 PC 上运行,目前大多数人使用的都是新型的,带有各种外设的桌面PC或者笔记本电脑,这样,电源管理功能(PM)就逐渐变得越来越重要。在笔记本电脑上电源管理可以节能,延长电池寿命,而在桌面PC上它可以降低幅射,降温,延长外设使用寿命。现在的操作系统大都内置了电源管理支持,例如 Windows 和 Linux。

2.PC机实现电源管理的方法

要实现电源管理,最重要的有两点:第一是需要设备本身支持节电功能,比如硬盘,可以通过指令暂时关闭;第二是需要操作系统支持电源管理,这样就可以在空闲一段时间之后调用驱动的电源管理功能关闭设备。

两种电源管理标准:APM和ACPI

传统的APM(Advanced Power Management)是一种基于bios的电源管理标准,目前的最新版本是1.2,它提供了CPU和设备电源管理的功能,但是由于这种电源管理方式主要是由bios实现,所以有些缺陷,比如对bios的过度依赖,新老bios之间的不兼容性,以及无法判断电源管理命令是由用户发起的还是由bios发起的,对某些新硬件如USB和1394的不支持性。

为了弥补APM的缺陷,新的电源管理ACPI应运而生,这就是ACPI(Advanced Configuration and Power InteRFace),它主要是将电源管理的主要执行者由bios转换成为操作系统,这样可以提供更大的灵活性以及可扩展性。

目前的PC机主板一般同时支持APM和ACPI两种标准。

3.linux对电源管理的支持

内核模块

针对APM和ACPI两种不同的标准,linux内核提供了两个不同的模块来实现电源管理功能,这就是apm和acpi。需要注意,apm和acpi是互相冲突的两个模块,用户在同一时间内只能加载其中之一,如果当他们在加载的时候发现二者之一已经加载,就会自动退出。

在官方发布的内核中APM是较为成熟的电源管理方式,可以完成在Windows下ACPI所能完成的大部分功能。由于官方内核中ACPI的功能比较有限,目前还处于开发版状态。所以当前的大多数distribution,如红帽子默认就使用了apm作为电源管理方式。但是值得注意的是linux中的ACPI实际上是由一个单独的项目小组模块进行维护的,当前内核ACPI的版本实际上已经远远落后于最新的版本。由于linux稳定版中对任何新特性的加入都非常谨慎小心,所以我们也许只能等到2.6.x版本的linux诞生后才能看到ACPI的稳定全功能版了。不过我们也可以自己对内核打最新的ACPI补丁来获得这些功能。

下面对电源管理的介绍以APM为主。

用户态Daemon

为了让linux内核中的电源管理功能够更好的被利用,我们还需要用户态daemon程序的配合。针对APM和ACPI,分别有apmd和acpid两个不同软件。他们实现的功能比较类似,都是允许用户预先定义某些策略,然后跟踪电源状态,执行特定的操作。在apmd软件包中还有一个工具apm,用户可以用它使机器主动进入standby和suspend状态,还可以查询bios的apm版本号。在使用acpi时直接对proc文件系统进行操作即可完成同样的功能。

4.linux下驱动的电源管理机制

在linux下不必为驱动分别编写与APM和ACPI相对应的代码,linux与Windows类似,为驱动提供了统一的电源管理接口。驱动只要实现了这些接口,就可以实现电源管理的功能。操作系统在它认为合适的时候就会通知驱动完成这些操作。

实现设备电源管理接口主要需要实现以下5点:

1)使用pm_register对设备的每个实例(instance)进行注册;

2)在对硬件进行操作之前调用pm_access(这样会保证设备已被唤醒并且处于ready状态);

3)用户自己的pm_callback函数在系统进入suspend状态(ACPI D1-D3),或者从suspend状态恢复(ACPI D0)的时候会被调用;

4)当设备不在被使用的时候调用pm_dev_idle函数,这个操作是可选的,可以增强设备idle状态的监测能力;

5)当被unload的时候,使用pm_unregister来取消设备的注册。

5.对APM进行编程

下面介绍在实模式中和在linux下使用APM功能的编程方法:


由于APM是由bios提供的,我们可以直接在实模式(如DOS下)调用int 15软中断来进行电源管理操作。

在实模式下APM的standby、suspend和Poweroff功能分别可以通过下面的汇编语言实现:

standby:

mov ax, 5307H

mov bx, 1

mov cx, 1

int 15H

suspend:

改成 mov cx,2

poweroff:

改成 mov cx,3

需要注意的一件事是在linux内核中没有使用和实模式的一样的方法来调用int 15H中断,而是直接调用了bios的保护模式接口。所以我们如果修改了bios中的apm相关代码并且没有处理好保护模式接口的问题,可以出现这样的情况:在实模式DOS下使用apm功能一切正常,但是在linux下调用apm功能发生内核一般保护性错误。

在linux下我们可以通过对apm_bios设备的操作来完成同样的功能。

下面的代码可以实现APM的suspend功能,等价于apm -s

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <asm/fcntl.h>

#include <linux/types.h>

#include <sys/types.h>

#include "apm.h"

int main()

{

int fd, res;

fd = open("/dev/apm_bios", O_RDWR);

if (fd < 0) {

printf("open /dev/apm_bios error!n");

exit(-1);

}

sync();

res = ioctl(fd, APM_IOC_SUSPEND, NULL);

if (res != 0) {

printf("ioctl error!n");

close(fd);

exit(-1);

}

close(fd);

return 0;

}

如果我们把上面程序中的SUSPEND改成STANDBY,我们就同样实现了apm -S的功能。

在linux下POWEROFF操作有其独特的流程,最后根据内核中apm或者ACPI的存在情况来执行相应不同的流程来关闭电源。请参见linux内核源码,我写的《linux关机重启流程分析》中也有一定的介绍。

6.常见问题(FAQ)

1)我的系统不能被suspend,这是怎么回事呢?

系统在suspend之前会向所有的驱动发消息,如果这个时候某个傲慢的驱动返回了一个-EBUSY,那么这次suspend的企图就被这个驱动否决了,你只有过一会再试,如果这个驱动总是否决(真是蛮横,不过它也许有自己的苦衷也说不定),你就永远都无法suspend了。

2)我按下系统的PowerOFF开关,在ATX的主板上,系统就会自动关机了,这个处理流程是什么样子的呢?

在内核APM模块中建立了一个核心态线程不停的监测系统状态,用户的关机动作在这里被截获后处理。详细的流程可以参见本人的《linux关机重启流程分析》。

3)linux中电源管理的文档在哪里?

在linux/Documentation目录下的pm.txt中详细定义了linux驱动电源管理接口实现方式,并且有详细的例子,apm和ACPI的实现流程需要参见linux源码的实现。

7.总结

linux中的电源管理是发展中的代码。从目前的趋势来看ACPI终将取代APM。现在使用APM则是较为成熟和稳妥的方案。我们如果现在编写驱动应该严格遵守文档中的pm.txt所规定的接口,这样可以使我们的驱动有较强电源管理的适应性和稳定性。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

中国上海,2025 年9月9日 — Nexperia 每年增加 800 多种新产品类型。2024 年,仅模拟和电源管理应用便推出了超过 70 种新部件。为支持 Nexperia 产品扩展,e络盟紧跟其不断扩大的产品组合,...

关键字: 电源管理 SiC 二极管

随着汽车电子设备日益复杂,车企对体积紧凑、高能效、可靠的解决方案的需求不断增长,多输出功率开关在集成度、成本效益、故障诊断和能效方面优势愈发明显。现代汽车工业越来越依赖众多的低功率电子模块,例如,传感器、LED和继电器。...

关键字: 功率开关 电源管理 传感器

CPU亲和度通过限制进程或线程可以运行的CPU核心集合,使得它们只能在指定的CPU核心上执行。这可以减少CPU缓存的失效次数,提高缓存命中率,从而提升系统性能。

关键字: Linux 嵌入式

与计算和仿真工具相比,电源架构的设计工具并未得到广泛使用。然而,这些工具在电路电源系统的开发过程中起到至关重要的作用。作为电源开发流程的初始环节,这些工具为创建出色的电源架构奠定了基础。

关键字: 电源架构 电路电源系统 电源管理

在当今的电子设备领域,随着技术的飞速发展,设备对于电源管理的要求越来越高。从智能手机、平板电脑等便携式设备,到复杂的通信基站、工业控制系统,电源的稳定、高效供应都是保障设备正常运行的关键。低压 LDO(Low Dropo...

关键字: 电源管理 稳压器 低压差

在Linux系统性能优化中,内存管理与网络连接处理是两大核心领域。vm.swappiness与net.core.somaxconn作为关键内核参数,直接影响系统在高负载场景下的稳定性与响应速度。本文通过实战案例解析这两个...

关键字: Linux 内存管理

新闻摘要 在OCP亚太峰会上,伟创力推出了专为NVIDIA GB300 NVL72平台设计的新型电源架,该平台配备72颗NVIDIA Blackwell Ultra...

关键字: 伟创力 英伟达 电源管理 AI

对于LLM,我使用b谷歌Gemini的免费层,所以唯一的成本是n8n托管。在使用了n8n Cloud的免费积分后,我决定将其托管在Railway上(5美元/月)。然而,由于n8n是开源的,您可以在自己的服务器上托管它,而...

关键字: 人工智能 n8n Linux

在Linux系统管理中,权限控制是安全运维的核心。本文通过解析/etc/sudoers文件配置与组策略的深度应用,结合某金融企业生产环境案例(成功拦截98.7%的非法提权尝试),揭示精细化权限管理的关键技术点,包括命令别...

关键字: Linux 用户权限 sudoers文件

在现代电子设备中,电源管理系统的性能对于设备的整体表现至关重要。低压差线性稳压器(Low Dropout Regulator,LDO)作为电源管理的关键组件,在确保稳定输出电压的同时,以其低压差、低功耗的特性,满足了众多...

关键字: 电源管理 低压差 线性稳压器
关闭