2009年5月18日 星期一

Linux電源管理研究筆記-acpid工作原理簡述

Linux電源管理研究筆記-acpid工作原理述

[轉貼] acpid工作原理

在手持設備設計中,電源管理歷來為重要的研究課題之一。我們日常所說的省電就屬於電源管理的範疇,這也是我們最關心的一個部分。通過掛起不必要的設備、降低CPU的頻率或者其他方法,可以減少能量的消耗,達到省電的目的。電源管理實際上是一個系統工程,從應用程式到內核框架,再到設備驅動和硬體設備,都要參與進來,才能達到電源管理的最優化。本文介紹一下acpid的工作原理。

ACPI是Advanced Configuration and Power Interface縮寫,acpid中的d則代表daemon。Acpid是一個用戶空間的服務進程,它充當linux kernel與應用程式之間通信的介面,負責將kernel中的電源管理事件轉發給應用程式。

   acpid與kernel的通信方式:acpid用poll函數掛在/proc/acpi/event檔上。內核在drivers/acpi/event.c 中實現了該檔的介面,一旦匯流排事件列表(acpi_bus_event_list)上有電源管理事件發生,kernel就會喚醒掛在 /proc/acpi/event上的acpid,acpid再從/proc/acpi/event中讀取相應的事件。

  acpid與應用程式的通信方式有兩種,其一是通過本地socket,其檔案名為/var/run/acpid.socket,應用程式只要連接到這個socket上,不用發送任何命令就可以接收到acpid轉發的電源管理事件。

  其二是通過配置檔。在acpid收到來自kernel的電源管理事件時,根據配置檔中的規則執行指定的命令。配置檔在/etc/acpi/events/目錄下,下面是一個示例:
(要監聽到/var/run/acpid.socket為前提下,下面的方能work)

  event=button/power.*
  action=/sbin/shutdown -h now

  事件的格式為:device_class bus_id type data。device_class和bus_id是字串,type和data是十六制整數。在配置檔中可以使用通配符,來匹配指定的事件。

[實作]:
(1)
# /etc/init.d/udev start
# /usr/sbin/acpid -c /etc/acpi/events -s /var/run/acpid.socket
# /usr/sbin/hald
# ps ax | grep acpi

/usr/sbin/acpid -c /etc/acpi/events -s /var/run/acpid.socket (@@?)
hald-addon-acpi: listening on acpid socket /var/run/acpid.socket
要看到這兩個才算開啟。

(2)
/var/run/acpid.socket 如果沒有此檔,
啟動 /etc/init.d/acpid start 即可

此時再 /usr/sbin/acpid -c /etc/acpi/events -s /var/run/acpid.socket
可能會出現
acpid: can't open /proc/acpi/event: Device or resource busy
就先不要理它吧@@
只要有下面的2個東東,acpi其實就能work了,前提是kernel有編入acpi

# ps ax | grep acpi
/usr/sbin/acpid
hald-addon-acpi: listening on acpid socket /var/run/acpid.socket

ref :
acpid工作原理

沒有留言:

張貼留言