ret = exec_usermodehelper(poweroff_helper_path, argv, envp);
if (ret) {
printk(KERN_ERR
"apm.c: failed to exec %s , errno = %dn",
poweroff_helper_path, errno);
}
break;
For fast reboot support
static unsigned char fast_reboot_switch [] =
{
0x66, 0x0f, 0x20, 0xc0, /* movl %cr0,陎 */
0x66, 0x25, 0x10, 0x11, 0x11, 0x11, /* andl $0x11111110,陎 */
0x66, 0x0f, 0x22, 0xc0, /* movl 陎,%cr0 */
0xea, 0x00, 0x00, 0x00, 0x70 /* ljmp $0x7000,$0x0000 */
};
系統(tǒng)就可以切換到實(shí)模式中,然后跳轉(zhuǎn)到7000H:0位置開始執(zhí)行 。
6.ACPI概述
在2.4.20內(nèi)核中ACPI模塊被注明為試驗(yàn)和未完成,里面有一部分功能也許沒有實(shí)現(xiàn) 。如果APM和APCI兩個模塊同時編譯進(jìn)內(nèi)核,APM在ACPI前被加載,APM起作用使ACPI退出 。對于系統(tǒng)電量、電源實(shí)踐一類的支持(主要是在筆記本上有用),靠的是acpid這個daemon程序 。
沒有一個功能類似apm的應(yīng)用程序切換狀態(tài),acpi的程序僅僅完成了對acpi狀態(tài)的查詢 。用戶實(shí)現(xiàn)S0-S4的功能可以直接向/proc/acpi/sleep文件中寫入數(shù)字來實(shí)現(xiàn) 。通過讀出(cat)其中的內(nèi)容可以知道系統(tǒng)到底支持那些模式 。
acpi模塊的源代碼主程序在linux/drivers/acpi/driver.c中,如果向sleep文件寫東西,就轉(zhuǎn)到了linux/drivers/acpi/ospm/system/sm_osl.c文件的sm_osl_proc_write_sleep函數(shù)中,這個函數(shù)后來調(diào)用了sm_osl_suspend函數(shù) 。在這個函數(shù)里完成了各種功能,包括保護(hù)各種狀態(tài) 。最后真正的sleep是通過對acpi_enter_sleep_state的調(diào)用完成的,這個函數(shù)在linux/drivers/acpi/hardware/hwsleep.c文件中,這里寫了acpi的寄存器使系統(tǒng)進(jìn)入sleep狀態(tài) 。寫寄存器的指令在這個目錄下面的hwregs.c中 。
7.總結(jié)
本文對acpi的介紹非常簡略,實(shí)際上ACPI必定會成為將來linux內(nèi)核中首選的電源管理方式 。由于目前官方代碼中ACPI版本較低,所以沒有太詳細(xì)的論述,希望將來的內(nèi)核能有所改變 。
參考資料
linux-2.4.20源代碼
關(guān)于作者
范曉炬,聯(lián)想(北京)有限公司軟件設(shè)計中心嵌入式研發(fā)處開發(fā)工程師,研究興趣為Linux內(nèi)核,網(wǎng)絡(luò)安全,XWindow系統(tǒng),Linux桌面應(yīng)用,人工智能系統(tǒng) 。你可以通過xiaoju_f@263.net聯(lián)系他 。
推薦閱讀
- 在Linux下成功運(yùn)行最新的QQ和MSN
- 如何給linux添加新硬盤
- Linux操作系統(tǒng)下機(jī)器溫度監(jiān)控與調(diào)整方法
- 實(shí)用技巧:UNIX和Linux實(shí)現(xiàn)NFS共享連接
- 八 讀核日記 --linux的內(nèi)存管理機(jī)制(2)
- 七 讀核日記 --linux的內(nèi)存管理機(jī)制(1)
- 三 讀核日記
- 如何同時啟動6個X控制臺
- 蘋果xs屏幕失靈怎么強(qiáng)制關(guān)機(jī)
- Linux與分區(qū)
