發表文章

目前顯示的是有「ACPI」標籤的文章

Linux Kernel Patch: Suspend/Resume 以後無法 Restart

最近碰到個難解的問題 ,就是系統無法 Restart 的 Bug ,有 usplash 的人會卡死在關機畫面 ,在 console 底下 ,會停在 kernel 吐的最後一行訊息: 『 Restarting system 』。有趣的是 ,這 bug 只會在 suspend/resume 之後才發生 。沒錯 ,這應該是 ACPI 的 Bug ,但其實可以透過 Patch Kernel 來修正 。 這 patch 可由此下載: linux-kernel-restart.patch 後記 因為 BIOS 的人永遠不承認是自己的錯 ,我們只好自己動手 。

在霧裡欣賞 BIOS 裡的 ACPI Description Table

ACPI(Advanced Configuration & Power Interface) 是近年來廣泛被使用的電源和硬體狀態控制標準 , 在 PC 產業中已經被用來取代 APM(Advanced Power Management) ,並做為一個電源控制的首選規範 。截至本文為止 , ACPI 的最新版本號是 3.0a ,詳細說明資料可參閱官方網站( http://www.acpi.info/ ) 。 常聽一些人解釋說: 『 因為 休眠 、暫停 功能在 WindowsXP 系統上沒問題 , 所以 BIOS 在 ACPI 的處理上應該正確無誤。要是在 Linux 等其他系統上出現問題 ,那一定是其它作業系統的錯 。』 乍聽之下 ,這樣的解釋真的很合理 ,完美的證明了 BIOS 沒有問題 , 但實際上 ,這樣的說法就好像賣藥郎中說: 『 這藥強健筋骨 、治百病 ,男人可壯陽 ,女人可改善體質 , 絕對百利而無一害 ,要是服用後病沒好 ,仍然一厥不振 ,且頭暈目炫 、 口吐白沫 ,那肯定是你身體有問題 ,虛不受補 。藥 ,肯定是沒問題的 。』 要窺探並破解 ACPI 的迷思 , 我們可以直接檢查存在於 BIOS 裡的 ACPI Source , 了解到底發生了什麼事 ,會讓 ACPI 功能在不同系統上有不同的表現 ,雖然會有如霧裡看花 , 但沒關係, 反正世上最美的事物就是最矇矓的恐龍呀:P。如果是在 Linux 系統下 ,我們可以很輕易的將 ACPI 的 DSDT(Differentiated System Description Table) 給 Dump 下來: sudo cat /sys/firmware/acpi/tables/DSDT > dsdt.aml 『dsdt.aml』是一個 Binary 的 ACPI Machine Language 檔 ,我們可以使用 isal (Intel ACPI Source Language compiler/ decompiler) 將它 disassemble ,若是 在 Debian/Ubuntu 之下 ,可直接用 apt-get 安裝該工具 : apt-get install iasl 然後使用 iasl 直接 disassemble dsdt.aml: iasl -d dsdt.aml 完...