石文昌,宋 元,周春喜
(中國人民大學信息學院,北京 100872)
隨著處理器制造工藝的不斷進步以及多核架構(gòu)的成功,多核處理器成為現(xiàn)代處理器的主流選擇,并且處理器中核的數(shù)目越來越多,如Intel推出了80核的處理器原型Teraflop[1],Tilera公司推出全球首款100核處理器TILE-Gx100[2]。
一直以來,計算機軟件的發(fā)展遠遠落后于硬件的發(fā)展。如何盡可能發(fā)揮硬件的性能,一直是研究人員必須面對的問題。多核處理器的出現(xiàn),對如何發(fā)揮硬件的性能提出新的挑戰(zhàn),但同時也為優(yōu)化軟件性能帶來新的機遇。國際上有不少工作致力于新型多核操作系統(tǒng)的研究,如Corey[3]、Multikernel[4]、fos[5]、ROS[6]、OpenPiton[7]、Arrakis[8]、LegoOS[9]等。此外,Boydwickizer等[10]、Siddha等[11]以及許多工作團隊[12-14]圍繞多核處理器對現(xiàn)代操作系統(tǒng)造成的影響展開討論。但多核的潛力并沒有得到充分挖掘,許多問題還有待研究。
如何應對多核處理器帶來的挑戰(zhàn),國際上有很多研究。Corey[3]、Multikernel[4]、fos[5]、ROS[6]等都是不同于傳統(tǒng)通用操作系統(tǒng)設計理念的新型操作系統(tǒng)的設計成果。Boydwickizer等[10]認為Linux內(nèi)核可適用于多核處理器,Siddha等[11]分析了多核調(diào)度面臨的挑戰(zhàn)。
完整性度量方法的研究一直是國際上的熱點,研究人員開展了大量的研究工作,我們在這方面也已開展不少工作[15-17]。Upen AEGIS系統(tǒng)[18]等為建立可信的系統(tǒng)運行環(huán)境,結(jié)合硬件在系統(tǒng)引導的過程中進行系統(tǒng)完整性度量。IMA系統(tǒng)[19]等在可執(zhí)行內(nèi)容裝載時,對其進行完整性檢查。Copilot系統(tǒng)[20]通過增加一個獨立于主機的硬件協(xié)處理器,實現(xiàn)對運行中的系統(tǒng)的內(nèi)存映象進行完整性度量。NFORCE系統(tǒng)[21]借助Intel處理器的SMM特性,對Linux操作系統(tǒng)的內(nèi)核映象和執(zhí)行中的進程進行度量。LKIM系統(tǒng)[22]借助內(nèi)核的關鍵數(shù)據(jù)結(jié)構(gòu),基于內(nèi)核的執(zhí)行流度量Linux內(nèi)核的完整性。SBCFI[23]等通過控制流完整性的角度來動態(tài)監(jiān)控操作系統(tǒng)內(nèi)核的完整性。OSck[24]通過掃描內(nèi)核堆來對內(nèi)核數(shù)據(jù)的完整性進行度量。但是現(xiàn)有的這些工作都沒有涉及如何利用多核資源來進行完整性度量的實施,而這正是本研究所關注的內(nèi)容。
提高信息系統(tǒng)的安全可信程度是業(yè)界長期追求的目標[25],我國網(wǎng)絡安全法明文規(guī)定要推廣應用安全可信的網(wǎng)絡安全產(chǎn)品[26]。系統(tǒng)完整性度量是建立系統(tǒng)可信性的關鍵技術,國際上完整性度量的研究和系統(tǒng)開發(fā)都很活躍,并從不同方面對操作系統(tǒng)的完整性進行度量,如Upen AEGIS系統(tǒng)[18]、IMA系統(tǒng)[19]、Copilot系統(tǒng)[20]、NFORCE系統(tǒng)[21]、LKIM系統(tǒng)[22]、SBCFI[23]、OSck[23]、LBM[27]、BehaviorKI[28]、DRIVE[29]、Container-IMA[30]、OB-IMA[31]、CloudMonatt[32]等。但是在這個領域中,針對內(nèi)核完整性度量機制如何充分利用多核處理器潛能的研究還很少。現(xiàn)有的操作系統(tǒng)內(nèi)核,如Linux內(nèi)核,在設計時沒有將內(nèi)核完整性度量機制考慮在內(nèi),不能很好地對內(nèi)核完整性度量機制提供及時度量的支持;現(xiàn)有的研究成果鮮有涉及如何利用多核來實施內(nèi)核完整性度量機制;一些簡單的方法可以實現(xiàn)及時度量的目的,但卻會造成較大的性能開銷。針對這些問題,本研究提出一種基于多核的完整性度量實施方法,該方法通過在操作系統(tǒng)內(nèi)核中加入對內(nèi)核完整度量機制進行及時度量的支持機制,來實現(xiàn)及時度量并盡量減小性能開銷的目標。
為了能夠真實地反映操作系統(tǒng)的完整性狀態(tài),內(nèi)核完整性度量機制需要對正在運行中的操作系統(tǒng)進行完整性度量,即對操作系統(tǒng)進行實時度量。
多核處理器出現(xiàn)之前,在單核系統(tǒng)上進行實時度量時,由于內(nèi)核完整性度量機制的引入,加重了原有系統(tǒng)的負載,并且內(nèi)核完整性度量機制和系統(tǒng)中其他任務競爭核資源運行,經(jīng)常不能及時運行。多核處理器出現(xiàn)之后,雖然有多個核可以同時用于運行任務,但是在對操作系統(tǒng)內(nèi)核進行實時度量時,這種情況依然存在。歸根結(jié)底是由于操作系統(tǒng)內(nèi)核在進行設計時沒有考慮內(nèi)核完整性度量機制,更沒有使其實現(xiàn)及時度量的機制存在。即使內(nèi)核完整性度量機制能夠準確地度量并反映內(nèi)核的完整性狀態(tài),但是由于內(nèi)核完整性度量機制不能及時運行,度量結(jié)果也將不能及時反映操作系統(tǒng)內(nèi)核的真實狀態(tài)。
針對現(xiàn)有操作系統(tǒng)中,完整性度量機制實施時存在的這些問題,亟須一種適合多核計算機系統(tǒng)的完整性度量實施方法。這種方法應該可以讓內(nèi)核完整性度量機制對操作系統(tǒng)內(nèi)核進行及時度量,且其度量結(jié)果可以及時反映內(nèi)核狀態(tài)。及時度量是指完整性度量機制可以在需要運行時,優(yōu)先獲取核資源并得到及時運行,對系統(tǒng)進行實時度量。
內(nèi)核完整性度量機制是引入到操作系統(tǒng)內(nèi)核中的一種新機制。它作為操作系統(tǒng)內(nèi)核的一部分,對操作系統(tǒng)內(nèi)核其他部分的完整性進行度量。操作系統(tǒng)內(nèi)核的很多工作都以內(nèi)核線程的方式進行處理,這里研究的內(nèi)核完整性度量機制也將以內(nèi)核線程的形式出現(xiàn),我們稱其為內(nèi)核完整性度量任務。
在多核計算機系統(tǒng)上,如何使得內(nèi)核完整性度量機制對操作系統(tǒng)內(nèi)核進行及時度量,從本質(zhì)上來說是為內(nèi)核完整性度量任務分配核(CPU)資源,并優(yōu)先調(diào)度其多核調(diào)度的問題。
操作系統(tǒng)通過調(diào)度算法這一內(nèi)核的關鍵部分控制CPU資源在任務之間的分配。一個好的調(diào)度算法是增加系統(tǒng)吞吐量、縮短系統(tǒng)響應時間、維護系統(tǒng)各個任務間平等關系的關鍵。
現(xiàn)代操作系統(tǒng)內(nèi)核根據(jù)系統(tǒng)中任務的不同特性進行分類,并對不同類型的任務執(zhí)行不同的調(diào)度策略。本文針對國內(nèi)外應用廣泛的Linux操作系統(tǒng)進行研究。Linux內(nèi)核將任務分為4類,并為實時類的任務提供First in First Out(FIFO)調(diào)度策略和Round Robin (RR)調(diào)度策略(圖1)。前者實現(xiàn)了簡單的、先入先出的調(diào)度算法;后者與前者大致相同,只是任務在耗盡事先分配給它的時間片后才進行調(diào)度。此外,Linux內(nèi)核還引入了調(diào)度類(Scheduling Class)[33]——一種結(jié)構(gòu)化可擴展的調(diào)度算法模塊。調(diào)度類封裝了調(diào)度策略的細節(jié),使得調(diào)度算法的核心可以不必關心各調(diào)度策略的具體實現(xiàn)。圖1對Linux內(nèi)核(2.6.39)調(diào)度類及其實現(xiàn)的調(diào)度策略進行了說明。
圖1 Linux中的調(diào)度類及其調(diào)度策略Fig.1 Scheduling classes and scheduling policies in Linux
核完整性度量機制對操作系統(tǒng)內(nèi)核進行及時度量,才能及時反映系統(tǒng)的完整性狀態(tài),因此內(nèi)核完整性度量任務的特點有兩個:(1)運行時,需要及時得到核資源調(diào)度運行;(2)運行時,可以一直運行到度量工作完成而盡量不被打斷。它的這些特點與操作系統(tǒng)中采用FIFO調(diào)度策略的實時任務特點最相似,一旦開始就會運行到工作結(jié)束,但是這些任務需要等到比它先開始運行的同類任務運行結(jié)束后才可以運行,并且有可能被高優(yōu)先級的任務搶占。
現(xiàn)有的調(diào)度算法,如Linux內(nèi)核的調(diào)度算法無法為完整性度量機制提供充分的支持,這是因為他們作為通用操作系統(tǒng)調(diào)度算法,在設計之初就沒有考慮到內(nèi)核完整性度量實施任務的存在。所以,完整性度量實施方法中須加入對內(nèi)核完整性度量任務進行調(diào)度的機制,以達到及時度量的目的。
本方案在現(xiàn)有的調(diào)度算法中加入對內(nèi)核完整性度量機制的支持,使得內(nèi)核完整性度量任務可以得到核資源并調(diào)度。修改后的調(diào)度算法對內(nèi)核完整性度量任務和系統(tǒng)中的其他任務執(zhí)行不同的調(diào)度過程。方案如圖2所示,在調(diào)度時機到來時,調(diào)度程序檢查當前是否有內(nèi)核完整性度量任務需要運行,如果是,將當前運行調(diào)度程序的核分配給內(nèi)完整性度量任務,并調(diào)度它運行;如果否,按原調(diào)度算法調(diào)度系統(tǒng)中的其他任務運行。
圖2 方法整體流程Fig.2 Flow chart of our scheme
總體來說,本方案的關鍵是對完整性度量任務和系統(tǒng)中的其他任務分別進行管理,執(zhí)行不同的調(diào)度過程。目標是及時為內(nèi)核完整性度量任務分配核資源,進行及時調(diào)度,進而達到及時度量的目的。
Linux實現(xiàn)了多種調(diào)度策略,而這些調(diào)度策略的具體實現(xiàn)都封裝在調(diào)度類中,本研究需要選擇最適合的調(diào)度算法(調(diào)度類),在其中加入對內(nèi)核完整性度量任務的支持。
如圖1所示,Linux內(nèi)核實現(xiàn)了4個調(diào)度類。內(nèi)核完整性度量任務的特點與實時任務的特征最相似,且Linux的4個調(diào)度類中fair_sched_class、rt_sched_class可用于對內(nèi)核完整性度量任務進行調(diào)度,其他兩個調(diào)度類只適用于特定類型任務的調(diào)度。兩個可取的調(diào)度類中,前者的優(yōu)先級低于后者,且對前者的修改會影響系統(tǒng)中大多數(shù)任務的運行調(diào)度,因此本研究選擇在實時調(diào)度類中加入對內(nèi)核完整性度量任務的支持。
在實時調(diào)度類rt_sched_class中加入對內(nèi)核完整性度量任務的支持,使得內(nèi)核完整性度量任務可以優(yōu)先于系統(tǒng)中其他任務得到核資源并調(diào)度運行。
如表1所示,調(diào)度類提供了封裝后調(diào)度算法的接口,供主調(diào)度函數(shù)schedule()調(diào)用。在每次調(diào)度時機到來時,schedule()會調(diào)用調(diào)度類的pick_next_task函數(shù)選取下一個運行的任務,pick_next_task_rt是函數(shù)schedule()在實時調(diào)度類中的實現(xiàn)。本研究在函數(shù)schedule()中加入內(nèi)核完整性度量任務是否需要運行的判斷條件,優(yōu)先為其分配核資源調(diào)度運行。
表1 調(diào)度類結(jié)構(gòu)的主要入口函數(shù)Table 1 Main entry functions of scheduling class structure
當調(diào)度時機沒有到來,內(nèi)核完整性度量任務便被喚醒時,我們希望它可以搶占當前正在運行的任務。通過check_preempt_curr_rt觸發(fā)一次新的調(diào)度時機可以實現(xiàn)這一目標。需要注意的是,內(nèi)核完整性度量任務不能搶占如負載均衡內(nèi)核線程migration等任務。
通過對內(nèi)核完整性度量任務進行設置,使其可以被調(diào)度算法中的內(nèi)核完整性度量支持機制辨識,得到優(yōu)先調(diào)度。
將內(nèi)核完整性度量任務設置為實時任務,使其按照修改后的實時調(diào)度算法調(diào)度運行;將其調(diào)度策略設置為FIFO,并設置較高的優(yōu)先級,使其在處于運行狀態(tài)時,不會被其他實時任務搶占。另外,需要初始化內(nèi)核完整性度量任務的標識變量,作為調(diào)度算法辨識內(nèi)核完整性度量任務的標識。
以Linux為基礎,直接修改2.6.39版本內(nèi)核上實現(xiàn)了該方法的原型系統(tǒng)。整個實驗是在Dell Power Edge R510服務器上進行的,處理器為Intel Xeon E5620 CPU,操作系統(tǒng)是Ubuntu 11.04 Desktop。以一個周期性運行的內(nèi)核完整性度量方法對該度量實施方法的有效性進行驗證。
實驗結(jié)果表明,在未采用本完整性度量實施方法的原始系統(tǒng)中,內(nèi)核完整性度量任務會因為系統(tǒng)中的其他任務而延遲執(zhí)行,盡管當時系統(tǒng)的負載不重;在采用本完整性度量實施方法的系統(tǒng)中,即使在有大量普通任務和實時任務運行的情況下,當完整性度量任務需要運行時,完整性度量實施方法仍能為其分配核資源,使其及時得到調(diào)度運行。此外,根據(jù)unixbench性能測試結(jié)果(表2),采用本方法的新內(nèi)核運行內(nèi)核完整性度量機制,相較于原始系統(tǒng)運行內(nèi)核完整性度量機制,性能消耗僅為0.32%。
表2 性能測試結(jié)果Table 2 Results of performance test
本研究設計并實現(xiàn)一種基于多核處理器的完整性度量實施方法,提供對內(nèi)核完整性度量的實施支持,使其可以對內(nèi)核進行及時度量。新加入操作系統(tǒng)內(nèi)核的內(nèi)核完整性度量機制作為操作系統(tǒng)內(nèi)核的一部分,無法保證自身的完整性,它的完整性以及度量實施方法的完整性要采用其他方法來保證,這部分工作有待進一步研究。
本方法對以一個內(nèi)核線程存在的內(nèi)核完整性度量機制的實施進行探索,當內(nèi)核完整性度量任務較多時,動態(tài)地分配多個核進行度量是下一步的工作方向。