文獻標識碼:B 文章編號:1003-0492(2022)03-056-06 中圖分類號:TP316
★王訓,周東紅(寧波和利時智能科技有限公司,浙江寧波315048)
摘要:工業物聯網領域的設備具有配置多樣的硬件環境特點,這種“碎片化”的特征催生了對應操作系統很強的伸縮性需求,以實現不同底層硬件和功能部件進行抽象,對上層提供統一的編程接口,為工業物聯網打造良好生態環境提供基礎。
1 引言
工業物聯網系統中適配的操作系統特殊的使用場景決定了其除具備傳統操作系統的設備資源管理功能外,還具備下列功能:屏蔽工業物聯網碎片化的特征,提供統一的編程接口;工業物聯網生態環境培育;降低工業物聯網應用開發的成本和時間;為工業物聯網統一管理奠定基礎。由此可見,工業物聯網操作系統對實現智能制造、智能工廠等當前熱門領域均起著至關重要的作用。
對工業物聯網操作的技術要求包括:內核尺寸伸縮性強,能適應不同配置的硬件平臺;內核實時性強,以滿足關鍵應用的需要;內核架構可擴展性強,且足夠安全和可靠;操作系統核心、設備驅動程序或應用程序均可遠程升級;支持文件系統和外部存儲;支持遠程配置、遠程管理等維護功能;支持完善的網絡功能等。而微內核架構的操作系統可完全滿足上述應用需求,故本文針對微內核操作系統的技術發展及關鍵技術進行深入研究。
2 微內核操作系統技術發展
2.1 傳統操作系統介紹
目前常見的EMO S(嵌入式操作系統)有幾十種,但很多數是在物聯網興起之前就有,隨著物聯網概念的提升,這些操作系統都宣稱加入了物聯網特性的支持,而專門針對物聯網全新研發的嵌入式操作系統還是剛剛起步。
目前主流的嵌入式實時操作系有:Linux及實時性或輕量化的變種、uCOS—II、FreeRTOS、eCos、VxWorks、Nucleus、ThreadX、QNX等。它們主要特點是面向控制、通信等領域的實時性,輕量化,可定制裁剪,部分安全。但很少有一個操作系統同時擁有上述所有特點,比如具有強實時性的,可能安全性上有所減弱;具有安全特性的,可能在性能上做出犧牲等。
如今幾乎所有的操作系統都聲稱有一些物聯網連接功能,現有的操作系統大多數符合下列屬性:使用內存少、電源效率高、模塊化可配置通信堆棧,對特定的無線和傳感器技術提供強有力的支持。一些項目注重物聯網安全,許多非Linux操作項目專注于實時確定性(Real-time Determinism),這也是工業物聯網的一個要求。
2.2 微內核操作系統的發展歷程
內核按照軟件架構可以分為微內核(Micro kernel)和宏內核(Monolithic kernel)兩種概念。
微內核結構是由一個非常簡單的硬件抽象層和一組比較關鍵的原語或系統調用組成。這些原語,僅僅包括了建立一個系統必需的幾個部分,如線程管理、地址空間和進程間通信等。微內核的目標是將系統服務的實現和系統的基本操作規則分離開來。例如,進程的輸入/ 輸出鎖定服務可以由運行在微內核之外的一個服務組件 來提供。這些非常模塊化的用戶態服務器用于完成操作 系統中比較高級的操作,使最內核部分的設計更簡單。 一個服務組件的失效并不會導致整個系統的崩潰,內核 需要做的,僅僅是重新啟動這個組件,而不必影響其它 的部分。微內核將許多OS服務放入分離的進程,如文件系統、設備驅動程序,而進程通過消息傳遞調用OS服務。
宏內核架構的特性是整個內核程序都是以內核空間(Kernel Space)的身份及監管者模式(Supervisor Mode)來運行。相對于其它類型的操作系統架構,如微內核架構或混內核架構等,會附加一些后臺服務以及系統調用,通過這種方式來實現各種操作系統服務,如進程管理、共時(Concurrency)控制、存儲器管理等。即使有的宏內核將其運作從整體性運作拆分成幾個服務模塊,并讓各模塊各自運作,其操作系統的代碼依然是高度緊密的,很難修改成其他類型的操作系統架構。此外,所有的模塊也都在同一塊定址空間內運行,倘若某個模塊有錯誤,運行時就會損及整個操作系統運行。Linux就是比較典型的宏內核操作系統。
輕量化、可裁剪,適用于工業現場的穩定性和安全性等指標,意味著微內核架構是個不錯的選擇。
在微內核剛興起時,學術界普遍認為其優點是顯而易見的:
(1)支持更加模塊化的設計;
(2)小的內核更易于更新與維護,bug會更少。正如大家知道Windows的死機很多是由D evice Drivers造成的。如果把它們移出內核,它們中的bug很可能就不會造成死機;
(3)許多模塊的bug可被封閉在其模塊內,更加易于調試。如果文件系統、內存管理和設備驅動成為一個個獨立的進程,則會讓Kernel維護更加高效,也十分有利于縮短整個操作系統的研發時間。
基于上述原因,很多學術研究人員和軟件廠家開始嘗試使用微內核的概念設計操作系統。第一代微內核操作系統的代表作品是Mach,由卡內基梅隆大學(CMU)設計,Mach發布了2個版本,主要完成了以下工作:從概念上驗證了微內核技術的可行性;在多處理器計算機上進行移植驗證了微內核在多處理器計算機上的運行;使用共享內存機制完成進程間通信(InterProcess Communication,IPC),從而提高了IP C的效率。后期甚至微軟也有所動作,在設計Windows NT時,他們把UI (User Interface)從Windows kernel中整個拿了出來。但是這一熱潮很快就冷了下來,原因就是性能問題。微軟在Windows NT后續版本中,又把部分底層UI放回了Windows kernelo正如在Java剛開始流行時,由于其具有許多C/ C++沒有的優點,很多人認為它會很快取代C/C++成為第一編程語言。但直至今天也沒有發生,其中一個重要原因就是Java程序的性能落后于C程序,至今還限制著它在許多場合的應用。
第一代的微內核操作系統的性能,包括Mach在內,遠不及宏內核操作系統。所以大多數人又回到傳統技術中去了。但在九十年代后期,微內核迎來了其生命中的第二春。一些研究人員認真分析了微內核系統性能差的原因,指出其性能差并非由根本內在的因素造成,而是設計實現的失誤。為證明其論點,他們設計并實現了幾個性能遠超第一代的微內核操作系統,我們把它們稱為第二代微內核系統。其中的一個代表作品就是德國計算科學家Jochen Liedtke設計的L4OL4不再是傳統Unix操作系統的簡單重構,而是一種全新的設計。L4微內核高性能的關鍵就是使用了同步IPC技術,并且使用寄存器傳遞消息,而不是內存拷貝。基于L4微內核,Jochen Liedtke提出了一種構建服務器模式操作系統的方法,整個系統服務由一系列服務器組成,比如內存管理服務器、文件系統服務器等,每個服務器在對外提供服務的同時也可以調用其他服務器提供的服務。
由于第二代微內核設計為了追求高性能,線程ID是一種全局共享靜態資源,任何任務中的線程都可以通過線程ID向其他服務器線程發起服務請求,造成了安全上的隱患。第三代微內核應運而生,引入了Capability機制。任何操作系統內核對象,比如線程、中斷和內存等,都不能直接進行操作,而是通過一種類似對象引用的機制即Capability進行調用。目前,比較經典支持Capability機制的第三代微內核seL40seL4是在第二代微內核L4基礎上發展而來,因而其不僅繼承了L4微內核高性能的優點,還具備基于斷點的IPC機制。這種機制最大的特點就是使用了能力空間的概念,進程在使用IPC請求系統服務時必須具備相對應的能力,并持有不可偽造的令牌來表示擁有請求某種服務的能力。令牌可以被復制,可以被轉移,還可以通過IPC進行傳輸oSeL4是一個操作系統微內核,也就是說,seL4本身不是一個完整的操作系統,它提供很有限的API,沒有提供像傳統的操作系統Linux那樣的內存管理、頁內外交換、驅動程序等oSeL4微內核設計針對實時應用,可潛在應用于強調安全和關鍵性任務的領域內,如軍用和醫療行業。研究發現常用的攻擊方法對seL4無效,如惡意程序經常采用的緩存溢出漏洞。
正因為微內核原生的諸多優勢,目前其內核架構越來越被人們重視,被認為其是一種面對未來的操作系統架構。互聯網巨頭公司,同時也是操作系統研發的龍頭公司Google,在其以Linux宏內核為操作系統內核開發的Android操作系統成功以后,它已經在積極地開發全新內核的操作系統fuchsia,這一操作系統將不再是Linux宏內核系統的衍生版,而是真正意義上的微內核操作系統。并且,它將是一款基于權能安全機制的操作系統。無獨有偶,國內通信巨頭華為公司,在完成自主研發的處理器芯片麒麟系列以后,其自主研發的微內核架構操作系統鴻蒙系統也正式推向市場。從全球性公司研發目標中可以看到,微內核是被當代各大全球性公司認可的內核架構,也是未來非常有前景的一種內核架構,其發展將會越來越標準化0而且,據稱無論是fuchsia系統還是鴻蒙系統都將會大大發揮微內核中內核服務分離的優勢,它將在多種平臺上運行,包括智能手機的嵌入式設備和個人PC,并且還將兼容Android系統上的各種應用。這種高分離性是微內核架構的優勢,同時也是宏內核架構為何始終無法將PC和智能移動終端進行統一的一大原因。從宏內核U NIX發展的起點——標準化和輕便型,到Google最終選擇摒棄宏內核而使用微內核來開發下一代全新操作系統,不難看出,微內核的思想是非常符合包括工業物聯網在內的未來社會發展的需要。在未來,微內核發展有望開發出顛覆傳統操作系統環境,將PC、移動智能終端以及嵌入式設備進行統一的,具有跨時代意義的微內核操作系統[1]。
3 微內核操作系統關鍵技術解析
3.1 實時任務調度技術
為了滿足工業物聯網產品應用需求,該微內核操作系統支持兩種任務調度策略:基于優先級的搶占式調度策略、時間片輪轉策略,并支持多級優先級配置。
應用任務可以通過接口創建另一個任務,并設置該任務的優先級。出于安全性考慮,當一個任務創建另外一個任務時,只能把另外一個任務優先級設置不高于該任務,即任務不能創建比自己優先級還高的子任務。
基于優先級的搶占式調度策略采用基于位圖的調度算法,該調度算法將每個任務的優先級映射到了一個調度的二維表,該二維表用32個字節表示,每個字節8位,一共256位,共代表256個優先級,如圖1所示。
圖1 微內核操作系統任務優先級示意圖
將操作系統所有處于Ready狀態的任務按照上 述關系映射到該優先級位圖中。操作系統在每次進 行任務(假定其優先級為prio)調度時,首先從位圖 中選擇出優先級最高的任務,選擇過程通過上圖中 的ScheduleRdyGrp映射優先級最高組Y,然后通過ScheduleRdyBitMap進行映射確定在Y組中X列中的最高 優先級。任務就緒時需要計算其對應的ScheduleRdyGrp和ScheduleRdyTbl[n]值,其具體算法為:ScheduleRdyGrp |= ScheduleRdyBitMap[prio>>3]; ScheduleRdyTbl[prio>>3] |= ScheduleRdyBitMap[prio&0x07]; 上面所述的X、Y映射關系表OSPriHighMap,偽 代碼如圖2所示。
圖2 微內核操作系統基于位圖的優先級映射關系
這樣無論系統負載高低,都能夠使系統任務調度切換時間復雜度相同,從而提高系統調度的確定性。查詢任務就緒態下的優先級可以最終抽象為如下表示。對于相同優先級的任務進行采用輪轉調度算法,每個優先級任務對應一組任務隊列,依次進行輪轉調度。
Y = OSPriHighMap[ScheduleRdyGrp];
X = OSPriHighMap[ScheduleRdyTbl[Y]];
prio = Y<<3 + X;
3.2 進程間高效IP C通信技術
為了解決進程間通信效率問題,微內核操作系統設計了一種基于用戶空間共享內存的進程間通信機制,該機制采用進程間內存授權管理的方法,建立了高效的消息隊列、事件、信號量通信機制。通過該技術的應用,能夠有效避免進程通信過程中內核空間與用戶空間切換頻繁問題,并提升進程間通信安全性。
seL4微內核提供了線程間傳遞消息的機制,這個機制也用來傳遞用戶程序與內核提供的服務之間的通信。消息被傳送到同步或異步IPC端點,這些端點由其它線程約定,其它消息類型由內核[2]。
每個消息包含一些消息字,還可以包含一些句柄。消息的傳遞是盡量通過通用寄存器來完成,但是硬件平臺的通用寄存器的數量是十分有限的,在寄存器放不下的就要放到被稱為IPC緩存(IPC buffer)的內存中,每個線程控制塊有一個IPC通信用的緩存區buffer,用來在IPC或內核對象調用時傳遞額外的參數,所謂額外的參數,即無法存儲在寄存器里的數據,不同的平臺可以使用的寄存器不同,所以這個定義與平臺相關。每個IPC消息包含一個標識,其數據結構包含標簽label、消息長度length、句柄數量extraCaps、接收句柄capsUnwrapped等4個字段。消息的長度和句柄的數量決定了消息寄存器的使用及發送線程想要傳遞的句柄的數量。內核不解釋label字段°label字段只是被當作消息的第一個數據被傳送。用戶程序可以對label字段進行自定義°capsUnwrapped字段只被接收方使用,用來指明哪個句柄被接收。
同步端點允許少量的數據及句柄在線程間同步傳遞。所謂同步,即信息發出去后發送者要等待應答。如果發送者不是要發送的狀態,而且接收者正好處于接收狀態,這個消息就不被傳遞。如果發出IP C同步請求,沒有接收者準備好,則阻塞,排隊等待,直到有接收者,則消息發送給第一個準備好了的接收者。如果發出等待請求給內核,但沒有線程向它發消息,則阻塞并排隊等待請求,直到有發送者,就接收第一個發送者的消息。同步消息中可以有句柄,消息中的句柄必須有Grant權限,沒有Grant權限的句柄,不會隨消息的傳遞而傳遞。句柄存在于消息的caps字段,caps中的每一項被當作CPTR解釋為線程句柄空間中的一個句柄。消息中句柄的數量存于消息標記(message tag)中的extraCaps字段中。基本的IPC概念是端點(EndPoint)之間的任務。端點是一個內核對象,其中包含了一個線程隊列和一個狀態(state)標志,該標志用來記錄隊列中的線程是處于要發送(Send)消息的狀態,還是處于等待接收消息(Wait)的狀態。它扮演了一個“一個或多個發送者”與“一個或多個接收者”之間單向通信的作用。這個全局的標識符是不暴露給參與IPC的各方的,無論是發送者,還是接收者,都是使用一個本地端點地址來工作。一個端點上,可能有多個線程用來發送或接收消息。當一個線程對調用端點發送與接收消息時,內核將扮演在它們之間傳遞消息的角色。沒有伙伴的線程,即僅有發送任務無接收任務,或僅有接收任務無發送任務,將被掛起(suspend),算法中并未規定,哪些線程首先被喚醒(resume),一般是先進先出(FIFO)。
異步端點(Asynchronous EndPoint,AsyncEP)允許非阻塞異步發送消息,但異步消息中不能有句柄。
因為同一時間一個端點(EndPoint)只能接收一個消息,而一個服務者希望為N個客戶端提供服務,于是每個客戶端都拿到了這個端點的一個引用,內核提供了一個標記(badge)的辦法,有標記的句柄就是標記句柄(badged endpoint capability)。每個標記由產生它的服務線程(Server)定義,因為這個句柄就是服務線程通過C Node_Mint()之類的手段得到的。
在一些應用場景中,一個動作涉及到多個請求方,如果這時權限符合配置策略規則,這些請求任務就會同時發出同樣的消息,可是,只有一個句柄是接收方所調用的,所以作為接收者,當接通收到消息后,要檢査一下標記,看是哪個請求方標識。也就是作為服務接收者在解析服務請求時,要通過標記的方式檢査一下來源,檢測消息發送者的合法性。內核提供了標識(identify)系統,可以通過査看標識的方式追溯消息來源。
3.3 安全內存管理技術
為了解決工業嵌入式產品軟件內存異常帶來的安全故障問題,在微內核操作系統軟件架構中利用內存管理單元硬件,建立內核與用戶內存空間隔離的管理機制。該機制能夠將內核空間與用戶所占用的內存空間、用戶空間的進程與進程之間內存隔離。經驗證測試,該技術能夠有效解決某一軟件模塊內存溢出所帶來的整體系統內存數據故障問題,從而提高內存管理的安全性。
微內核架構下不為內核對象動態分配內存,內核對象必須在用戶程序控制的內存區中通過U ntyped Memory句柄創建。這個機制可以顯式地控制應用程序能夠使用的內存數量,提供應用程序間的內存隔離。在系統啟動的時候,先預申請一塊內存給內存用,包括代碼、數據、棧等段。余下的內存留給初始化線程,初始線程啟動時,還有一些其它的內核句柄傳給它。新創建的原始內存對象都是最初的這個原始內存對象的子對象。用戶態程序利用Untyped_Retype()創建對象,得到的是句柄,通過這個句柄進行后續操作。把虛擬地址管理、虛實映射管理、物理內存(原始內存)管理等分開,每一部分都允許應用程序自己決定如何使用的內存管理策略,對于應用程序申請內核對象,在客戶程序間分享授權信息。內核也提供原始內存重用機制,重用一段內存區域是允許的,但要求那段原始內存上沒有搖擺的引用,即沒有別的句柄指向這段內存空間,跟蹤對象的引用、繼承關系。其不允許頁表共享,但允許頁共享。
內核啟動過程建立虛擬地址與物理地址的映射關系。以ZYNQ7000芯片為例,操作系統內核建立的地址映射關系如圖3所示。
圖3 微內核操作系統虛擬地址與物理地理映射實例
線程(Thread)是程序執行單位,程序通過管理線程來管理CPU時間及程序執行的上下文環境。線程管理數據結構是線程控制塊(Thread Control Block, TCB)。每個線程控制塊都有一個句柄空間cspace和虛擬地址空間vspace與之關聯。虛擬地址空間vspace可以同時被多個線程共享°vspace分配虛擬內存時,首先選擇一個合適的虛擬地址,然后找到一塊合適的物理內存,接下來標記物理內存被使用,然后將虛擬地址返回給用戶ovspace實現的虛擬內存,類似于Linux系統的虛擬內存映射(mmap),所以當申請的空間小于4kB時會分配4kB空間。
微內核操作系統的內存共享是基于頁的,要共享頁必須將頁加入對應程序的頁表。一個頁被N個程序加入自己的頁表,這個頁就是共享內存。cspace用于創建每個內核對象對應的句柄空間。每個內核對象必須對應一個句柄空間,每次創建內核對象,必須先分配句柄空間,App隨后創建并初始化alloc.cspace。
4 典型應用
和利時集團基于微內核架構已經設計出自己的面向工業物聯網的微內核操作系統,并成功應用于公司的DCS、SIS、PLC、MC等系列產品,目前已經支持了ARM.MIPS.POWERP等主流嵌入式處理器平臺,并分別在基于ZYNQ7000系列芯片、龍芯2K1000系列芯片、MPC83XX系列芯片的控制器硬件基礎上,完成了操作系統的開發與驗證測試工作。
具體的微內核操作系統的設計方案如圖4所示。
圖4 基于微內核操作系統的應用開發分層圖
5 結論
本文通過研究微內核操作系統的技術發展過程及關鍵技術,得出其具備易于擴充、易于移植、可提高系統的可靠性、提供多種操作環境、適宜于分布式計算、有助于多處理器系統的實現、支持實時服務等特點,因此其是當前完全適用于工業物聯網應用場景的輕量級操作系統。
作者簡介:
王訓(1983-),男,北京人,高級工程師,學士,現就職于寧波和利時智能科技有限公司,主要研究方向為工業自動化軟件。
周東紅(1970-),男,浙江東陽人,高級工程師,博士,現就職于寧波和利時智能科技有限公司,主要研究方向為工業自動化控制及工業物聯網。
參考文獻:
[1]彭星海.基于X86架構的微內核操作系統的研究和實現[D].成都:電子科技大學,2020.
[2]林禹清.面向控制領域的微內核系統服務的設計與實現[D].成都:電子科技大學,2019.
[3]錢振江.微內核架構內存管理的形式化設計和驗證方法研究[J].電子學報,2017, 45⑴:251 -256.
摘自《自動化博覽》2022年第三期