本發(fā)明涉及計(jì)算機(jī)電源管理技術(shù)領(lǐng)域,尤其涉及一種uefi下的電源管理方法及裝置。
背景技術(shù):
根據(jù)電源管理方式的不同,操作系統(tǒng)分為apm(advancedpowermanagement,高級(jí)電源管理)操作系統(tǒng)和acpi(advancedconfigurationandpowermanagementinterface,高級(jí)配置和電源管理接口)操作系統(tǒng),apm系統(tǒng)對(duì)bios的依賴(lài)程度很大,完全通過(guò)調(diào)用bios(basicinputoutputsystem,基本輸入輸出系統(tǒng))提供的中斷服務(wù)進(jìn)行電源管理,由于bios芯片的空間限制,導(dǎo)致能夠?qū)崿F(xiàn)的功能十分有限。acpi系統(tǒng)則根據(jù)bios提供的表格,由操作系統(tǒng)自身提供的驅(qū)動(dòng)來(lái)進(jìn)行硬件配置和電源管理,因此能實(shí)現(xiàn)的功能遠(yuǎn)強(qiáng)于apm系統(tǒng),在中高端應(yīng)用中有廣泛的應(yīng)用。
acpi是現(xiàn)在主流使用的高級(jí)電源管理,其兼容性各方面都做得很好。而apm是比較落后的一種電源管理,目前已經(jīng)慢慢淘汰,只有一些特定的行業(yè)在使用著。例舉一個(gè)案例,某個(gè)機(jī)構(gòu)使用的機(jī)器芯片組為h61,linux操作系統(tǒng)是較為落后的2.4.18版本內(nèi)核,當(dāng)機(jī)器主板bios升級(jí)為uefi(unifiedextensiblefirmwareinterface,統(tǒng)一的可擴(kuò)展固件接口)時(shí),不再支持apm模塊,因?yàn)樾掳娴膗efi已經(jīng)把這一模塊去掉,這時(shí)有關(guān)電源管理的部分命令會(huì)失效,例如關(guān)機(jī)命令poweroff,此時(shí)需要采用升級(jí)系統(tǒng)的措施去解決。
在實(shí)現(xiàn)本發(fā)明的過(guò)程中,發(fā)明人發(fā)現(xiàn)現(xiàn)有技術(shù)中至少存在如下技術(shù)問(wèn)題:
針對(duì)當(dāng)機(jī)器主板bios升級(jí)為uefi時(shí)相關(guān)電源管理的部分命令失效的問(wèn) 題,如果采用升級(jí)系統(tǒng)的措施去解決,需花費(fèi)的時(shí)間和資源巨大,還要整體改變一些相關(guān)聯(lián)的程序等。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提供一種uefi下的電源管理方法及裝置,能夠在不進(jìn)行升級(jí)系統(tǒng)、更換程序應(yīng)用的情況下,解決uefi與舊版本系統(tǒng)在電源管理方面不兼容的問(wèn)題,不用花費(fèi)太多的時(shí)間和資源。
第一方面,本發(fā)明提供一種uefi下的電源管理方法,所述方法包括:
接收操作系統(tǒng)的電源操作命令;
在pci總線上查找電源管理設(shè)備,返回一個(gè)指向該電源管理設(shè)備的結(jié)構(gòu)體;
根據(jù)所述結(jié)構(gòu)體,訪問(wèn)所述電源管理設(shè)備的配置空間;
在所述配置空間中讀取i/o端口地址值;
根據(jù)所述i/o端口地址值為所述i/o端口申請(qǐng)一塊輸入輸出域;
向所述i/o端口寫(xiě)入與所述電源操作命令匹配的指令值;
根據(jù)所述指令值對(duì)所述電源管理設(shè)備執(zhí)行相對(duì)應(yīng)的電源操作。
可選地,所述接收操作系統(tǒng)的電源操作命令包括:
接收操作系統(tǒng)通過(guò)調(diào)用系統(tǒng)調(diào)用函數(shù)發(fā)出的電源操作命令。
可選地,所述在pci總線上查找電源管理設(shè)備包括:通過(guò)調(diào)用pci設(shè)備查找函數(shù)在pci總線上查找到該電源管理設(shè)備,所述pci設(shè)備查找函數(shù)的輸入?yún)?shù)為所述電源管理設(shè)備的pci總線及插槽號(hào)。
可選地,所述根據(jù)所述結(jié)構(gòu)體,訪問(wèn)所述電源管理設(shè)備的配置空間包括:通過(guò)調(diào)用配置空間訪問(wèn)函數(shù)訪問(wèn)所述電源管理設(shè)備的配置空間,所述配置空間訪問(wèn)函數(shù)的輸入?yún)?shù)為所述結(jié)構(gòu)體。
可選地,所述根據(jù)所述i/o端口地址值為所述i/o端口申請(qǐng)一塊輸入輸出域 包括:通過(guò)調(diào)用輸入輸出域申請(qǐng)函數(shù)為所述i/o端口申請(qǐng)一塊輸入輸出域。
可選地,所述向所述i/o端口寫(xiě)入與所述電源操作命令匹配的指令值包括:通過(guò)調(diào)用寫(xiě)入函數(shù)向所述i/o端口寫(xiě)入所述指令值。
第二方面,本發(fā)明提供一種uefi下的電源管理裝置,包括:
接收模塊,用于接收操作系統(tǒng)的電源操作命令;
查找模塊,用于在pci總線上查找電源管理設(shè)備,返回一個(gè)指向該電源管理設(shè)備的結(jié)構(gòu)體;
訪問(wèn)模塊,用于根據(jù)所述結(jié)構(gòu)體,訪問(wèn)所述電源管理設(shè)備的配置空間;
讀取模塊,用于在所述配置空間中讀取i/o端口地址值;
申請(qǐng)模塊,用于根據(jù)所述i/o端口地址值為所述i/o端口申請(qǐng)一塊輸入輸出域;
寫(xiě)入模塊,用于向所述i/o端口寫(xiě)入與所述電源操作命令匹配的指令值;
執(zhí)行模塊,用于根據(jù)所述指令值對(duì)所述電源管理設(shè)備執(zhí)行相對(duì)應(yīng)的電源操作。
可選地,所述接收模塊,用于接收操作系統(tǒng)通過(guò)調(diào)用系統(tǒng)調(diào)用函數(shù)發(fā)出的電源操作命令。
可選地,所述查找模塊,用于通過(guò)調(diào)用pci設(shè)備查找函數(shù)在pci總線上查找到電源管理設(shè)備,所述pci設(shè)備查找函數(shù)的輸入?yún)?shù)為所述電源管理設(shè)備的pci總線及插槽號(hào)。
可選地,所述訪問(wèn)模塊,用于通過(guò)調(diào)用配置空間訪問(wèn)函數(shù)訪問(wèn)所述電源管理設(shè)備的配置空間,所述配置空間訪問(wèn)函數(shù)的輸入?yún)?shù)為所述結(jié)構(gòu)體。
可選地,所述申請(qǐng)模塊,用于通過(guò)調(diào)用輸入輸出域申請(qǐng)函數(shù)為所述i/o端口申請(qǐng)一塊輸入輸出域。
可選地,所述寫(xiě)入模塊,用于通過(guò)調(diào)用寫(xiě)入函數(shù)向所述i/o端口寫(xiě)入所述指令值。
本發(fā)明實(shí)施例提供的一種uefi下的電源管理方法及裝置,在uefi不支持apm模塊的情況下,能夠在不進(jìn)行升級(jí)系統(tǒng)、更換程序應(yīng)用的情況下,解決uefi與舊版本系統(tǒng)在電源管理方面不兼容的問(wèn)題,不用花費(fèi)太多的時(shí)間和資源。
附圖說(shuō)明
圖1為現(xiàn)有技術(shù)中基于apm電源管理模式電源操作流程圖;
圖2為本發(fā)明實(shí)施例提供的uefi下的電源管理方法的流程圖;
圖3為本發(fā)明實(shí)施例提供的uefi下的電源管理裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
為使本發(fā)明實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
圖1為現(xiàn)有的基于apm電源管理模式電源操作流程圖,在這里以英特爾h61芯片組平臺(tái),操作系統(tǒng)為turbolinux7.0,內(nèi)核為2.4.18作為實(shí)例,以關(guān)機(jī)命令poweroff為例進(jìn)行說(shuō)明。用戶在終端輸出poweroff命令,經(jīng)過(guò)系統(tǒng)調(diào)用sys_reboot函數(shù),通過(guò)事件通知鏈notifer_call_chain發(fā)出關(guān)閉計(jì)算機(jī)電源的消息。接著調(diào)用machine_power_off函數(shù),在調(diào)用machine_power_off函數(shù)時(shí),判斷pm_power_off這個(gè)函數(shù)指針是否為空,當(dāng)指針為空時(shí)結(jié)束操作,當(dāng)指針不為空時(shí)通過(guò)調(diào)用該pm_power_off函數(shù)進(jìn)行關(guān)機(jī)。在apm已經(jīng)加載的情況下,實(shí)際pm_power_off指向apm_power_off,在函數(shù)中通過(guò)apm_info結(jié)構(gòu)體的值,切換到實(shí)模式關(guān)機(jī);或 者使用apm_bios_call_simple函數(shù)調(diào)用保護(hù)模式下的apm接口進(jìn)行關(guān)機(jī)。
這是一般情況下的關(guān)機(jī)命令執(zhí)行流程,但當(dāng)機(jī)器bios已升級(jí)為uefi后,不再支持apm電源管理模式。當(dāng)程序執(zhí)行到machine_power_off時(shí),由于uefi中已不支持apm,當(dāng)實(shí)際pm_power_off指向apm_power_off時(shí),相應(yīng)的函數(shù)調(diào)用不能夠?qū)崿F(xiàn),無(wú)法成功實(shí)現(xiàn)關(guān)機(jī)。本發(fā)明提出的技術(shù)方案在圖1所示位置處進(jìn)行改進(jìn)。
本發(fā)明提供一種uefi下的電源管理方法,如附圖2所示,所述方法包括:
s21、接收操作系統(tǒng)的電源操作命令;
s22、在pci總線上查找電源管理設(shè)備,返回一個(gè)指向該電源管理設(shè)備的結(jié)構(gòu)體;
s23、根據(jù)所述結(jié)構(gòu)體,訪問(wèn)所述電源管理設(shè)備的配置空間;
s24、在所述配置空間中讀取i/o端口地址值;
s25、根據(jù)所述i/o端口地址值為所述i/o端口申請(qǐng)一塊輸入輸出域;
s26、向所述i/o端口寫(xiě)入與所述電源操作命令匹配的指令值;
s27、根據(jù)所述指令值對(duì)所述電源管理設(shè)備執(zhí)行相對(duì)應(yīng)的電源操作。
本發(fā)明實(shí)施例提供的一種uefi下的電源管理方法,在uefi不支持apm模塊的情況下,能夠在不進(jìn)行升級(jí)系統(tǒng)、更換程序應(yīng)用的情況下,解決uefi與舊版本系統(tǒng)在電源管理方面不兼容的問(wèn)題,不用花費(fèi)太多的時(shí)間和資源。
可選地,所述接收操作系統(tǒng)的電源操作命令包括:
接收操作系統(tǒng)通過(guò)調(diào)用系統(tǒng)調(diào)用函數(shù)發(fā)出的電源操作命令。
本發(fā)明實(shí)施例以英特爾h61芯片組平臺(tái),操作系統(tǒng)為turbolinux7.0,內(nèi)核為2.4.18作為實(shí)例,進(jìn)行解析,當(dāng)機(jī)器bios升級(jí)為uefi時(shí),不支持apm電源管理模式。當(dāng)用戶在終端輸出電源操作命令時(shí),操作系統(tǒng)調(diào)用系統(tǒng)調(diào)用函數(shù),即sys_reboot函數(shù),通過(guò)事件通知鏈notifer_call_chain發(fā)出關(guān)閉計(jì)算機(jī)電源的消息。
可選地,通過(guò)調(diào)用pci設(shè)備查找函數(shù)在pci總線上查找到該電源管理設(shè)備,所述pci設(shè)備查找函數(shù)的輸入?yún)?shù)為所述電源管理設(shè)備的pci總線及插槽號(hào)。
通過(guò)調(diào)用pci_find_slot(unsignedintbus,unsignedintdevfn)函數(shù)在pci總線上查到相應(yīng)的設(shè)備,即南橋芯片上的電源管理設(shè)備。在這里pci_find_slot函數(shù)的輸入?yún)?shù)一為bus,即該電源管理設(shè)備所在的pci總線參數(shù),該函數(shù)的另一參數(shù)為devfn,即該電源管理設(shè)備的插槽號(hào),輸入?yún)?shù)bus及devfn按照主板使用的芯片的參數(shù)資料來(lái)確定。通過(guò)調(diào)用pci_find_slot函數(shù),根據(jù)該電源管理設(shè)備所在的pci總線參數(shù)及插槽號(hào)參數(shù),在pci設(shè)備的系統(tǒng)全局鏈中查找該電源管理設(shè)備,如果查找到該電源管理設(shè)備,則返回一個(gè)指向該電源管理設(shè)備的結(jié)構(gòu)體structpci_dev,否則返回空。其中所述結(jié)構(gòu)體structpci_dev包含所述電源管理設(shè)備的參數(shù)資料。
可選地,所述根據(jù)所述結(jié)構(gòu)體,訪問(wèn)所述電源管理設(shè)備的配置空間包括:通過(guò)調(diào)用配置空間訪問(wèn)函數(shù)訪問(wèn)所述電源管理設(shè)備的配置空間,所述配置空間訪問(wèn)函數(shù)的輸入?yún)?shù)為所述結(jié)構(gòu)體。
通過(guò)調(diào)用配置空間訪問(wèn)函數(shù),即pci_read_config_word(structpci_dev*pdev,intwhere,u8*val)函數(shù)訪問(wèn)電源管理設(shè)備的配置空間,該pci_read_config_word函數(shù)的輸入的參數(shù)*pdev為上一步驟中返回的結(jié)構(gòu)體,通過(guò)該函數(shù)從由所述結(jié)構(gòu)體標(biāo)識(shí)出的電源管理設(shè)備的配置寄存器中讀取數(shù)據(jù),其中where參數(shù)是從配置寄存器開(kāi)始的字節(jié)偏移,從配置空間取得的值通過(guò)val指針?lè)祷?。在這里從所述電源管理設(shè)備的配置空間中取得所述電源管理設(shè)備工作時(shí)需要的i/o端口地址值,該地址值通過(guò)val指針?lè)祷亍?/p>
可選地,根據(jù)所述i/o端口地址值為所述i/o端口申請(qǐng)一塊輸入輸出域包括:通過(guò)調(diào)用輸入輸出域申請(qǐng)函數(shù)為所述i/o端口申請(qǐng)一塊輸入輸出域。
通過(guò)調(diào)用輸入輸出域申請(qǐng)函數(shù),即request_region(unsignedlongfrom,unsignedlongnum,constchar*name)函數(shù)為所述i/o端口申請(qǐng)一塊輸入輸出域,保證該端口沒(méi)有被使用。該request_region函數(shù)的輸入?yún)?shù)from為i/o端口的基地址,num為i/o端口的占用范圍,*name為使用這段i/o地址的設(shè)備名。
可選地,所述向所述i/o端口寫(xiě)入與所述電源操作命令匹配的指令值包括:通過(guò)調(diào)用寫(xiě)入函數(shù)向所述i/o端口寫(xiě)入所述指令值。
通過(guò)調(diào)用寫(xiě)入函數(shù),即outb(value,port)函數(shù)向所述i/o端口寫(xiě)入指令值,該outb(value,port)函數(shù)的輸入?yún)?shù)value為要寫(xiě)入的值,port為相應(yīng)的端口。根據(jù)不同的指令值對(duì)所述電源管理設(shè)備執(zhí)行相對(duì)應(yīng)的電源操作。
本發(fā)明實(shí)施例提供的uefi下的電源管理方法,在附圖1對(duì)應(yīng)的流程圖中,可以在接收到操作系統(tǒng)發(fā)出的電源操作命令之后,調(diào)用machine_power_off函數(shù)之前采用本發(fā)明實(shí)施例提供的uefi下的電源管理方法進(jìn)行相對(duì)應(yīng)的電源管理操作,也可以先調(diào)用machine_power_off函數(shù),如果能正確執(zhí)行了電源操作指令,則正常進(jìn)行相對(duì)應(yīng)的電源操作。如果不能正確執(zhí)行電源操作指令,則開(kāi)始執(zhí)行調(diào)用pci_find_slot函數(shù)進(jìn)行之后的操作步驟,采用本發(fā)明實(shí)施例提供的uefi下的電源管理方法進(jìn)行相對(duì)應(yīng)的電源管理操作。
本發(fā)明實(shí)施例還提供一種uefi下的電源管理裝置,如附圖3所示,所述裝置包括:
接收模塊31,用于接收操作系統(tǒng)的電源操作命令;
查找模塊32,用于在pci總線上查找電源管理設(shè)備,返回一個(gè)指向該電源管理設(shè)備的結(jié)構(gòu)體;
訪問(wèn)模塊33,用于根據(jù)所述結(jié)構(gòu)體,訪問(wèn)所述電源管理設(shè)備的配置空間;
讀取模塊34,用于在所述配置空間中讀取i/o端口地址值;
申請(qǐng)模塊35,用于根據(jù)所述i/o端口地址值為所述i/o端口申請(qǐng)一塊輸入輸出域;
寫(xiě)入模塊36,用于向所述i/o端口寫(xiě)入與所述電源操作命令匹配的指令值;
執(zhí)行模塊37,用于根據(jù)所述指令值對(duì)所述電源管理設(shè)備執(zhí)行相對(duì)應(yīng)的電源操作。
本發(fā)明實(shí)施例提供的一種uefi下的電源管理裝置,在uefi不支持apm模塊的情況下,能夠在不進(jìn)行升級(jí)系統(tǒng)、更換程序應(yīng)用的情況下,解決uefi與舊版本系統(tǒng)在電源管理方面不兼容的問(wèn)題,不用花費(fèi)太多的時(shí)間和資源。
可選地,所述接收模塊31,用于接收操作系統(tǒng)通過(guò)調(diào)用系統(tǒng)調(diào)用函數(shù)發(fā)出的電源操作命令。
可選地,所述查找模塊32,用于通過(guò)調(diào)用pci設(shè)備查找函數(shù)在pci總線上查找到電源管理設(shè)備,所述pci設(shè)備查找函數(shù)的輸入?yún)?shù)為所述電源管理設(shè)備的pci總線及插槽號(hào)。
可選地,所述訪問(wèn)模塊33,用于通過(guò)調(diào)用配置空間訪問(wèn)函數(shù)訪問(wèn)所述電源管理設(shè)備的配置空間,所述配置空間訪問(wèn)函數(shù)的輸入?yún)?shù)為所述結(jié)構(gòu)體。
可選地,所述申請(qǐng)模塊35,用于通過(guò)調(diào)用輸入輸出域申請(qǐng)函數(shù)為所述i/o端口申請(qǐng)一塊輸入輸出域。
可選地,所述寫(xiě)入模塊36,用于通過(guò)調(diào)用寫(xiě)入函數(shù)向所述i/o端口寫(xiě)入所述指令值。
本發(fā)明實(shí)施例提供的uefi下的電源管理裝置的工作流程在所述uefi下的電源管理方法中已經(jīng)詳細(xì)描述過(guò),在此不再贅述。
以上所述,僅為本發(fā)明的具體實(shí)施方式,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到 的變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)該以權(quán)利要求的保護(hù)范圍為準(zhǔn)。