|
发表于 2004-12-16 11:52:43
|
显示全部楼层
2.6 内核电源管理方面同时支持高级电源管理 (Advanced Power Management, APM)、高级配置和电源接口(Advanced Configuration and Power Interface,ACPI) 两种电源管理方式。高级电源管理(APM)由支持在计算机中对可管理电源硬件进行电源管理的一个或多个软件层组成。 APM定义的是独立于硬件的软件接口,这个独立是指硬件特定的电源管理软件和操作系统电源管理策略驱动程序之间的独立。它不注重硬件的细节,使得高一级软件无须了解任何硬件接口,便可以使用APM。而高级配置和电源接口(ACPI)是开放式工业规范,它为主板定义了灵活、可扩充的硬件接口。软件设计人员使用此规范将电源管理功能集成在整个计算机系统中,包括硬件、操作系统和程序。
基本上就目前的Linux 核心而言,皆已支援APM 及 ACPI 這兩種標準的電源管理系統,但兩種電源管理系統只能同時使用一種,如果你使用的核心比 2.4.10 新且會重新編譯kernel及更新source code,那你將會享受到ACPI功能的好處。但如果你熟悉舊式的方法或使用較老舊的系統,那你大可選擇APM 方式的電源管理。當然如果遇到有問題或支援不佳的電源管理系統時亦可關閉所有的電源管理系統改用其他工具或方法節省電源,因為設計不良或沒有完全支援標準的電源管理系統將會造成系統毀壞或資料流失,在安裝系統前必須先注意小心。
APM 電源管理系統雖為舊式的方法但已在Linux系統上使用一段時間其功能和應用程式較齊全且完善,KDE 圖形介面也包含了它的管理程式,較ACPI穩定許多。其最簡單的功能就是顯示目前供電的方式及電池的狀態容量,使用者可設定進入省電模式的等待時間及預設需執行的動作,還可將系統置於Suspend 或 Standby的狀態。若要使用它就必須在kernel中將它啟動,如果系統正確的啟動將可找到檔案 /proc/apm ,其中記錄了APM 的版次及相關內容,或使用 dmesg | grep -i apm 查看kernel是否有正確的啟動它。
APM daemon 主要可分為3個程式﹔
apmd 掌控電源管理的主要工作
apm 命令列工具程式用於顯示目前的電池狀態及將電腦處於Suspend的狀態
xapm 使用於X-window 的簡易型電池計量程式
ACPI 電源管理系統的功能較強但在Linux的應用上還在發展當中,所產生的問題也非常多,雖然ACPI的規格已發展到版本2.0b,但硬體系統廠商雖支援ACPI但也同時支援舊的APM/PNPBIOS規格因此造成相當多的問題,但可以慶幸的是由於主導廠商之一的微軟夾著windows 系統的優勢強全力支援ACPI,造成廠商大量製造可經由微軟WHQL測試通過含ACPI功能的電腦,使含ACPI功能的硬體大量普及,但不幸的是微軟的ACPI功能測試是很簡短的並無法保證完全相容於ACPI的規格,因此若使用ACPI支援不佳的電腦安裝Linux系統,將會造成有一些ACPI的問題造成系統當機或更本無法安裝,但這一些問題在window上並不會發生。會有這一篇文章是因為本中心TNDC最近針對相當多的系統、主機板進行相容的硬體測試發現經由微軟WHQL測試通過的系統安裝Linux時會無法安裝或重新開機的現象,必須將ACPI的功能關閉才能正常運作,有的雖然可以支援但其功能不正常無法讀取硬體資訊供作業系統判讀等問題,因此使用Linux系統的ACPI功能必須小心挑選電腦硬體,否則將無法保證其功能可完全發揮。為了避免發生這個問題 Linux ACPI driver有維護一個名為"bad BIOS"的黑名單,紀錄已知無法使用ACPI功能的BIOS資訊,如果你的電腦在此當中將無法啟用ACPI的功能。
許多製造商為了讓使用者能順利安裝及執行Linux 於所生產的電腦系統上,便以幾家主要的Linux套件商的系統為標地,用預定的核心作為系統功能及相容性的測試標準,便造成如果製造商要完全支援ACPI於Linux執行就必須等到主要的Linux套件商將ACPI功能加入kernel中,但目前的情況是Linux套件希望自己所出版的OS版本可以在大多數的硬體系統上執行,而將相容性有問題且支援不佳的ACPI於kernel中移除以減少安裝及使用上的問題擴大其佔有率。就如同目前市場上的例子,如果使用者安裝新版 RedHat 9.0 應該不會發現有ACPI的問題,因為如上所敘ACPI與硬體有相容性的問題且基本上RedHat還是以 server 的市場為利基點省電裝置對其來說功能不大,故將ACPI於kernel中移除所以使用RedHat 9.0 Linux基本上並沒有ACPI的功能。
反觀United Linux Group 就將ACPI功能包含於kernel中,使用者可以很方便的使用ACPI管理電源,以SuSE Linux 為例其產品有慢慢走向WORKSTATION的趨勢,因此就必須考慮使用者安裝於筆記型電腦的操作行為和使用習慣,尤其在有限電源上的管理便成為非常重要,SuSE 8.1 號稱是第一個完全支援ACPI 2.0功能的版本,但在安裝及使用系統時卻有可能發生一些議顯不到的問題,我們實際的經驗於安裝時就無法找到儲存設備或安裝完畢開機時無法載入驅動程式及找不到PCI設備IRQ管理等問題,這一些問題可以於開機時使用ACPI的參數將其功能完全取消,以下為SuSE 8.1 於開機時對ACPI可採用的參數 :
acpi=off
- 這個參數將使ACPI的功能完全停止,如果你的系統並不支援ACPI 或發生ACPI相關的問題。
acpi=oldboot
- 取消絕大部分ACPI 的功能,只保留於開機時需ACPI 功能的設備使用。
pci=acpi
- 系統的IRQ是由ACPI (PIC) 只能提供16個IRQ或是由APIC來控制,APIC功能將可使系統不受傳統的16個IRQ的限制可提供24個IRQ,這個參數將使PCI 介面採用ACPI (PIC)的方式取得IRQ。
雖然SuSE 8.1 所包含的ACPI功能在使用上會遇到一些問題,但很慶幸終於有套件商願意將此一功能加入,對於知道且願意使用的用戶方便許多,這版本還沒有發展到支援所有ACPI的功能且沒有像APM一樣有完整的KDE圖形化工具可以使用,只提供了ACPI相關環境及參數的圖形瀏覽工具如 acpiw (ACPI watch: GUI and CLI for watching /proc/acpi) AKPI (provides a simple KDE GUI frontend for ACPI) ,雖然相關應用軟體還在持續發展當中但仍可將CPU 設定到多種不同的休眠狀態實際達到省電的效果,此外還可以支援S3 (suspend to RAM)模式。上個月SuSE 8.2 已經於美國公開發行了,這次針對ACPI的問題作了修補的動作及修改核心參數,新增了pci=noacpi 和 acpi=force 兩個參數讓系統的相容性更好,更方便解決ACPI的問題。
acpi=force
- 如果系統BIOS是在2000以前的舊設備此參數將強迫ACPI 功能啟動,這將會覆蓋參數acpi=off 。
pci=noacpi
- 這個參數將關閉PCI IRQ routing 在新的ACPI 系統上。
雖然ACPI在Linux的應用上有許多問題,但由於Intel 的全力的支持Linux在此技術上的應用,Linux開發者已在2.5.X kernel中正式加入ACPI的功能,希望新版本的問世能將問題減少且能有多一點的應用程式及介面的支援。
Linux 支援ACPI管理電源可分為三大部分,一. 系統核心對ACPI driver的支援 二. " acpid " 程式套件,包含了監督處理系統所收到ACPI事件的常駐程式和acpictl 為使用者於client 端監督控自程式 三. "pmtools" 程式套件,是一套開發者對ACPI功能分析及除錯的工具,目前這一些程式都還在發展當中,有一些甚至有使用上的問題,SuSE 8.2 就將用途不大的acpictl 及有問題的pmtools移除,當然這一些工具仍然可由ACPI 的相關網站取得如http://developer.intel.com/technology/iapc/acpi/http://sourceforge.net/projects/acpi 和 http://acpi.sourceforge.net/
安裝設定ACPI
以SuSE 8.2為例一般安裝完畢就已經有包含部分ACPI的功能,可以檢查是否有 /proc/apci 目錄,如果有表示kernel中有開啟ACPI的功能,使用者可依電腦硬體支援的情況將需要的功能加入kernel中重新編譯新的kernel。
# cd /usr/src/linux/
# make menuconfig
選擇 General Setup
選擇ACPI Support
選擇所需要的功能加入
儲存後重新Build kernel,重新開機載入新kernel
你會看到如下的檔案和目錄
/proc/apci/
ac_adapter alarm battery button debug_layer debug_level dsdt embedded_controller event fadt fan info power_resource processor sleep thermal_zone
如果編譯kernel有啟用 sleep 模式可以發現檔案/proc/apci/sleep,其中記錄著硬體系統可支援的模式,如 cat /proc/apci/sleep
S0 S1 S3 S4 S5
執行 cat -v /proc/acpi/fadt 將顯現出 "FACP"table的內容,前幾個bytes將可看到BIOS的廠商名稱,假如你有看到表示ACPI driver已經能由BIOS當中讀取適當的ACPI table,亦表示ACPI可以被正常執行。
ACPI package 中包含acpid 和 acpictl 程式。 acpid 是一 daemon 程式,主要用來監督ACPI 的事件在依事件的內容作不同的處理,該事件紀錄於 /proc/acpi/event ,可接受的參數如下:
acpid -d or --debug 在前景執行daemon 程式
-t or --trace 開啟一個除錯追蹤模式
-v or --version 顯示出acpid 的版本訊息
acpid就算沒有載入來處理ACPI 的事件,系統會因核心的支援而保有某些ACPI的功能如processor thermal support。
acpictl 是一個使用者與acpid溝通的工具程式,SuSE 8.2在ACPI package 中並沒有將acpictl 程式放入,使用者如果有需要必須自行下載完整的ACPI tarball file,重新安裝才能使用,但我認為其對使用者用處不大。可接受的參數如下:
acpictl -p or --pid 顯示出acpid 的pid number
-b or --battery 顯示出電池的相關資訊
-i or -intermediary 作為acpid與其他程式的中介者
Pmtools是程式開發者所使用的工具,可直接控制系統轉換為特定的ACPI模式,用於測試ACPI的功能及解決問題,該程式已被包含在SuSE 8.2中,更新且完整的資料可由Intel網站取得 http://developer.intel.com/technology/iapc/acpi/
安裝Pmtools 請執行:
#tar zxvf pmtools-xxx.tar.gz
上述的 xxx 是pmtools package 的版本
在相同的目錄下重新build package,執行,
#make
由於pmtools package 並沒有製作成為可自行安裝的方式,所以你必須自行手動的將它們複製到適當的地方:
cp acpidisasm/acpidisasm /usr/local/bin
cp acpidmp/acpidmp acpdmp/acpitbl acpidmp/acpxtract /usr/local/bin
cp pmtest/pmtest /usr/local/bin
Pmtools package 並沒有提供任何文件可供參考,以下是一些該如何使用這一些工具的簡短說明:
Acpidmp 是用來讀取ACPI BIOS 中的Table值,將其內容匯出到螢幕上,這些Table 包含了 FACP , DSDT , RSDT 如果想明瞭這些Table的內容及涵義,就必須去查詢ACPI 2.0b 的規格書,使用Acpidmp 若沒有提供Table的名稱,預設將顯示RSDP Table 的內容。Acpidmp 所顯示的內容並不適合閱讀,必須搭配acpidisam 程式加以轉換,如下
#acpidmp DSDT | acpidisam
輸出如下
00000000: Scope _PR_ (\_PR_)
00000006: Processor CPU0 (\_PR_.CPU0)
0000000d: 0x00
0000000e: 0x00008010
00000012: 0x06
00000013: Name _S0_ (\_S0_)
00000018: Package
0000001a: 0x04
0000001b: 0x05
0000001d: 0x05
0000001f: 0x00
00000021: 0x00
00000023: Name _S1_ (\_S1_)
00000028: Package
0000002a: 0x04
0000002b: 0x04
0000002d: 0x04
0000002f: 0x00
00000031: 0x00
00000033: Name _S3_ (\_S3_)
00000038: Package
0000003a: 0x04 …………………………………………………..
利用acpitbl 程式可以由 /proc/acpi 內查看系統所取得的Table 內容
#acpitbl /proc/acpi/dsdt
produces
Signature: DSDT
Length: 11841
Revision: 0x01
Checksum: 0x3c
OEMID: SONY
OEM Table ID: K1
OEM Revision: 0x20000203
Creator ID: MSFT
Creator Revision: 0x01000007
或是FACP 的內容值
#acpitbl /proc/acpi/fadt
OEM Table ID: K1
2
0x32
Signature: FACP
Length: 116
Revision: 0x01
Checksum: 0x12
OEMID: SONY
OEM Revision: 0x20000203
Creator ID: PTL
Creator Revision: 0x000f4240
FIRMWARE_CTRL: 0x03ffffc0
DSDT: 0x03ffc924
INT_MODEL: 0x00
SCI_INT: 9
SMI_CMD: 0x000000b2
ACPI_ENABLE: 0xf0
ACPI_DISABLE: 0xf1
S4BIOS_REQ: 0xf2
PM1a_EVT_BLK: 0x00008000
PM1b_EVT_BLK: 0x00000000
PM1a_CNT_BLK: 0x00008042
PM1b_CNT_BLK: 0x00000000
PM2_CNT_BLK: 0x00000022
PM_TMR_BLK: 0x00008008
GPE0_BLK: 0x0000800c
GPE1_BLK: 0x00000000
PM1_EVT_LEN: 4
PM1_CNT_LEN:
PM2_CNT_LEN: 1
PM_TM_LEN: 4
GPE0_BLK_LEN: 4
GPE1_BLK_LEN: 0
GPE1_BASE: 0
P_LVL2_LAT: 10
P_LVL3_LAT: 4097
FLUSH_SIZE: 0
FLUSH_STRIDE: 0
DUTY_OFFSET: 1
DUTY_WIDTH: 3
DAY_ALRM: 0x0d
MON_ALRM: 0x00
CENTURY:
Flags: 0x00000000
也可用下列方法取得
#acpidmp FACP | acpitbl
Pmtest 工具是一個專門給撰寫設備驅動程式的軟體工程師使用的,可以將不同的ACPI休眠狀態植入各設備中來測試ACPI各狀態的功能,Pmtest是一個kernel module所以它必須被建立於 /proc 當中,但該程式尚有若干bug未解,因此在應用上還有一些問題。Pmtest 工具說明如下
放置於此 /proc/driver/pmtest/devices 中的設備是已經在電源管理系統註冊且可被控管的設備,設備檔案的內容含有一 0-3 的數值分別代表著D0-D3 的狀態,如果直接執行則會列出所有已知設備的名稱及目前的狀態
# ./pmtools/pmtest
VGA (D0)PCI 0x0 (D0)CPU (D0)PCI 0x62 (D0)
以上所列的設備都是系統所能辨識的ACPI 設備,它們的狀態都是D0也就是說是處於正常的活動狀態,當然我們可以利用此工具將它的活動狀態改為D1, D2 減少電源消耗,或是D3完全關閉電源供應。
用法: pmtest [OPTION] [TYPE] [ID]
OPTION 的選項如下:
-l 列出設備活動狀態(default)
-d0 恢復正常設備活動狀態(ACPI D0)
-d1, -d2, -d3 休眠狀態 (ACPI D1-D3)
TYPE的選項如下:
PCI USB SCSI ISA system unknown …
ID的選項如下:
Keyboard serial irda floppy vga pcmcia 或由/usr/include/linux/pm.h 內指定的設備
Examples:
#pmtest -d1 VGA
#pmtest -l
VGA (D1)
PCI 0x0 (D0)
CPU(D0)
PCI 0x62 (D0)
改變VGA 的活動狀態至省電模式D1 (blank),改變後重新執行pmtest 查看目前的活動狀態,就可以發現VGA 的活動狀態已轉換到D1省電模式。
pmtest -l PCI 列出所有已註冊的PCI設備活動狀態
pmtest -d0 VGA 恢復VGA(unblank)正常設備活動狀態
pmtest -d3 PCI 0x62 讓 PCI 設備處於休眠狀態D3完全關閉其電源供應
其他問題
Suspend-to-Disk 在Window 上使用問題不大但在Linux上的問題可就很難處理,主要的困難點在於Suspend-to-Disk無法正確地在Linux ACPI 上執行,且許多筆記型電腦廠商使用許多方法來產生"suspend-to-disk" 或 "hibernate" 的檔案,缺乏統一的標準。如果想要達到在Linux上使用Suspend-to-Disk的功能,建議向廠商索取Suspend-to-Disk (s2d)的工具程式執行,例如Dell Inspiron 8000 多筆記型電腦使用 Dell 的 phdisk utility,當然其中問題還很多像是partition的規劃與放置及格式化,都必須向製造廠商詳細詢問及使用特定工具。
如果你的電腦不支援 ACPI APM或是電源管理系統出了問題,在Linux 上還有很多工具可以達到省電的功能。hparm 是 Linux上的shell utility 可以用來改善IDE 硬碟的執行效率及電源管理,此工具可由系統中找到若沒有找到可由http://freshmeat.net/redir/hdparm/4062/url_homepage/hardware 下載,執行
# hdparm -B128 -c1 -d1 -m16 -S60 -u1 -K1 -k1 -W1 /dev/had
將會得到較好的執行效率及節省電源,但必須注意的是不同的系統的配備亦不同必須對各項參數作適當的調整,由其是 -B 及 -m 以防止資料流失。
目前為止ACPI在Linux的使用上還有相當多的問題,實際執行時可能會遇到各種狀況,但ACPI是電源管理發展的方向與目標,在此需要Linux的愛好者共同努力以解決實際的運用及相容的問題。
相關內容參考於下列文章。
http://www.acpi.info/index.html
http://www.microsoft.com/whdc/hwdev/archive/default.mspx
http://tldp.org/HOWTO/Ecology-HOWTO-2.html
http://developer.intel.com/technology/iapc/acpi/
原始出處: |
|