Linux acpi電源管理詳解
雖然Linux可以在任何一臺386以上的PC上運行,目前大多數(shù)人使用的都是新型的,帶有各種外設(shè)的桌面PC或者筆記本電腦,這樣,電源管理功能(PM)就逐漸變得越來越重要。
1.Linux acpi電源管理概述
在筆記本電腦上電源管理可以節(jié)能,延長電池壽命,而在桌面PC上它可以降低幅射,降溫,延長外設(shè)使用壽命。現(xiàn)在的操作系統(tǒng)大都內(nèi)置了電源管理支持,例如Windows和Linux。
2.PC機實現(xiàn)Linux acpi電源管理的方法
兩種電源管理標準:APM和ACPI
傳統(tǒng)的APM(AdvancedPowerManagement)是一種基于bios的電源管理標準,目前的***版本是1.2,它提供了CPU和設(shè)備電源管理的功能,但是由于這種電源管理方式主要是由bios實現(xiàn),所以有些缺陷,比如對bios的過度依賴,新老bios之間的不兼容性,以及無法判斷電源管理命令是由用戶發(fā)起的還是由bios發(fā)起的,對某些新硬件如USB和1394的不支持性。為了彌補APM的缺陷,新的電源管理ACPI應(yīng)運而生,這就是ACPI(AdvancedConfigurationandPowerInterface),它主要是將電源管理的主要執(zhí)行者由bios轉(zhuǎn)換成為操作系統(tǒng),這樣可以提供更大的靈活性以及可擴展性。目前的PC機主板一般同時支持APM和ACPI兩種標準。
3.Linux對電源管理的支持
內(nèi)核模塊
針對APM和ACPI兩種不同的標準,Linux內(nèi)核提供了兩個不同的模塊來實現(xiàn)電源管理功能,這就是apm和acpi。需要注意,apm和acpi是互相沖突的兩個模塊,用戶在同一時間內(nèi)只能加載其中之一,如果當他們在加載的時候發(fā)現(xiàn)二者之一已經(jīng)加載,就會自動退出。
在官方發(fā)布的內(nèi)核中APM是較為成熟的電源管理方式,可以完成在Windows下ACPI所能完成的大部分功能。由于官方內(nèi)核中ACPI的功能比較有限,目前還處于開發(fā)版狀態(tài)。所以當前的大多數(shù)distribution,如紅帽子默認就使用了apm作為電源管理方式。但是值得注意的是Linux中的ACPI實際上是由一個單獨的項目小組模塊進行維護的,當前內(nèi)核ACPI的版本實際上已經(jīng)遠遠落后于***的版本。由于Linux穩(wěn)定版中對任何新特性的加入都非常謹慎小心,所以我們也許只能等到2.6.x版本的Linux誕生后才能看到ACPI的穩(wěn)定全功能版了。不過我們也可以自己對內(nèi)核打***的ACPI補丁來獲得這些功能。
這里是ACPI的主頁:
http://sf.net/projects/acpi/
下面對電源管理的介紹以APM為主。
用戶態(tài)Daemon
為了讓Linux內(nèi)核中的電源管理功能夠更好的被利用,我們還需要用戶態(tài)daemon程序的配合。針對APM和ACPI,分別有apmd和acpid兩個不同軟件。他們實現(xiàn)的功能比較類似,都是允許用戶預先定義某些策略,然后跟蹤電源狀態(tài),執(zhí)行特定的操作。在apmd軟件包中還有一個工具apm,用戶可以用它使機器主動進入standby和suspend狀態(tài),還可以查詢bios的apm版本號。在使用acpi時直接對proc文件系統(tǒng)進行操作即可完成同樣的功能。
4.Linux下驅(qū)動的Linux acpi電源管理機制
在Linux下不必為驅(qū)動分別編寫與APM和ACPI相對應(yīng)的代碼,Linux與Windows類似,為驅(qū)動提供了統(tǒng)一的電源管理接口。驅(qū)動只要實現(xiàn)了這些接口,就可以實現(xiàn)電源管理的功能。操作系統(tǒng)在它認為合適的時候就會通知驅(qū)動完成這些操作。
實現(xiàn)設(shè)備電源管理接口主要需要實現(xiàn)以下5點:
1).使用pm_register對設(shè)備的每個實例(instance)進行注冊;
2).在對硬件進行操作之前調(diào)用pm_access(這樣會保證設(shè)備已被喚醒并且處于ready狀態(tài));
3).用戶自己的pm_callback函數(shù)在系統(tǒng)進入suspend狀態(tài)(ACPID1-D3),或者從suspend狀態(tài)恢復(ACPID0)的時候會被調(diào)用;
4).當設(shè)備不在被使用的時候調(diào)用pm_dev_idle函數(shù),這個操作是可選的,可以增強設(shè)備idle狀態(tài)的監(jiān)測能力;
5).當被unload的時候,使用pm_unregister來取消設(shè)備的注冊。
5.Linux acpi電源管理對APM進行編程
下面介紹在實模式中和在Linux下使用APM功能的編程方法:
由于APM是由bios提供的,我們可以直接在實模式(如DOS下)調(diào)用int15軟中斷來進行電源管理操作。
在實模式下APM的standby、suspend和poweroff功能分別可以通過下面的匯編語言實現(xiàn):
- standby:
- movax,5307H
- movbx,1
- movcx,1
- int15H
- suspend:
- 改成movcx,2
- poweroff:
- 改成movcx,3
需要注意的一件事是在Linux內(nèi)核中沒有使用和實模式的一樣的方法來調(diào)用int15H中斷,而是直接調(diào)用了bios的保護模式接口。所以我們?nèi)绻薷牧薭ios中的apm相關(guān)代碼并且沒有處理好保護模式接口的問題,可以出現(xiàn)這樣的情況:在實模式DOS下使用apm功能一切正常,但是在Linux下調(diào)用apm功能發(fā)生內(nèi)核一般保護性錯誤。在Linux下我們可以通過對apm_bios設(shè)備的操作來完成同樣的功能。下面的代碼可以實現(xiàn)APM的suspend功能,等價于apm-s
- #include
- #include
- #include
- #include
- #include
- #include
- #include"apm.h"
- intmain()
- {
- intfd,res;
- fd=open("/dev/apm_bios",O_RDWR);
- if(fd
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u/17928/showart_114897.html
【編輯推薦】
- 華碩補齊Eee PC的ACPI源代碼回應(yīng)指責
- Linux acpi off簡介
- Linux acpi off學習的必要
- Linux acpi off關(guān)于Suspend to Disk 問題分析
- Linux acpi off報告ACPI bug處理方法