在手持設備設計中,電源管理歷來為重要的研究課題之一。我們日常所說的省電就屬於電源管理的范 疇,這也是我們最關心的一個部分。通過掛起不必要的設備、降低CPU的頻率或者其它方法,可以減少能 量的消耗,達到省電的目的。電源管理實際上是一個系統工程,從應用程序到內核框架,再到設備驅動和 硬件設備,都要參與進來,才能達到電源管理的最優化。本文介紹一下acpid的工作原理。
ACPI是Advanced Configuration and Power Interface縮寫,acpid中的d則代表daemon。Acpid是一個 用戶空間的服務進程,它充當linux內核與應用程序之間通信的接口,負責將kernel中的電源管理事件轉 發給應用程序。
acpid與內核的通信方式:acpid用poll函數掛在/proc/acpi/event文件上。內核在 drivers/acpi/event.c中實現了該文件的接口,一旦總線事件列表(acpi_bus_event_list)上有電源管理 事件發生,內核就會喚醒掛在 /proc/acpi/event上的acpid,acpid再從/proc/acpi/event中讀取相應的 事件。
acpid與應用程序的通信方式有兩種,其一是通過本地socket,其文件名為/var/run/acpid.socket, 應用程序只要連接到這個socket上,不用發送任何命令就可以接收到acpid轉發的電源管理事件。
其二是通過配置文件。在acpid收到來自內核的電源管理事件時,根據配置文件中的規則執行指定的命 令。配置文件在/etc/acpi/events/目錄下,下面是一個示例:
event=button/power.*
action=/sbin/shutdown -h now
事件的格式為:device_class bus_id type data。device_class和bus_id是字符串,type和data是十 六制整數。在配置文件中可以使用通配符,來匹配指定的事件。