Linux acpi off關于Suspend to Disk 問題分析
對于debug_layer和debug_level,include/acpi/acoutput.h里面包含了很多值,這些值決定了Linux/ACPI輸出信息的詳細程度和內容范圍。acpi.debug_level和 acpi.debug_layer是kernel參數,也可以在系統運行時改變這些值,它們是/sys/module/acpi/parameters/debug_{level,layer}。
注意,這些輸出信息可能很快就將kernel的ring buffer用完,你可能需要使用log_buf_len=XY來增加ring buffer的大小。使用serial console (Documentation/serial-console.txt)來得到kernel輸出是一個好的方法。如果你的筆記本電腦沒有串口,可以試試netconsole (Documentation/networking/netconsole.txt)。
Linux acpi off使用定制的 DSDT
Linux acpi offDSDT (Differentiated System Description Table)是一個主要的ACPI表,它包含了很多AML代碼。因為BIOS的bug,這些代碼本身可能有錯。Linux提供的一種方法能讓你使用定制的DSDT表,這對于調試很有幫助。讓kernel使用定制的DSDT步驟如下:
首先要得到原始的DSDT表(后面的章節會介紹acpidump等工具):
$ acpidump > acpidump.out
$ acpixtract DSDT acpidump > DSDT.dat
這樣我們就得到了DSDT表的二進制文件,將它反匯編
$ iasl -d DSDT.dat
我們會得到一個AML代碼文件,你可以修改它
$ vi DSDT.dsl
然后重新編譯
$ iasl -tc DSDT.dsl
把它拷貝到kernel source中
$ cp DSDT.hex $SRC/include/
Linux acpi off加入下面幾行到你的kernel配置文件(.config):
CONFIG_STANDALONE=n
CONFIG_ACPI_CUSTOM_DSDT=y
CONFIG_ACPI_CUSTOM_DSDT_FILE=”DSDT.hex”
Linux acpi off編譯kernel,運行,你的dmesg中應該有如下輸出:
Table [DSDT] replaced by host OS
使用這種方法,你可以修正DSDT的bug。這種方法帶來的一個有用的debug方法是:將ACPI的debug選項打開,然后在你的DSDT中加入類似如下的語句:
Store(”hello world!”, Debug)
Store(Local0, Debug)
即將某個變量存儲到特殊的目標Debug中。加入了這樣語句后的函數被kernel解釋執行時你可以看到如下輸出:
[ACPI Debug] String: [0x0C] “hello world!”
[ACPI Debug] Integer: 0×00000042
由此我們可以在AML代碼級別進行調試。
【編輯推薦】
- Linux 查看磁盤空間實現代碼介紹
- Linux操作系統需要微軟的十大幫助
- 探尋Linux到底需要多低的配置
- Linux測試工具tcpdump監視TCP/IP連接命令介紹
- Linux流量控制實例應用介紹