Linux 2.6 內(nèi)核中的電源管理技術(shù)綜述-基礎(chǔ)電子_第1頁
Linux 2.6 內(nèi)核中的電源管理技術(shù)綜述-基礎(chǔ)電子_第2頁
Linux 2.6 內(nèi)核中的電源管理技術(shù)綜述-基礎(chǔ)電子_第3頁
Linux 2.6 內(nèi)核中的電源管理技術(shù)綜述-基礎(chǔ)電子_第4頁
Linux 2.6 內(nèi)核中的電源管理技術(shù)綜述-基礎(chǔ)電子_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

精品文檔-下載后可編輯Linux2.6內(nèi)核中的電源管理技術(shù)綜述-基礎(chǔ)電子Cpufreq的由來

隨著energyefficientcomputing和performanceperwatt等概念的推廣以及配置與電源接口ACPI(AdvancedConfigurationandPowerInterface)標準的發(fā)展,目前市場上的主流CPU都提供了對變頻(frequencyscaling)技術(shù)的支持。例如Intel處理器所支持的EnhancedSpeedStep技術(shù)和AMD處理器所支持的PowerNow!技術(shù),另外像的PowerPC、ARM、SPARC和SuperH等處理器中也提供了類似的支持。參考資料中列出了當前Linux2.6內(nèi)核所支持的具備變頻技術(shù)的處理器。需要注意的是,這里要討論的變頻技術(shù)與大家以前所熟知的超頻是兩個不同的概念。超頻是指通過提高電壓等手段讓處理器工作在非標準頻率下的行為,這往往會造成CPU使用壽命縮短以及系統(tǒng)穩(wěn)定性下降等嚴重后果。

而變頻技術(shù)是指CPU硬件本身支持在不同的頻率下運行,系統(tǒng)在運行過程中可以根據(jù)隨時可能發(fā)生變化的系統(tǒng)負載情況動態(tài)在這些不同的運行頻率之間進行切換,從而達到對性能和功耗做到二者兼顧的目的。

雖然多個處理器生產(chǎn)廠家都提供了對變頻技術(shù)的支持,但是其硬件實現(xiàn)和使用方法必然存在著細微甚至巨大的差別。這就使得每個處理器生產(chǎn)廠家都需要按照其特殊的硬件實現(xiàn)和使用方法向內(nèi)核中添加代碼,從而讓自己產(chǎn)品中的變頻技術(shù)在Linux中得到支持和使用。然而,這種內(nèi)核開發(fā)模式所導(dǎo)致的后果是各個廠家的實現(xiàn)代碼散落在Linux內(nèi)核代碼樹的各個角落里,各種不同的實現(xiàn)之間沒有任何代碼是共享的,這給內(nèi)核的維護以及將來添加對新的產(chǎn)品的支持都帶來了巨大的開銷,并直接導(dǎo)致了cpufreq內(nèi)核子系統(tǒng)的誕生。實際上,正如前文所說,發(fā)明變頻技術(shù)的目的是為了能夠讓系統(tǒng)在運行過程中隨時根據(jù)系統(tǒng)負載的變化動態(tài)調(diào)整CPU的運行頻率。這件事情可以分為兩個部分,一部分是“做什么”的問題,另一部分是“怎么做”的問題?!白鍪裁础笔侵溉绾胃鶕?jù)系統(tǒng)負載的動態(tài)變化挑選出CPU合適的運行頻率,而“怎么做”就是要按照選定的運行頻率在選定的時間對CPU進行設(shè)置,使之真正工作在這一頻率上。這也就是我們在軟件設(shè)計中經(jīng)常會遇到的機制mechanism與策略policy的問題,而設(shè)計良好的軟件會在架構(gòu)上保證二者是被清晰的隔離開的并通過規(guī)范定義的接口進行通信。

Cpufreq的設(shè)計和使用

為了解決前文所提到的問題,一個新的內(nèi)核子系統(tǒng)——cpufreq應(yīng)運而生了。Cpufreq為在Linux內(nèi)核中更好的支持不同CPU的變頻技術(shù)提供了一個統(tǒng)一的設(shè)計框架,其軟件結(jié)構(gòu)如圖1所示。

圖1.Cpufreq的軟件結(jié)構(gòu)

如圖1所示,cpufreq在設(shè)計上主要分為以下三個模塊:

Cpufreq模塊(cpufreqmodule)對如何在底層控制各種不同CPU所支持的變頻技術(shù)以及如何在上層根據(jù)系統(tǒng)負載動態(tài)選擇合適的運行頻率進行了封裝和抽象,并在二者之間定義了清晰的接口,從而在設(shè)計上完成了前文所提到的對mechanism與policy的分離。

在cpufreq模塊的底層,各個CPU生產(chǎn)廠商只需根據(jù)其變頻技術(shù)的硬件實現(xiàn)和使用方法提供與其CPU相關(guān)的變頻驅(qū)動程序(CPU-specificdrivers),例如Intel需要提供支持EnhancedSpeedStep技術(shù)的CPU驅(qū)動程序,而AMD則需要提供支持PowerNow!技術(shù)的CPU驅(qū)動程序。

在cpufreq模塊的上層,governor作為選擇合適的目標運行頻率的決策者,根據(jù)一定的標準在適當?shù)臅r刻選擇出CPU適合的運行頻率,并通過cpufreq模塊定義的接口操作底層與CPU相關(guān)的變頻驅(qū)動程序,將CPU設(shè)置運行在選定的運行頻率上。

目前的Linux內(nèi)核中提供了performance、powersave、userspace、conservative和ondemand五種governors供用戶選擇使用,它們在選擇CPU合適的運行頻率時使用的是各自不同的標準并分別適用于不同的應(yīng)用場景。用戶在同一時間只能選擇其中一個governor使用,但是可以在系統(tǒng)運行過程中根據(jù)應(yīng)用需求的變化而切換使用另一個governor。

這種設(shè)計帶來的好處是使得governor和CPU相關(guān)的變頻驅(qū)動程序的開發(fā)可以相互獨立進行,并在限度上實現(xiàn)代碼重用,內(nèi)核開發(fā)人員在編寫和試驗新的governor時不會再陷入到某款特定CPU的變頻技術(shù)的硬件實現(xiàn)細節(jié)中去,而CPU生產(chǎn)廠商在向Linux內(nèi)核中添加支持其特定的CPU變頻技術(shù)的代碼時只需提供一個相對來說簡單了很多的驅(qū)動程序,而不必考慮在各種不同的應(yīng)用場景中如何選擇合適的運行頻率這些復(fù)雜的問題。

內(nèi)核中的cpufreq子系統(tǒng)通過sysfs文件系統(tǒng)向上層應(yīng)用提供了用戶接口,對于系統(tǒng)中的每一個CPU而言,其cpufreq的sysfs用戶接口位于/sys/devices/system/cpu/cpuX/cpufreq/目錄下,其中X代表processorid,與/proc/cpuinfo中的信息相對應(yīng)。以cpu0為例,用戶一般會在該目錄下觀察到以下文件:

$ls-F/sys/devices/system/cpu/cpu0/cpufreq/affected_cpuscpuinfo_cur_freqcpuinfo_max_freq

cpuinfo_min_freqondemand/scaling_available_frequenciesscaling_available_governorsscaling_cur_freqscaling_driverscaling_governorscaling_max_freqscaling_min_freqstats/

這其中的所有可讀文件都可以使用cat命令進行讀操作,另外所有可寫文件都可以使用echo命令進行寫操作。其中cpuinfo_max_freq和cpuinfo_min_freq分別給出了CPU硬件所支持的運行頻率及運行頻率,cpuinfo_cur_freq則會從CPU硬件寄存器中讀取CPU當前所處的運行頻率。雖然CPU硬件支持多種不同的運行頻率,但是在有些場合下用戶可以只選擇使用其中的一個子集,這種控制是通過scaling_max_freq和scaling_min_freq進行的。Governor在選擇合適的運行頻率時只會在scaling_max_freq和scaling_min_freq所確定的頻率范圍內(nèi)進行選擇,這也就是scaling_available_frequencies所顯示的內(nèi)容。與cpuinfo_cur_freq不同,scaling_cur_freq返回的是cpufreq模塊緩存的CPU當前運行頻率,而不會對CPU硬件寄存器進行檢查。scaling_available_governors會告訴用戶當前有哪些governors可供用戶使用,而scaling_driver則會顯示該CPU所使用的變頻驅(qū)動程序。Stats目錄下給出了對CPU各種運行頻率的使用統(tǒng)計情況,例如CPU在各種頻率下的運行時間以及在各種頻率之間的變頻次數(shù)。Ondemand目錄則與ondemandgovernor相關(guān),在后文會進行相應(yīng)的介紹。

通過以上的介紹,大家對如何使用cpufreq通過sysfs提供的用戶接口已經(jīng)有了大致的了解,但是對于絕大部分用戶而言,逐一操作這些文件既費力又耗時。因此Dominik等人開發(fā)了cpufrequtils工具包[2],為用戶提供了更加簡便的對內(nèi)核cpufreq子系統(tǒng)的操作接口。通過cpufreq-info的輸出,讀者可以很清楚的看到剛剛在上面介紹過的/sys/devices/system/cpu/cpuX/cpufreq/目錄下各個文件的內(nèi)容。

$cpufreq-infocpufrequtils002:cpufreq-info(C)DominikBrodowski

2022-2022Reporterrorsandbugstolinux@brodo.de,please.analyzingCPU0:driver:acpi-cpufreqCPUswhichneedtoswitchfrequencyatthesametime:

01hardwarelimits:1000MHz-1.67GHzavailablefrequencysteps:1.67GHz,1.33GHz,1000

MHzavailablecpufreqgovernors:userspace,conservative,

ondemand,powersave,performancecurrentpolicy:frequencyshouldbewithin1000MHz

and1.67GHz.Thegovernor"ondemand"maydecidewhich

speedtousewithinthisrange.currentCPUfrequencyis1000MHz.analyzingCPU1:driver:acpi-cpufreqCPUswhichneedtoswitchfrequencyatthesametime:

01hardwarelimits:1000MHz-1.67GHzavailablefrequencysteps:1.67GHz,1.33GHz,1000

MHzavailablecpufreqgovernors:userspace,conservative,

ondemand,powersave,performancecurrentpolicy:frequencyshouldbewithin1000MHz

and1.67GHz.Thegovernor"ondemand"maydecidewhich

speedtousewithinthisrange.currentCPUfrequencyis1000MHz.

Ondemandgovernor的由來及其實現(xiàn)剛剛我們在cpufreq-info的輸出中可以看到cpufreq子系統(tǒng)一共提供了五種governors供用戶選擇使用,它們分別是userspace,conservative,ondemand,powersave和performance。在的內(nèi)核中如果用戶不進行額外設(shè)置的話,ondemand會被作為默認的governor使用。為了理解是什么原因造成了這種現(xiàn)狀,我們在這里帶領(lǐng)讀者回顧一下cpufreq子系統(tǒng)中的governor在內(nèi)核中的開發(fā)歷史。

Cpufreq作為一個子系統(tǒng)早被加入到Linux內(nèi)核中時只配備了三個governors,分別是performance、powersave和userspace。當用戶選擇使用performancegovernor時,CPU會固定工作在其支持的運行頻率上;當用戶選擇使用powersavegovernor時,CPU會固定工作在其支持的運行頻率上。因此這兩種governors都屬于靜態(tài)governor,即在使用它們時CPU的運行頻率不會根據(jù)系統(tǒng)運行時負載的變化動態(tài)作出調(diào)整。這兩種governors對應(yīng)的是兩種極端的應(yīng)用場景,使用performancegovernor體現(xiàn)的是對系統(tǒng)高性能的追求,而使用powersavegovernor則是對系統(tǒng)低功耗的追求。雖然這兩種應(yīng)用需求確實存在,但大多數(shù)用戶在大部分時間里需要的是更加靈活的變頻策略。早的cpufreq子系統(tǒng)通過userspacegovernor為用戶提供了這種靈活性。正如它的名字一樣,使用userspacegovernor時,系統(tǒng)將變頻策略的決策權(quán)交給了用戶態(tài)應(yīng)用程序,并提供了相應(yīng)的接口供用戶態(tài)應(yīng)用程序調(diào)節(jié)CPU運行頻率使用。通過使用cpufrequtils工具包中的cpufreq-set將userspace設(shè)置為cpufreq子系統(tǒng)所使用的governor后,我們可以看到與之前相比在/sys/devices/system/cpu/cpuX/cpufreq/目錄下多出了一個名為scaling_setspeed的文件,這正是userspacegovernor所提供的特殊用戶接口。用戶可以通過向該文件寫入任何一個scaling_available_frequencies中所支持的運行頻率,從而將CPU設(shè)置在該頻率下運行。

#cpufreq-set-guserspace#catcpuinfo_cur_freq1000000#catscaling_available_frequencies166700013330001000000#echo1333000scaling_setspeed#catcpuinfo_cur_freq1333000

剛剛提到在使用userspacegovernor時,系統(tǒng)將變頻策略的決策權(quán)交給了用戶態(tài)應(yīng)用程序。該用戶態(tài)應(yīng)用程序一般是一個daemon程序,每隔一定的時間間隔收集系統(tǒng)信息并根據(jù)系統(tǒng)的負載情況使用userspacegovernor提供的scaling_setspeed接口動態(tài)調(diào)整CPU的運行頻率。作為這個daemon程序,當時在幾個主要的Linux發(fā)行版中使用的一般是powersaved或者cpuspeed。這兩個daemon程序一般每隔幾秒鐘統(tǒng)計CPU在這個采樣周期內(nèi)的負載情況,并根據(jù)統(tǒng)計結(jié)果調(diào)整CPU的運行頻率。這種userspacegovernor加用戶態(tài)daemon程序的變頻方法雖然為用戶提供了一定的靈活性,但通過開源社區(qū)的廣泛使用所得到的意見反饋逐漸暴露了這種方法的兩個嚴重缺陷。個是性能方面的問題。例如powersaved每隔五秒鐘進行系統(tǒng)負載情況的采樣分析的話,我們可以分析一下在下面給出的應(yīng)用場景中的用戶體驗。假設(shè)powersaved的采樣分析剛剛結(jié)束,而且由于在剛剛結(jié)束的采樣周期內(nèi)系統(tǒng)負載很低,CPU被設(shè)置在頻率上運行。這時用戶如果打開Firefox等對CPU運算能力要求相當高的程序的話,powersaved要在下一個采樣點——大約五秒鐘之后才有機會觀察到這種提高CPU運行頻率的需求。也就是說,在Firefox啟動之初的五秒鐘內(nèi)CPU的計算能力并沒有被充分發(fā)揮出來,這無疑會使用戶體驗大打折扣。第二個是系統(tǒng)負載情況的采樣分析的準確性問題。將監(jiān)控系統(tǒng)負載情況并對未來CPU的性能需求做出判斷的任務(wù)交給一個用戶態(tài)程序完成實際上并不合理,一方面是由于一個用戶態(tài)程序很難完整的收集到所有需要的信息,因為這些信息大部分都保存在內(nèi)核空間;另一方面一個用戶態(tài)程序如果想要收集這些系統(tǒng)信息,必然需要進行用戶態(tài)與內(nèi)核態(tài)之間的數(shù)據(jù)交互,而頻繁的用戶態(tài)與內(nèi)核態(tài)之間的數(shù)據(jù)交互又會給系統(tǒng)性能帶來負面影響。

那么這兩個問題有沒有解決的方法呢?應(yīng)該講社區(qū)中的開發(fā)人員就第二個問題比較容易達成一致,既然在用戶態(tài)對系統(tǒng)的負載情況進行采集和分析存在這樣那樣的問題,那么更加合理的做法就是應(yīng)該將這部分工作交由內(nèi)核負責(zé)。但是個問題呢?個問題直觀的解決方案就是降低對系統(tǒng)負載進行采樣分析的時間間隔,這樣powersaved就能盡早的對系統(tǒng)負載的變化做出及時的響應(yīng)。然而這種簡單的降低采樣分析的時間間隔的方案同樣存在著兩方面的問題,一方面這意味著更加頻繁的用戶態(tài)與內(nèi)核態(tài)之間的數(shù)據(jù)交互,因此必然也就意味著對系統(tǒng)性能帶來更大的負面影響;另一方面的主要原因在于當時各個CPU生產(chǎn)廠家的變頻技術(shù)在硬件上仍不完善,具體體現(xiàn)就是在對CPU進行變頻設(shè)置時所需的操作時間過長,例如Intel早期的Speedstep技術(shù)在對CPU進行變頻設(shè)置時需要耗時250微秒,在此過程中CPU無法正常執(zhí)行指令。讀者如果簡單的計算一下不難發(fā)現(xiàn),即使對于一個主頻為1GHz的CPU而言,250微秒也意味著250,000個時鐘周期,在這期間CPU完全可以執(zhí)行完上萬條指令。因此從這個角度而言,簡單的降低采樣分析的時間間隔對系統(tǒng)性能帶來的負面影響更加嚴重。幸運的是隨著硬件技術(shù)的不斷完善和改進,對CPU進行變頻設(shè)置所需的操作時間已經(jīng)顯著降低,例如Intel的EnhancedSpeedstep技術(shù)在對CPU進行變頻設(shè)置時耗時已降至10微秒,下降了不止一個數(shù)量級。正是這種CPU硬件技術(shù)的發(fā)展為內(nèi)核開發(fā)人員解決這些早期的遺留問題提供了契機,Venkatesh等人提出并設(shè)計實現(xiàn)了一個新的名為ondemand的governor,它正是人們長期以來希望看到的一個完全在內(nèi)核態(tài)下工作并且能夠以更加細粒度的時間間隔對系統(tǒng)負載情況進行采樣分析的governor。在介紹ondemandgovernor的具體實現(xiàn)之前,我們先來看一下如何使用ondemandgovernor及其向用戶提供了哪些操作接口。通過cpufreq-set將ondemand設(shè)置為當前所使用的governor之后,在/sys/devices/system/cpu/cpuX/cpufreq目錄下會出現(xiàn)一個名為ondemand的子目錄

$sudocpufreq-set-gondemand$ls/sys/devices/system/cpu/cpu0/cpufreq/ondemand/ignore_nice_loadpowersave_biassampling_ratesampling_rate_maxsampling_rate_minup_threshold$sudocatsampling_rate_minsampling_rate

sampling_rate_max400008000040000000$sudocatup_threshold30

在這個子目錄下名字以sampling打頭的三個文件分別給出了ondemandgovernor允許使用的短采樣間隔,當前使用的采樣間隔以及允許使用的長采樣間隔,三者均以微秒為單位。

以筆者的電腦為例,ondemandgovernor每隔80毫秒進行采樣。另外比較重要的一個文件是up_threshold,它表明了系統(tǒng)負載超過什么百分比時ondemandgovernor會自動提高CPU的運行頻率。以筆者的電腦為例,這個數(shù)值為30%。那么這個表明系統(tǒng)負載的百分比數(shù)值是如何得到的呢?在支持Intel的EnhancedSpeedstep技術(shù)的CPU中,在處理器硬件中直接提供了兩個MSR寄存器(ModelSpecificRegister)供ondemandgovernor采樣分析系統(tǒng)負載情況使用。這兩個MSR寄存器的名字分別為IA32_MPERF和IA32_APERF[5],其中IA32_MPERFMSR中的MPERF代表MaximumPerformance,IA32_APERFMSR中的APERF代表ActualPerformance。就像這兩個MSR的名字一樣,IA32_MPERFMSR寄存器是一個當CPU處在ACPIC0狀態(tài)下時按照CPU硬件支持的運行頻率每隔一個時鐘周期加一的計數(shù)器;IA32_APERFMSR寄存器是一個當CPU處在ACPIC0狀態(tài)下時按照CPU硬件當前的實際運行頻率每隔一個時鐘周期加一的計數(shù)器。有了這兩個寄存器的存在,再考慮上CPU處于ACPIC0和處于ACPIC1、C2、C3三種狀態(tài)下的時間比例,也就是CPU處于工作狀態(tài)和休眠狀態(tài)的時間比例,ondemandgovernor就可以準確的計算出CPU的負載情況了。

得到了CPU的負載情況,接下來的問題就是如何選擇CPU合適的運行頻率了。剛剛在前面提到,當系統(tǒng)負載超過up_threshold所設(shè)定的百分比時,ondemandgovernor將會自動提高CPU的運行頻率,但是具體提高到哪個頻率上運行呢?在ondemandgovernor監(jiān)測到系統(tǒng)負載超過up_threshold所設(shè)定的百分比時,說明用戶當前需要CPU提供更強大的處理能力,因此ondemandgovernor會將CPU設(shè)置在頻率上運行,這一點社區(qū)中的開發(fā)人員和廣大用戶都沒有任何異議。但是當ondemandgovernor監(jiān)測到系統(tǒng)負載下降,可以降低CPU的運行頻率時,到底應(yīng)該降低到哪個頻率呢?ondemandgovernor的初實現(xiàn)是在可選的頻率范圍內(nèi)調(diào)低至下一個可用頻率,例如筆者使用的CPU支持三個可選頻率,分別為1.67GHz、1.33GHz和1GHz,如果CPU運行在1.67GHz時ondemandgovernor發(fā)現(xiàn)可以降低運行頻率,那么1.33GHz將被選作降頻的目標頻率。這種降頻策略的主導(dǎo)思想是盡量減小對系統(tǒng)性能的負面影響,從而不會使得系統(tǒng)性能在短時間內(nèi)迅速降低以影響用戶體驗。但是在ondemandgovernor的這種初實現(xiàn)版本在社區(qū)發(fā)布后,大量用戶的使用結(jié)果表明這種擔(dān)心實際上是多余的,ondemandgovernor在降頻時對于目標頻率的選擇完全可以更加激進。因此的ondemandgovernor在降頻時會在所有可選頻率中性選擇出可以保證CPU工作在80%以上負荷的頻率,當然如果沒有任何一個可選頻率滿足要求的話則會選擇CPU支持的運行頻率。大量用戶的測試結(jié)果表明這種新的算法可以在不影響系統(tǒng)性能的前提下做到更高效的節(jié)能。在算法改進后,ondemandgovernor的名字并沒有改變,而ondemandgovernor初的實現(xiàn)也保存了下來,并且由于其算法的保守性而得名conservative。

支持IntelEnhancedSpeedstep技術(shù)的CPU驅(qū)動程序的實現(xiàn)前文在討論cpufreq的軟件結(jié)構(gòu)時已經(jīng)指出,cpufreq從設(shè)計上將CPU變頻的policy與mechanism分離開來并由上層的governor負責(zé)決定CPU合適的工作頻率。但是在governor根據(jù)系統(tǒng)負載的變化決定調(diào)整CPU的運行頻率時,終還是需要底層與CPU相關(guān)的特定驅(qū)動程序完成設(shè)置CPU運行頻率的任務(wù)。這里向讀者介紹一下支持Intel的EnhancedSpeedstep技術(shù)的CPU驅(qū)動程序的實現(xiàn)原理,關(guān)注的重點是如何對CPU進行變頻設(shè)置。實際上支持IntelEnhancedSpeedstep技術(shù)的處理器為用戶提供了非常簡單的編程接口,對CPU運行頻率進行設(shè)置是通過一個名為IA32_PERF_CTL的MSR寄存器進行的,另外還有一個名為IA32_PERF_ST

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論