朱振華
摘 ? 要:文章針對(duì)Linux的內(nèi)核devfreq子系統(tǒng)框架進(jìn)行了抽象分析,理清了子系統(tǒng)內(nèi)部各關(guān)鍵模塊之間的相互關(guān)系。通過(guò)對(duì)子系統(tǒng)框架的分析整理出了devfreq driver的編程框架,并對(duì)后續(xù)Linux內(nèi)核devfreq框架的演化進(jìn)行了展望。
關(guān)鍵詞:Linux;設(shè)備調(diào)頻;功耗
隨著移動(dòng)終端性能越來(lái)越強(qiáng)大、功能越來(lái)越多,其功耗也越來(lái)越高。隨著功耗的升高,移動(dòng)終端所配備的電池容量越來(lái)越大,電池所占空間也越來(lái)越大、重量越來(lái)越重,不可避免地和移動(dòng)終端所倡導(dǎo)的輕薄、便攜理念發(fā)生了沖突。Linux操作系統(tǒng)建立之初主要應(yīng)用于臺(tái)式電腦、工作站、大型機(jī)等非移動(dòng)平臺(tái),所以并未對(duì)系統(tǒng)功耗進(jìn)行過(guò)多關(guān)注。近些年來(lái)隨著android等移動(dòng)操作系統(tǒng)的興起,作為android底層的Linux操作系統(tǒng)在功耗管理方面也有了長(zhǎng)足的進(jìn)步。文章所述的devfreq子系統(tǒng)是Linux功耗管理系統(tǒng)的一個(gè)重要子系統(tǒng),其核心理念是通過(guò)某種手段對(duì)設(shè)備的負(fù)載進(jìn)行動(dòng)態(tài)測(cè)量,在設(shè)備輕載時(shí)降低設(shè)備工作電壓和頻率以最大限度地降低設(shè)備運(yùn)行功耗,在設(shè)備重載時(shí)及時(shí)提高設(shè)備工作電壓和頻率以滿足設(shè)備的性能需求。通過(guò)對(duì)設(shè)備電壓和頻率的“按需供給”提高設(shè)備運(yùn)行效能,從而降低設(shè)備功耗[1]。
1 ? ?devfreq子系統(tǒng)框架分析
Linux devfreq子系統(tǒng)對(duì)下封裝了設(shè)備硬件相關(guān)細(xì)節(jié),根據(jù)硬件提供的設(shè)備負(fù)載信息和調(diào)頻調(diào)壓手段實(shí)現(xiàn)了對(duì)設(shè)備性能的“按需供給”;對(duì)上透出了相關(guān)sysfs API給用戶態(tài)應(yīng)用程序,使應(yīng)用程序可以根據(jù)場(chǎng)景需求動(dòng)態(tài)改變?cè)O(shè)備調(diào)頻調(diào)壓的相關(guān)參數(shù)和策略,最大限度地滿足了用戶在不同場(chǎng)景下的多樣性需求,使“性能”和“功耗”這一對(duì)矛盾體得到了一定程度的統(tǒng)一。Linux devfreq子系統(tǒng)框架如圖1所示。
Linux devfreq的基本原理是通過(guò)周期性的測(cè)量被調(diào)設(shè)備的負(fù)載狀況來(lái)預(yù)估設(shè)備未來(lái)一段時(shí)間的性能需求,并根據(jù)此需求來(lái)調(diào)整設(shè)備工作的電壓和頻率,使設(shè)備性能總在“剛剛好滿足需求”的頻率和電壓下工作,從而最大程度地提高設(shè)備工作效能[2-3]。
devfreq core會(huì)為每一個(gè)加入devfreq子系統(tǒng)(devfreq-add-device)的設(shè)備啟動(dòng)一個(gè)負(fù)載監(jiān)控work:devfreq-monitor。Devfreq-monitor會(huì)周期性地通過(guò)event框架向設(shè)備負(fù)載監(jiān)控單元獲取設(shè)備負(fù)載數(shù)據(jù),之后使用驅(qū)動(dòng)指定的governor調(diào)頻算法計(jì)算出未來(lái)一段時(shí)間設(shè)備需要運(yùn)行的頻率電壓(update-devfreq),最后通過(guò)驅(qū)動(dòng)定制的target方法調(diào)用clk和regulator相關(guān)接口完成最終的調(diào)頻調(diào)壓動(dòng)作,如圖2所示。此work每polling-ms毫秒調(diào)度一次,polling-ms的具體數(shù)值由devfreq驅(qū)動(dòng)定制。
Linux驅(qū)動(dòng)開(kāi)發(fā)倡導(dǎo)“機(jī)制”和“策略”分離,驅(qū)動(dòng)程序提供“機(jī)制”,“策略”一般由上層框架或者應(yīng)用程序指定,從而在保持Linux框架相對(duì)穩(wěn)定的情況下給用戶提供了足夠的靈活性支持。具體到devfreq框架中,Linux將具體的調(diào)頻策略抽象為了governor,不同的governor提供不同的get_target_freq方法來(lái)實(shí)現(xiàn)不同的調(diào)頻策略。Linux框架提供如下幾個(gè)governor供驅(qū)動(dòng)和用戶態(tài)API選擇。
(1)performance,設(shè)備固定工作在其支持的最高頻率上,以追求最高性能。
(2)powersave,設(shè)備固定工作在其支持的最低頻率上,以追求最低的功耗。
(3)userspace,將調(diào)頻策略的決策交給了用戶態(tài)應(yīng)用程序,并提供相應(yīng)的調(diào)頻調(diào)壓接口供其使用。
(4)ondemand,定時(shí)對(duì)系統(tǒng)負(fù)載情況進(jìn)行采樣分析并據(jù)此調(diào)節(jié)設(shè)備工作頻率和電壓。
通常狀況下設(shè)備調(diào)頻驅(qū)動(dòng)會(huì)選擇ondemand以便devfreq子系統(tǒng)可以自動(dòng)對(duì)設(shè)備進(jìn)行“按需調(diào)頻”,使設(shè)備效能達(dá)到最佳。
devfreq event對(duì)設(shè)備負(fù)載監(jiān)控單元進(jìn)行了封裝,并抽象出了簡(jiǎn)潔的編程接口給devfreq event driver,使其可以將硬件負(fù)載監(jiān)控單元提供的相關(guān)信息輕松納入devfreq框架供相關(guān)governor使用。
2 ? ?devfreq子系統(tǒng)驅(qū)動(dòng)開(kāi)發(fā)
devfreq子系統(tǒng)驅(qū)動(dòng)通常包括兩個(gè)部分:devfreq driver和devfreq event driver。前者是設(shè)備調(diào)頻驅(qū)動(dòng)的主體部分,需要定制本驅(qū)動(dòng)調(diào)頻策略(governor選擇)、選擇合適的devfreq-monitor調(diào)度周期以及定制自己的調(diào)頻方法等;后者主要實(shí)現(xiàn)設(shè)備負(fù)載監(jiān)控單元的相關(guān)信息獲取和封裝供devfreq框架使用。如果設(shè)備有獨(dú)立的clock和power,一般也需要將其納入到Linux clk子系統(tǒng)和regulator子系統(tǒng)進(jìn)行管理[4]。
2.1 ?devfreq ?driver
devfreq driver只需要完成如下幾步即可完成驅(qū)動(dòng)編碼:
(1)完成驅(qū)動(dòng)自己的devfreq-dev-profile定制。Devfreq-dev-profile結(jié)構(gòu)體的主要成員如下。
polling_ms:devfreq_monitor線程的運(yùn)行周期,單位是ms。
target:調(diào)頻調(diào)壓的具體執(zhí)行方法,一般需要通過(guò)clock子系統(tǒng)和regulator子系統(tǒng)相關(guān)接口實(shí)現(xiàn)。此方法在devfreq_monitor線程中被調(diào)用。
Get-dev-status:通過(guò)調(diào)用event子系統(tǒng)相關(guān)方法獲取當(dāng)前周期內(nèi)設(shè)備負(fù)載相關(guān)信息供governor計(jì)算調(diào)頻目標(biāo)頻點(diǎn)使用。
Get-cur-freq:獲取設(shè)備的當(dāng)前運(yùn)行頻率。
(2)驅(qū)動(dòng)probe階段將本設(shè)備加入到devfreq子系統(tǒng),步驟如下:
從幾個(gè)governor中選擇一個(gè)作為設(shè)備調(diào)頻策略。
以定制的devfreq-dev-profile和選定的governor做參數(shù)調(diào)用devfreq-add-device接口,將本設(shè)備加入到devfreq子系統(tǒng)中。
2.2 ?devfreq ?event ?driver
(1)Devfreq-event-driver只需要完成如下幾步即可完成驅(qū)動(dòng)編碼。完成驅(qū)動(dòng)自己的devfreq-event-ops定制。Devfreq-event-ops結(jié)構(gòu)體的主要成員如下:
disable,停止本設(shè)備負(fù)載監(jiān)控。
enable,開(kāi)啟本設(shè)備性能監(jiān)控。
Get-event,獲取設(shè)備負(fù)載信息。
(2)驅(qū)動(dòng)probe階段將本設(shè)備加入到devfreq event子系統(tǒng),步驟如下:
以定制的devfreq-event-ops為參數(shù)調(diào)用devfreq-event-add-new接口,將本設(shè)備加入到devfreq event子系統(tǒng)中。
3 ? ?結(jié)語(yǔ)
Linux devfreq子系統(tǒng)框架對(duì)設(shè)備調(diào)頻軟硬件相關(guān)復(fù)雜性進(jìn)行了封裝,設(shè)備調(diào)頻驅(qū)動(dòng)只需要按照Linux框架要求并根據(jù)自身硬件特性提供相關(guān)屬性和定制相關(guān)方法即可,大大降低了設(shè)備調(diào)頻驅(qū)動(dòng)開(kāi)發(fā)難度,加快產(chǎn)品上市速度。
片上系統(tǒng)的clock子系統(tǒng)結(jié)構(gòu)通常是樹(shù)狀結(jié)構(gòu),所以單獨(dú)一個(gè)device調(diào)頻往往會(huì)影響到相關(guān)的父子設(shè)備。Linux當(dāng)前的devfreq框架相對(duì)來(lái)說(shuō)還稍顯簡(jiǎn)陋,多用于對(duì)較為獨(dú)立的單一設(shè)備進(jìn)行調(diào)頻調(diào)壓,并沒(méi)有納入到Linux設(shè)備模型中進(jìn)行統(tǒng)一管理。隨著Linux的發(fā)展,后續(xù)如果device的相關(guān)調(diào)頻動(dòng)作納入到設(shè)備模型power相關(guān)操作,集中由內(nèi)核統(tǒng)一管理,根據(jù)硬件拓?fù)浣Y(jié)構(gòu)及dts相關(guān)配置自動(dòng)處理上下游設(shè)備的依賴關(guān)系,devfreq的功能會(huì)更加強(qiáng)大。
[參考文獻(xiàn)]
[1]宋寶華.Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解-基于最新的Linux 4.0內(nèi)核[M].北京:機(jī)械工業(yè)出版社,2010.
[2]周建政,呂柏權(quán).基于linux嵌入式的電源管理的研究[J].儀表技術(shù),2008(1):59-61.
[3]趙婉芳.基于Linux的cpufreq動(dòng)態(tài)電源管理模塊研究[J].現(xiàn)代工業(yè)經(jīng)濟(jì)和信息化,2018(5):72-73,94.
[4]趙婉芳.基于linux的電源管理cpuidle模塊研究及應(yīng)用[J].中國(guó)科技縱橫,2017(22):19,21.
Analysis and application of Linux devfreq subsystem
Zhu Zhenhua
(Zhuhai Quanzhi Polytron Technologies Inc, Zhuhai 519000, China)
Abstract:This paper analyzes the devfreq subsystem framework of Linux kernel, and clarifies the relationship among the key modules in the subsystem. Through the analysis of the subsystem framework, the programming framework of devfreq driver is sorted out, and the future evolution of devfreq framework of Linux kernel is prospected.
Key words:Linux; device frequency modulation; power consumption