新闻中心

linux电源管理

作者: 时间:2008-07-23 来源:网络 收藏

本文引用地址://m.amcfsurvey.com/article/258650.htm5.对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所规定的接口,这样可以使我们的驱动有较强电源管理的适应性和稳定性。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

上一页 1 2 下一页

关键词:Linux电源管理

评论


相关推荐

技术专区

关闭