ACPI的內容龐雜,學習ACPI至少可以幫助我們理解配置信息。這些信息從legacy PNP設備的配置,到多處理器,到NUMA,比如現在的Multiple Core的信息就只能從ACPI得到。Linux啟動很多代碼就是處理這些配置信息,比如Linux acpi off,IOAPIC設置等。
ACPI相關設備。主要是筆記本電腦相關的設備,包括電源按鈕,電池,外接電源,風扇,熱鍵等。
底層硬件。比如PCI中斷路由,chipset(主要是南橋PCI-to-LPC bridge)操作等。
電源管理。ACPI定義的電源管理包括CPU的電源管理(調頻率P-state,idle C-state,throtting T-state),設備電源管理(D-state),系統電源管理(Suspend-to-Ram, Suspend-to-Disk, power off)等。
設備熱插拔。ACPI用一種統一的方式來描述設備的熱插拔,這樣的設備從單一的PCI設備,到筆記本電腦的Docking Station,到整個PCI hierarchy,CPU,Memory,甚至整個NUMA節點。
可以說要理解現代PC平台必須了解ACPI。
Linux acpi off解決ACPI問題的小竅門
首先可以看看是否這是一個regression,如果以前版本的Linux kernel可以工作,但新的不行,則是一個regression,可以測試不同的kernel從而找出哪個版本引入了bug。使用git-bisect是一個好的選擇,它可以幫你定位到哪個patch導致了regression。一些git-bisect相關的資料如下:
http://www.stardust.webpages.pl/files/handbook/handbook-en.pdf
http://www.kernel.org/pub/software/scm/git/docs/tutorial.html
http://www.kernel.org/pub/software/scm/git/docs/git-bisect.html
Linux acpi off系統不能啟動
試試kernel參數”acpi=off”,如果此參數沒有帶來任何改變,那么這不是一個ACPI bug。反之,則這很可能是一個ACPI bug。 確定了是一個ACPI bug后,我們還有其他一些參數來更進一步的區分到底是ACPI哪個部分的bug。
acpi=ht
這個參數和"acpi=off"幾乎一樣,它禁止了除多處理器配置相關的內容以外的所有ACPI功能。如果acpi=off正常,但acpi=ht 不正常, 則解析ACPI 表或者Linux SMP的代碼有bug.
pci=noacpi
禁止使用ACPI來處理任何PCI相關的內容,包括PCI root bus的枚舉和PCI設備中斷路由。
acpi=noirq
禁止使用ACPI來處理PCI設備中斷路由,和pci=noacpi的區別是它允許使用ACPI來枚舉PCI root bus.
pnpacpi=off
禁止使用ACPI來枚舉PNP設備,比如串口、PS2鍵盤鼠標等。
noapic
禁止使用io-apic來做設備中斷路由,這樣做的效果之一是ACPI返回的中斷路由表將是針對PIC(8259)的。
nolapic
禁止使用Local-APIC和IO-APIC。
Linux acpi off設備中斷相關的問題
出現中斷問題的可能性很多,比如驅動程序有bug。由ACPI導致的最常見的中斷問題是kernel打出:”irqXX: nobody cared!”。這意味着kernel收到一個中斷,但是沒有驅動程序來處理此中斷。Kernel會將此中斷禁止,從而導致掛在此中斷上的所有設備都停止工作。pci=noacpi, acpi=noirq, pnpacpi=off, noapic, nolapic這些參數可以幫助隔離一些問題。另外一個有用的參數是”irqpoll”,出現上面的中斷問題時,它可以使kernel自動探測哪個設備發出了中斷。這個參數對於調試那些中斷路由有問題的系統很有用。