張 正,賈小林
(西南科技大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 RFID&IOT實(shí)驗(yàn)室,四川 綿陽(yáng) 621000)
NB-IoT被廣泛應(yīng)用于環(huán)境監(jiān)控、安全檢測(cè)等重要領(lǐng)域,這類設(shè)備的硬件資源通常非常有限(通常為IETF定義的三類設(shè)備[1]),其設(shè)備中大多運(yùn)行宏內(nèi)核RTOS,例如:RT-Thread[2]、FreeRTOS[3]、uC/OS-II[4]。這種宏內(nèi)核的設(shè)計(jì)思想,整個(gè)系統(tǒng)組件、設(shè)備驅(qū)動(dòng)、內(nèi)存管理、線程調(diào)度、網(wǎng)絡(luò)棧等都被包含在特權(quán)內(nèi)核中。內(nèi)核中出現(xiàn)的錯(cuò)誤將會(huì)導(dǎo)致整個(gè)系統(tǒng)的崩潰,并且內(nèi)核之間的模塊可能出現(xiàn)潛在的相互依賴使得模塊化程度降低,此外宏內(nèi)核的初始化中包含了許多導(dǎo)致系統(tǒng)啟動(dòng)變慢的流程,會(huì)影響系統(tǒng)的開機(jī)速度。為解決以上問(wèn)題,出現(xiàn)了各類的微內(nèi)核操作系統(tǒng),例如:Chorus[5]、Mach[6]、L4[7]、seL4[8]等。這類內(nèi)核通常只提供以下幾類硬件抽象:(1)虛擬內(nèi)存管理:將虛擬地址映射到物理地址;(2)線程抽象和調(diào)度;(3)進(jìn)程間通信(IPC)。其余的文件系統(tǒng)、網(wǎng)絡(luò)協(xié)議棧等都被隔離在內(nèi)核之外。
在NB-IoT設(shè)備上實(shí)現(xiàn)微內(nèi)核有一定的難度,主要原因在于其處理器上不包含MMU,整個(gè)系統(tǒng)只有單地址空間,DL2實(shí)現(xiàn)困難。DL2作為微內(nèi)核實(shí)現(xiàn)的重要技術(shù),保證了微內(nèi)核系統(tǒng)中的軟件模塊可以實(shí)時(shí)動(dòng)態(tài)地加載到系統(tǒng)中進(jìn)行運(yùn)行。目前,適用于NB-IoT設(shè)備的操作系統(tǒng)比較多:(1)Contiki[9]、uC/OS-II、uC/OS-III[10]、RIOT[11]、FreeRTOS[3]、uCLinux[12]、Linux、SenSpire OS[13]、RT-Thread、mbedOS[14]、TinyOS[15]等操作系統(tǒng)在物聯(lián)網(wǎng)上得到廣泛使用,但都為宏內(nèi)核操作系統(tǒng),甚至部分操作系統(tǒng)還并不支持DL2技術(shù);(2)seL4、VxWorks[16]、Chorus等在設(shè)計(jì)之初就被設(shè)計(jì)為微內(nèi)核操作系統(tǒng),支持DL2技術(shù),但是內(nèi)存占用較高,在NB-IoT設(shè)備中并不適用[8]。
目前,對(duì)于NB-IoT設(shè)備還沒有適用的微內(nèi)核操作系統(tǒng),該文針對(duì)NB-IoT設(shè)備硬件資源較少的情況,對(duì)現(xiàn)有的DL2技術(shù)進(jìn)行優(yōu)化,設(shè)計(jì)并實(shí)現(xiàn)了無(wú)MMU的nM-MKRTOS,實(shí)現(xiàn)了加載速度和傳輸開銷的優(yōu)化。nM-MKRTOS通過(guò)優(yōu)先加載配置策略,實(shí)現(xiàn)了核心功能的優(yōu)先加載,提高NB-IoT系統(tǒng)的啟動(dòng)速度。此外利用DL2技術(shù),實(shí)現(xiàn)了模塊間的內(nèi)存復(fù)用策略,能夠減少NB-IoT系統(tǒng)的成本,提高內(nèi)存利用率。
FreeRTOS、RT-Thread等系列操作系統(tǒng),在設(shè)計(jì)之初就采用了宏內(nèi)核的設(shè)計(jì)方式,宏內(nèi)核通過(guò)統(tǒng)一編譯的方式,在運(yùn)行階段會(huì)帶來(lái)一定的性能提升。但也導(dǎo)致宏內(nèi)核需要設(shè)計(jì)者做大量的配置工作,并且其大量組件被一同編譯運(yùn)行,會(huì)拖慢開機(jī)速度。該文設(shè)計(jì)的nM-MKRTOS內(nèi)核包含內(nèi)存管理、任務(wù)間通信(Inter Process Communication,IPC)、調(diào)度管理模塊與DL2模塊,如圖1所示。
圖1 微內(nèi)核操作系統(tǒng)結(jié)構(gòu)
(1)調(diào)度管理模塊:該模塊進(jìn)行任務(wù)調(diào)度,采用搶占式任務(wù)調(diào)度算法。
(2)任務(wù)間通信模塊:任務(wù)間通信通過(guò)共享內(nèi)存、消息隊(duì)列等方式實(shí)現(xiàn)。
(3)內(nèi)存管理模塊:對(duì)系統(tǒng)的內(nèi)存進(jìn)行管理。
(4)DL2模塊:DL2模塊用于對(duì)模塊進(jìn)行快速加載并執(zhí)行。對(duì)于每一個(gè)動(dòng)態(tài)加載的模塊,會(huì)進(jìn)行初始化;對(duì)于每一個(gè)動(dòng)態(tài)加載的應(yīng)用,會(huì)初始化并創(chuàng)建進(jìn)程。
(5)策略優(yōu)化模塊:該模塊包含了加載策略優(yōu)化,用于提高系統(tǒng)的開機(jī)速度;此外還包含了內(nèi)存“卸載”功能,通過(guò)將掛起進(jìn)程的內(nèi)存“卸載”到外部存儲(chǔ)模塊,達(dá)到內(nèi)存復(fù)用的目的。
不同的微內(nèi)核系統(tǒng)的設(shè)計(jì)結(jié)構(gòu)基本一致,故模塊2、3不是該文描述的重點(diǎn);模塊1中包含了搶占式任務(wù)調(diào)度程序,其任務(wù)狀態(tài)與普通RTOS有差異;模塊4中包含了DL2模塊,用于在設(shè)備上實(shí)現(xiàn)程序模塊的動(dòng)態(tài)加載,是提高系統(tǒng)開機(jī)速度和實(shí)現(xiàn)內(nèi)存復(fù)用的核心技術(shù);模塊5實(shí)現(xiàn)了開機(jī)加載策略并實(shí)現(xiàn)了內(nèi)存復(fù)用,是核心模塊。
任務(wù)調(diào)度算法為微內(nèi)核的核心模塊,對(duì)于NB-IoT來(lái)說(shuō),系統(tǒng)要求對(duì)于某些緊急任務(wù)做出最快的處理(如:環(huán)境檢測(cè)報(bào)警),這就要求系統(tǒng)擁有一定的實(shí)時(shí)性。該系統(tǒng)中的任務(wù)調(diào)度算法,采用搶占式設(shè)計(jì),但支持同優(yōu)先級(jí)任務(wù)時(shí)間片輪轉(zhuǎn)執(zhí)行。系統(tǒng)任務(wù)調(diào)度算法示意圖如圖2所示。
圖2 實(shí)時(shí)調(diào)度算法
系統(tǒng)維持一個(gè)按照優(yōu)先級(jí)順序排列的雙向鏈表,鏈表的每一個(gè)節(jié)點(diǎn)中存放的是同優(yōu)先級(jí)的任務(wù)。變量x將存放最高優(yōu)先級(jí)任務(wù)的頭節(jié)點(diǎn),每次最高優(yōu)先級(jí)任務(wù)被掛起或阻塞時(shí),會(huì)查找最高優(yōu)先級(jí)節(jié)點(diǎn)以更新x。在x未發(fā)生變化時(shí),其調(diào)度算法的時(shí)間復(fù)雜度為O(1),在發(fā)生變化時(shí),其調(diào)度算法復(fù)雜度為O(n),n為系統(tǒng)中優(yōu)先級(jí)的個(gè)數(shù)。在x發(fā)生變化時(shí),利用位圖的方式進(jìn)行查找,其算法復(fù)雜度還可以優(yōu)化,但是要求系統(tǒng)最大任務(wù)數(shù)與優(yōu)先級(jí)必須在編譯時(shí)就確定,使得系統(tǒng)靈活性降低,所以這里不進(jìn)行論述。
圖3中,系統(tǒng)中的任務(wù)總共包含6種狀態(tài):掛起、就緒、運(yùn)行、卸載、阻塞、被阻塞。掛起狀態(tài)為用戶執(zhí)行Suspend操作時(shí)掛起任務(wù),只有執(zhí)行Resume才能將任務(wù)恢復(fù)為就緒狀態(tài);阻塞狀態(tài)為任務(wù)延時(shí)、等待事件等都會(huì)進(jìn)入阻塞狀態(tài);卸載狀態(tài)為用戶執(zhí)行Unload操作將任務(wù)“卸載”到外部存儲(chǔ)設(shè)備,只有執(zhí)行Load操作才能夠恢復(fù),并執(zhí)行Unload與Load將會(huì)占用較多的時(shí)間。
圖3 任務(wù)狀態(tài)轉(zhuǎn)換示意圖
DL2用于微內(nèi)核中模塊動(dòng)態(tài)加載與執(zhí)行,可加載文件體積與加載速度都會(huì)影響系統(tǒng)性能。在許多物聯(lián)網(wǎng)操作系統(tǒng)中,如SenSpire OS[13],都實(shí)現(xiàn)了DL2,并且針對(duì)其使用的場(chǎng)合進(jìn)行優(yōu)化。該文參考了文獻(xiàn)[17-18]中DL2的實(shí)現(xiàn),并優(yōu)化可加載文件大小與符號(hào)表。
在標(biāo)準(zhǔn)的可執(zhí)行可鏈接格式(Executable Linkable Format,ELF)文件中包含了許多的段,如圖4所示,然而這些段不參與程序的執(zhí)行,通過(guò)對(duì)這些段的優(yōu)化,能夠減少可加載文件的體積,在網(wǎng)絡(luò)傳輸時(shí)能夠明顯提高速度,減少能耗。
圖4 tDLL文件格式與ELF文件格式
在標(biāo)準(zhǔn)ELF中,符號(hào)表被分成了很多類,并且某些符號(hào)表之間還存在一定的關(guān)系。符號(hào)表中存儲(chǔ)了函數(shù)、變量、重定向變量等信息,系統(tǒng)依靠符號(hào)表完成函數(shù)的重定向,ELF在符號(hào)表中利用Hash表對(duì)符號(hào)表進(jìn)行快速查找,但是當(dāng)符號(hào)數(shù)量增多時(shí),Hash表的碰撞會(huì)導(dǎo)致性能下降。該文對(duì)符號(hào)表進(jìn)行了修改與整合,如表1所示,在符號(hào)表中添加預(yù)鏈接信息(目標(biāo)符號(hào)在目標(biāo)庫(kù)中的偏移地址),在進(jìn)行重定向時(shí),通過(guò)使用預(yù)鏈接信息則無(wú)需在目標(biāo)符號(hào)表中進(jìn)行查找,查找效率為O(1)。
表1 符號(hào)表
系統(tǒng)內(nèi)核的加載、系統(tǒng)硬件初始化、內(nèi)核軟件的初始化、用戶軟件的初始化等都會(huì)影響系統(tǒng)開機(jī)速度。在使用宏內(nèi)核操作系統(tǒng)的設(shè)備中,系統(tǒng)通常包含了眾多的功能,整個(gè)軟硬件系統(tǒng)全部初始化完畢則標(biāo)志著整個(gè)系統(tǒng)啟動(dòng)完畢。然而對(duì)于使用者來(lái)說(shuō)通常只關(guān)心一部分功能亦或者一部分功能需要提前啟動(dòng),而這部分功能的啟動(dòng)只占用整個(gè)系統(tǒng)啟動(dòng)的一部分時(shí)間。利用微內(nèi)核的DL2所具備的優(yōu)勢(shì),將系統(tǒng)任務(wù)按照啟動(dòng)權(quán)重進(jìn)行劃分,利用優(yōu)先加載策略,能夠?qū)崿F(xiàn)系統(tǒng)快速啟動(dòng)。
圖5 系統(tǒng)模塊劃分有向加權(quán)圖
在整個(gè)系統(tǒng)中,不同功能對(duì)應(yīng)不同的模塊子集序列,這些序列通過(guò)施加權(quán)值的方式?jīng)Q定其啟動(dòng)的順序。例如:任務(wù)I中希望序列J2被最先加載執(zhí)行,則對(duì)于子集權(quán)重的分配為公式(2)~公式(4)。
(1)
J1={I0,I1,I4,I7,I10}*k1
(2)
J2={I0,I1,I2,I4,I5,I8,I11}*k2
(3)
J3={I0,I2,I3,I5,I6,I9,I12}*k3
(4)
其中,k2>(k1,k3)∈N,上述公式表示,J2擁有最高權(quán)重,其任務(wù)功能序列最先被加載。
在有MMU的處理器中,通過(guò)“交換內(nèi)存”實(shí)現(xiàn)內(nèi)存的復(fù)用,即通過(guò)外部存儲(chǔ)設(shè)備作為內(nèi)存存放的臨時(shí)區(qū)域,使得運(yùn)行程序的規(guī)模能夠超過(guò)內(nèi)存所支持的大小。但NB-IoT設(shè)備通常沒有MMU,開發(fā)者通常只能夠使用硬件所限制的內(nèi)存大小。該文利用微內(nèi)核的優(yōu)勢(shì),提出模塊內(nèi)存“卸載”策略,即在系統(tǒng)中執(zhí)行的任務(wù)具有時(shí)間上的不相關(guān)性,則這些任務(wù)也可以使用類似“交換內(nèi)存”的方式實(shí)現(xiàn)內(nèi)存的重復(fù)利用。
內(nèi)存復(fù)用能夠使得系統(tǒng)運(yùn)行更多的應(yīng)用,但也帶來(lái)了性能損失,通常將其用于對(duì)應(yīng)用要求不高的場(chǎng)合,這對(duì)于NB-IoT的場(chǎng)合非常適用,在NB-IoT場(chǎng)景中其通常要求周期性地進(jìn)行工作,對(duì)系統(tǒng)的時(shí)延要求并不嚴(yán)格。在微內(nèi)核的系統(tǒng)中運(yùn)行的任務(wù)可以用圖6表示,定義任務(wù)規(guī)則P=(r,k,I,b,p,a,Rt,t),其中:
(1)r為RAM所需空間,r<系統(tǒng)可用RAM空間;
(2)k為ROM所需空間,k<系統(tǒng)可用ROM空間;
(3)I為之后需要執(zhí)行的任務(wù)集(為-1代表下一個(gè)任務(wù)為空);
(4)b為前驅(qū)任務(wù)集;
(5)p為執(zhí)行該模塊前需執(zhí)行的動(dòng)作(0:保持,1:掛起;2:恢復(fù);3:卸載到外部?jī)?nèi)存;4:加載到內(nèi)部?jī)?nèi)存);
(6)a為當(dāng)前任模塊到下一個(gè)模塊所執(zhí)行的動(dòng)作;
(7)Rt為模塊運(yùn)行間隔;
(8)t為運(yùn)行時(shí)間。
在圖6中,通過(guò)配置r、k、I、p與a可以指定模塊I1與I2的啟動(dòng)順序與動(dòng)作,通過(guò)配置Rt與t可以實(shí)現(xiàn)時(shí)間不相關(guān)模塊的內(nèi)存復(fù)用(如:I2與I1)。
圖6 任務(wù)內(nèi)存復(fù)用示意
實(shí)驗(yàn)中,使用了真實(shí)的硬件設(shè)備,見圖7,其系統(tǒng)RAM為64 KB,系統(tǒng)ROM為512 KB,系統(tǒng)主頻為72 MHz,在本節(jié)的所有實(shí)驗(yàn)中,都采用該配置的處理器。
圖7 測(cè)試硬件
該文對(duì)可加載文件的大小以及加載速度進(jìn)行了優(yōu)化,為此編寫了7個(gè)模塊,對(duì)比ELF可加載文件在相同模塊下的體積大小。在圖8中,該文的可加載文件體積相比于ELF,是標(biāo)準(zhǔn)ELF文件大小的10.4%~68.4%。可加載文件體積的優(yōu)化,意味著在NB-IoT網(wǎng)絡(luò)傳輸過(guò)程中能夠節(jié)省更多的時(shí)間與能耗。
圖8 可加載文件大小對(duì)比
為對(duì)比該可加載文件與ELF文件在加載后執(zhí)行性能的差異,利用幾種經(jīng)典的排序算法進(jìn)行性能比較,測(cè)試結(jié)果如圖9所示。在幾種排序算法中,只有在選擇排序測(cè)試中,性能損失了6.1%,其他排序算法在對(duì)比中幾乎沒有差異。
圖9 執(zhí)行性能對(duì)比
為測(cè)試系統(tǒng)啟動(dòng)速度,編寫了一個(gè)測(cè)試程序,該程序與真實(shí)場(chǎng)景相對(duì)應(yīng),其模塊劃分見圖5,系統(tǒng)執(zhí)行遠(yuǎn)程數(shù)據(jù)采集、上報(bào)與控制任務(wù),其包含三個(gè)任務(wù)子集J1、J2與J3,每個(gè)子集包含若干模塊,定義其啟動(dòng)規(guī)則為公式(5)~公式(7)。
(5)
(6)
(7)
在系統(tǒng)未按權(quán)重進(jìn)行加載時(shí),系統(tǒng)總啟動(dòng)時(shí)間為1 290 ms,在分別設(shè)置模塊子集加載權(quán)重為:(2,1,1)、(1,2,1)、(1,1,2),三個(gè)模塊子集其啟動(dòng)時(shí)間分別為:547 ms,612 ms,676 ms,即權(quán)重加載啟動(dòng)方式相比于未按權(quán)重加載其三個(gè)模塊的啟動(dòng)時(shí)間分別減少了57.59%、52.55%與47.59%。
在內(nèi)存復(fù)用測(cè)試的測(cè)試中,編寫與4.2節(jié)中相同的應(yīng)用測(cè)試模塊,4個(gè)應(yīng)用模塊的加載規(guī)則為公式(8)。
(8)
在規(guī)則中,I0為系統(tǒng)OS內(nèi)核;I1與I2為應(yīng)用程序,執(zhí)行周期分別為2 s與1 s,其為周期任務(wù),可以做到時(shí)間上不相交,并且I1與I2同時(shí)運(yùn)行其需要的RAM空間必然超過(guò)系統(tǒng)總空間。通過(guò)內(nèi)存復(fù)用可提高RAM內(nèi)存的利用效率,在本測(cè)試中,內(nèi)存利用率提高56.25%。
針對(duì)NB-IoT設(shè)備資源少、穩(wěn)定性要求高、系統(tǒng)對(duì)外界響應(yīng)性強(qiáng)等特點(diǎn),設(shè)計(jì)并實(shí)現(xiàn)了nM-MKRTOS。該系統(tǒng)采用微內(nèi)核的設(shè)計(jì)思想,其任務(wù)調(diào)度算法采用搶占式調(diào)度策略,利用模塊優(yōu)先加載策略提高系統(tǒng)的開機(jī)速度,并且針對(duì)時(shí)間上不相關(guān)的模塊,實(shí)現(xiàn)了內(nèi)存復(fù)用策略,提高了內(nèi)存的利用率。在編寫的測(cè)試案例中,系統(tǒng)的開機(jī)時(shí)間分別減少57.59%、52.55%與47.59%,內(nèi)存利用率提高45.83%。此外,該系統(tǒng)采用微內(nèi)核的思想,其能夠最大程度上保證內(nèi)核的安全,防止驅(qū)動(dòng)、文件系統(tǒng)等出現(xiàn)的問(wèn)題影響系統(tǒng)的工作。nM-MKRTOS系統(tǒng)能夠應(yīng)用于環(huán)境監(jiān)測(cè)、智慧農(nóng)業(yè)等各個(gè)場(chǎng)合,在降低系統(tǒng)成本的同時(shí),還能夠提高系統(tǒng)的安全性與穩(wěn)定性。
計(jì)算機(jī)技術(shù)與發(fā)展2022年10期