国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

一種面向微內(nèi)核操作系統(tǒng)的權(quán)能機(jī)制設(shè)計(jì)

2023-11-10 15:11:10張藝川鄒仕洪
關(guān)鍵詞:共享內(nèi)存權(quán)能內(nèi)核

姜 博,張藝川,易 力,王 雷,姜 哲,鄒仕洪,3

1(北京航空航天大學(xué) 計(jì)算機(jī)學(xué)院 軟件開發(fā)環(huán)境國家重點(diǎn)實(shí)驗(yàn)室,北京 100191)

2(元心信息科技集團(tuán)有限公司,北京 100013)

3(北京郵電大學(xué) 網(wǎng)絡(luò)空間安全學(xué)院,北京 100876)

1 引 言

在微內(nèi)核架構(gòu)中,權(quán)能(Capability)是對(duì)進(jìn)程所擁有的資源的一種描述,是一種無法偽造的權(quán)威令牌[1].權(quán)能的概念最早在1966年被提出,用來解決多用戶系統(tǒng)中的權(quán)限問題[2].在實(shí)際應(yīng)用中,訪問控制列表(Access Control List)是一種廣泛使用的操作系統(tǒng)權(quán)限管理機(jī)制.Linux、Windows等經(jīng)典操作系統(tǒng)與INTEGRITY[3]、PikeOS[4]等商用操作系統(tǒng)均使用該機(jī)制來實(shí)現(xiàn)權(quán)限控制,但該機(jī)制不能解決如混淆代理人(Confused deputy)[5]的權(quán)限泄露問題.相比于訪問控制列表,基于權(quán)能的系統(tǒng)在權(quán)限的劃分上粒度更細(xì),每個(gè)進(jìn)程在每個(gè)資源上擁有的權(quán)限都會(huì)通過權(quán)能詳細(xì)列出;此外,基于權(quán)能的系統(tǒng)在分配權(quán)能時(shí)遵循最小特權(quán)原則[6],從而使其得以解決上述問題.

一個(gè)標(biāo)準(zhǔn)的權(quán)能結(jié)構(gòu)一般由兩個(gè)部分組成:該權(quán)能描述的資源的相關(guān)信息(如地址、類型等)和持有該權(quán)能的進(jìn)程所獲得的對(duì)該資源的權(quán)限集合[7].為了保證每一個(gè)權(quán)能結(jié)構(gòu)唯一不變地確定一個(gè)資源對(duì)象,該結(jié)構(gòu)中的指向資源的指針被設(shè)計(jì)為自創(chuàng)建之后便無法修改.因此,在使用權(quán)能機(jī)制的操作系統(tǒng)中,進(jìn)程在對(duì)資源執(zhí)行操作前必須首先獲得與其綁定的權(quán)能,并通過該權(quán)能提供的調(diào)用完成對(duì)資源的操作.通過這種方式,進(jìn)程可以訪問的資源被限制在其權(quán)能空間中,不會(huì)超出其完成任務(wù)所必需的資源范圍,從而實(shí)現(xiàn)了權(quán)限細(xì)粒度化與特權(quán)最小化,響應(yīng)了用戶對(duì)系統(tǒng)安全性的需求[8,9].

MOS是一個(gè)運(yùn)行在ARMv8上的微內(nèi)核操作系統(tǒng),它是北京航空航天大學(xué)操作系統(tǒng)教學(xué)科研團(tuán)隊(duì)設(shè)計(jì)完成的,用于支撐北航操作系統(tǒng)實(shí)驗(yàn)教學(xué)和實(shí)時(shí)領(lǐng)域的科研工作.MOS內(nèi)核中提供了內(nèi)存管理、進(jìn)程調(diào)度、中斷處理、進(jìn)程間通信以及一些基礎(chǔ)的系統(tǒng)調(diào)用,但是它仍然缺乏完善的權(quán)限管理機(jī)制.本工作針對(duì)此問題,首先對(duì)MOS系統(tǒng)中的內(nèi)核對(duì)象進(jìn)行分類處理,統(tǒng)計(jì)各個(gè)對(duì)象的類型,進(jìn)而定義出各類型的對(duì)象所對(duì)應(yīng)的權(quán)能類型;之后在內(nèi)核中添加了權(quán)能的訪問權(quán)限體系與訪問控制功能,并實(shí)現(xiàn)了權(quán)能的創(chuàng)建、構(gòu)造、復(fù)制、移動(dòng)、刪除這五種基本操作;此外還在用戶態(tài)設(shè)計(jì)了一套進(jìn)程間通信接口,并實(shí)現(xiàn)了一個(gè)進(jìn)程服務(wù)器,以此為其他用戶態(tài)進(jìn)程提供權(quán)能授予和撤銷的相關(guān)接口;最后基于實(shí)現(xiàn)好的權(quán)能機(jī)制,為用戶態(tài)應(yīng)用程序提供了動(dòng)態(tài)內(nèi)存管理、內(nèi)存共享、消息隊(duì)列等一系列標(biāo)準(zhǔn)C庫函數(shù)接口.

2 相關(guān)工作

本章將介紹操作系統(tǒng)中典型的權(quán)能系統(tǒng)設(shè)計(jì),以及權(quán)能系統(tǒng)在物聯(lián)網(wǎng)、區(qū)塊鏈等方向上的相關(guān)工作..

seL4[10]操作系統(tǒng)是L4微內(nèi)核操作系統(tǒng)家族的一員,也是第一個(gè)經(jīng)過了形式化驗(yàn)證,從數(shù)學(xué)的角度驗(yàn)證了其安全性的操作系統(tǒng),其在車載系統(tǒng)[11]、航空電子系統(tǒng)[12]、嵌入式[13]等方向有著良好的應(yīng)用前景.微內(nèi)核操作系統(tǒng)最初被提出,是為了解決宏內(nèi)核操作系統(tǒng)的可靠性與穩(wěn)定性問題:宏內(nèi)核操作系統(tǒng)將驅(qū)動(dòng)等服務(wù)進(jìn)程全部包括在內(nèi)核中,使得系統(tǒng)內(nèi)核容易崩潰;而在微內(nèi)核系統(tǒng)中系統(tǒng)內(nèi)核不會(huì)受到服務(wù)進(jìn)程出錯(cuò)的影響,從而在可靠性與穩(wěn)定性上優(yōu)于宏內(nèi)核[14].但在早期的微內(nèi)核(如Mach和MINIX)中,進(jìn)程間通信機(jī)制遠(yuǎn)遠(yuǎn)慢于宏內(nèi)核中的系統(tǒng)調(diào)用機(jī)制;當(dāng)時(shí),Unix系統(tǒng)中一次系統(tǒng)調(diào)用大約需要10μs,而微內(nèi)核中的進(jìn)程間通信則需要100μs[15].不過,隨著系統(tǒng)技術(shù)的進(jìn)一步發(fā)展,通信開銷的問題在L4等微內(nèi)核系統(tǒng)中得到了解決,而如何提升安全性成為了微內(nèi)核的新的命題.作為第一個(gè)被形式化驗(yàn)證的操作系統(tǒng),seL4使用了權(quán)能機(jī)制來實(shí)現(xiàn)其安全性.在seL4中,權(quán)能被分為通信節(jié)點(diǎn)、虛擬地址空間、物理頁幀等多種類型,每個(gè)用戶進(jìn)程擁有其獨(dú)立的權(quán)能空間,規(guī)定了該進(jìn)程能夠訪問的資源集合;seL4還為各應(yīng)用程序提供了一套包括權(quán)能復(fù)制、移動(dòng)、刪除等操作的權(quán)能操作接口[16].此外,seL4中所有的權(quán)能通過一個(gè)叫做權(quán)能派生樹(Capability Derivation Tree)的結(jié)構(gòu)來進(jìn)行追蹤:在啟動(dòng)時(shí),系統(tǒng)中僅存在一大塊無類型的權(quán)能;隨著權(quán)能的不斷派發(fā),最開始的無類型權(quán)能被不斷的切分、派生,并最終轉(zhuǎn)型為應(yīng)用中的各類權(quán)能.

Barrelfish是一個(gè)面向異構(gòu)與多核體系的操作系統(tǒng),由微軟劍橋研究院與蘇黎世理工大學(xué)共同提出[17].Barrelfish同樣采用了權(quán)能結(jié)構(gòu)來保障操作系統(tǒng)的安全性.在Barrelfish中,權(quán)能的類型包括虛擬內(nèi)存、未被映射的物理內(nèi)存、內(nèi)核中的數(shù)據(jù)控制塊等;與seL4不同,Barrelfish規(guī)定了一套樹狀的轉(zhuǎn)型規(guī)則,滿足該規(guī)則的兩類權(quán)能之間可以相互轉(zhuǎn)換.在權(quán)能的組織上,Barrelfish與seL4類似,采用了其將權(quán)能集合作為樹節(jié)點(diǎn)的機(jī)制,并在每個(gè)進(jìn)程中保存其權(quán)能對(duì)應(yīng)的樹的根節(jié)點(diǎn)地址.在權(quán)能的查找上,Barrelfish使用了兩級(jí)查找機(jī)制:樹節(jié)點(diǎn)中存放權(quán)能表的表項(xiàng)地址,表項(xiàng)中存放所對(duì)應(yīng)的權(quán)能地址.在查找進(jìn)程是否擁有對(duì)應(yīng)權(quán)能時(shí),操作系統(tǒng)需要從根節(jié)點(diǎn)向下查找,直至找到對(duì)應(yīng)權(quán)能或確定查找失敗為止.

RedLeaf[18]是使用Rust語言編寫的、為了研究操作系統(tǒng)構(gòu)成受語言特性的影響而搭建的操作系統(tǒng).該操作系統(tǒng)使用Rust本身的語言特性而非物理地址分配實(shí)現(xiàn)了進(jìn)程之間的隔離;基于這種隔離方式,RedLeaf抽象出了域(domain)這一概念,并在域之間實(shí)現(xiàn)了信息隔離、錯(cuò)誤隔離等安全措施.在Rust語言中,特征(trait)是對(duì)類型需要實(shí)現(xiàn)的一系列方法的描述.為了實(shí)現(xiàn)域之間的交互,RedLeaf將特征作為對(duì)域所提供接口的描述,并通過在不同域之間傳遞特征來實(shí)現(xiàn)域接口的暴露;而為了保證域之間交互的安全性,RedLeaf引入了權(quán)能系統(tǒng),并使用權(quán)能包裹在域之間傳遞的特征或其他對(duì)象,以權(quán)能的傳遞替代特征的傳遞.通過這種權(quán)能傳遞的方式,RedLeaf可以跳過內(nèi)核的監(jiān)管并進(jìn)一步提高跨域調(diào)用的效率,實(shí)現(xiàn)用戶進(jìn)程直接調(diào)用驅(qū)動(dòng)等高效操作.

除了在通用的操作系統(tǒng)中管理權(quán)限,權(quán)能系統(tǒng)還可以解決物聯(lián)網(wǎng)場景中的安全問題.在物聯(lián)網(wǎng)場景中,權(quán)限管理系統(tǒng)需要將不同架構(gòu)、不同操作系統(tǒng)、不同職能的眾多物理設(shè)備組織起來,并對(duì)多種多樣的調(diào)用進(jìn)行鑒權(quán),傳統(tǒng)方法難以勝任;而權(quán)能系統(tǒng)的細(xì)粒度使其在物聯(lián)網(wǎng)領(lǐng)域具有較大的優(yōu)勢.因此,近年來有一些新型物聯(lián)網(wǎng)權(quán)限管理系統(tǒng)被提出[19,20],這些系統(tǒng)以權(quán)能的方式對(duì)不同物聯(lián)網(wǎng)設(shè)備的各類操作進(jìn)行詳細(xì)地管理,在權(quán)限劃分粒度、執(zhí)行效率上要優(yōu)于傳統(tǒng)的權(quán)限管理系統(tǒng).

在分布式系統(tǒng)中,權(quán)能系統(tǒng)還可以與區(qū)塊鏈技術(shù)相結(jié)合,進(jìn)一步提升其安全性.傳統(tǒng)的訪問控制系統(tǒng)一般為集中式,在分布式系統(tǒng)中遇到單點(diǎn)故障、數(shù)據(jù)泄露等問題;而區(qū)塊鏈由于天然具有分布的性質(zhì),可以解決集中式系統(tǒng)的問題,但其不能存儲(chǔ)大規(guī)模的數(shù)據(jù).為了解決分布式系統(tǒng)中訪問控制的問題,一些工作致力于使用在系統(tǒng)中同時(shí)使用區(qū)塊鏈與權(quán)能[21,22],以充分利用權(quán)能系統(tǒng)的細(xì)粒度特性與區(qū)塊鏈的分布性、不可篡改性,從而在分布式系統(tǒng)中構(gòu)建高效的訪問控制系統(tǒng).

此外,通過與RISC指令集的融合,權(quán)能系統(tǒng)也可以通過與傳統(tǒng)的頁表結(jié)構(gòu)相結(jié)合,在硬件層面做到字節(jié)級(jí)別的內(nèi)存保護(hù),并實(shí)現(xiàn)錯(cuò)誤隔離[23].由于這種權(quán)能體系結(jié)構(gòu)是通過擴(kuò)展指令集、增加協(xié)處理器等硬件層面的措施來完成的,其在提供全面、可量化的訪存保護(hù)的同時(shí)對(duì)大部分已有程序表現(xiàn)出良好的兼容性,并已出現(xiàn)眾多衍生工作[24,25].

由于系統(tǒng)結(jié)構(gòu)的差異性,seL4與Barrelfish的權(quán)能設(shè)計(jì)方案較為重量級(jí),RedLeaf對(duì)Rust語言特性高度依賴,使得已有的設(shè)計(jì)很難直接應(yīng)用在MOS微內(nèi)核操作系統(tǒng)上.本工作將借鑒上述操作系統(tǒng)權(quán)能設(shè)計(jì)的思想,針對(duì)MOS微內(nèi)核操作系統(tǒng)設(shè)計(jì)輕量級(jí)的權(quán)能機(jī)制.

3 MOS系統(tǒng)的權(quán)能機(jī)制設(shè)計(jì)

支持權(quán)能機(jī)制的MOS架構(gòu)如圖1所示.為了在MOS中建立權(quán)能機(jī)制,本工作首先設(shè)計(jì)出MOS中可能出現(xiàn)的各種權(quán)能類型,并構(gòu)建了權(quán)能基本操作與權(quán)能訪問控制兩個(gè)模塊.之后,為了將權(quán)能機(jī)制投入到實(shí)際應(yīng)用中,本工作還基于權(quán)能機(jī)制重構(gòu)了動(dòng)態(tài)內(nèi)存管理、共享內(nèi)存等Libc庫模塊,并在用戶態(tài)設(shè)立了進(jìn)程服務(wù)器與對(duì)應(yīng)的IPC接口來滿足用戶程序?qū)?quán)能相關(guān)服務(wù)的需求.

圖1 包含權(quán)能機(jī)制的MOS架構(gòu)圖Fig.1 MOS architecture with capability support

3.1 權(quán)能類型和基本操作的設(shè)計(jì)

在權(quán)能系統(tǒng)的建設(shè)過程中,本工作首先對(duì)MOS操作系統(tǒng)所提供的內(nèi)核資源進(jìn)行了分類,并為每一種內(nèi)核資源給出了與之相對(duì)應(yīng)的權(quán)能類型;之后,本工作設(shè)計(jì)并提供了創(chuàng)建、鑄造、拷貝、移動(dòng)、刪除5種調(diào)用作為權(quán)能的基本操作,并將MOS提供的調(diào)用轉(zhuǎn)化為對(duì)權(quán)能的基礎(chǔ)操作的調(diào)用,從而完成在權(quán)能系統(tǒng)下內(nèi)核資源的訪問;最后,本工作在MOS的內(nèi)核中加入了權(quán)能的尋址算法,并且在執(zhí)行操作前隱式地對(duì)權(quán)能所攜帶的權(quán)限位進(jìn)行檢驗(yàn),從而實(shí)現(xiàn)了MOS上的權(quán)能訪問控制功能,同時(shí)又使得權(quán)能系統(tǒng)在內(nèi)核中的復(fù)雜邏輯對(duì)應(yīng)用程序而言完全透明.

3.1.1 權(quán)能的類型設(shè)計(jì)與結(jié)構(gòu)組織

為了在MOS中實(shí)現(xiàn)多種類型的權(quán)能,本工作將權(quán)能結(jié)構(gòu)定義為如圖2所示的cte結(jié)構(gòu)體:表示權(quán)能類型的type字段,表示該權(quán)能所對(duì)應(yīng)權(quán)限的rights字段,以及根據(jù)權(quán)能類型不同而實(shí)現(xiàn)不同的權(quán)能關(guān)聯(lián)對(duì)象信息的capability_u字段.

圖2 權(quán)能結(jié)構(gòu)示意圖Fig.2 Structure of capability

本工作中設(shè)計(jì)的所有權(quán)能類型如表1所示.對(duì)于每一種權(quán)能類型,其對(duì)應(yīng)的權(quán)能實(shí)現(xiàn)中都記錄了其描述的對(duì)象的地址、與之關(guān)聯(lián)的其他權(quán)能等信息,為權(quán)能的相關(guān)操作做好準(zhǔn)備.此外,在所有權(quán)能中,CNode類型的權(quán)能較為特殊;這類權(quán)能與其對(duì)應(yīng)的內(nèi)核CNode資源一同完成系統(tǒng)中權(quán)能存儲(chǔ)結(jié)構(gòu)的組織.而根據(jù)其對(duì)應(yīng)的內(nèi)核資源在存儲(chǔ)結(jié)構(gòu)中的位置,CNode類型的權(quán)能又可以被分為L1CNode、L2CNode兩種.與Barrelfish的實(shí)現(xiàn)類似,MOS中的每個(gè)進(jìn)程使用一棵深度為2的CNode樹來描述其擁有的權(quán)能;L1CNode,L2CNode分別對(duì)應(yīng)該樹的根節(jié)點(diǎn)與次級(jí)節(jié)點(diǎn).具體實(shí)現(xiàn)上,每個(gè)進(jìn)程的進(jìn)程控制塊中都會(huì)存放其內(nèi)核中對(duì)應(yīng)的L1CNode的地址,代表該進(jìn)程的權(quán)能空間(Capability Space);內(nèi)核中,每個(gè)CNode對(duì)象通過提供多個(gè)可以存放權(quán)能的槽(slot)來完成對(duì)權(quán)能的組織,L1CNode的槽中存放L2CNode類型的權(quán)能,L2CNode的槽中才存放進(jìn)程的具體權(quán)能.需要注意的是,每個(gè)L2CNode中只能存放同種類型的權(quán)能;L2CNode允許存放的權(quán)能類型由其對(duì)應(yīng)的槽的類型所決定.

表1 MOS中的權(quán)能類型Table 1 Capability types in MOS

3.1.2 權(quán)能基本操作的設(shè)計(jì)

作為一種無法偽造但可以交換的令牌,權(quán)能的任何操作必然需要內(nèi)核的參與,否則無法保證其不可篡改性;除此之外,內(nèi)核還必須為應(yīng)用程序提供相對(duì)應(yīng)的接口,使得應(yīng)用程序之間可以進(jìn)行權(quán)能的交換;最后,內(nèi)核中還必須提供一組給予、收回權(quán)能的接口,來滿足安全系統(tǒng)的基本要求[26].據(jù)此,本工作共定義了以下幾種與權(quán)能相關(guān)的基本操作:

1)權(quán)能的創(chuàng)建

權(quán)能的創(chuàng)建算法接受要?jiǎng)?chuàng)建的權(quán)能類型T、權(quán)能的權(quán)限r(nóng),以及該權(quán)能存放的L2CNode的地址S.在創(chuàng)建之前,算法首先檢查地址S是否合法;在確認(rèn)合法之后,算法會(huì)在S對(duì)應(yīng)的L2CNode中分配一個(gè)空位存放新創(chuàng)建的權(quán)能,并初始化其權(quán)限、類型等信息,最后返回該權(quán)能的地址;若L2CNode中無法再分配空位,則直接返回.其具體步驟在算法1中給出.

算法1.權(quán)能創(chuàng)建算法

輸入:權(quán)能類型T,權(quán)能存放的L2CNode的地址 S,權(quán)能權(quán)限r(nóng)

輸出:創(chuàng)建好的權(quán)能地址;若創(chuàng)建失敗輸出為空

1.if(S == NULL)∨(S.cap.u.type != L2CNode)then

2.returnNULL

3.endif

4. slot=alloc_slot(S)

5.ifslot == NULLthen

6.returnNULL

7.endif

8. struct cte* cap =(struct cte *)slot

9. 根據(jù)類型T初始化cap指向的對(duì)象信息

10. 將權(quán)能cap的權(quán)限初始化為r

11.returncap

2)權(quán)能的鑄造

權(quán)能的鑄造是指基于一個(gè)已有權(quán)能創(chuàng)建一個(gè)新的權(quán)能,且該新權(quán)能的權(quán)限范圍不超出原權(quán)能.本工作中的鑄造算法需要源權(quán)能空間地址S,原權(quán)能地址src_addr,目標(biāo)權(quán)能空間D,目標(biāo)權(quán)能地址dest_addr以及目標(biāo)權(quán)能的權(quán)限r(nóng)作為輸入.算法首先檢查輸入的參數(shù),在S或D為空的情況下直接返回;之后,算法通過尋址找到源與目標(biāo)權(quán)能地址所對(duì)應(yīng)的源槽地址src_slot與目標(biāo)槽地址dest_slot,并檢查其是否合法;此外,算法還檢查了目標(biāo)權(quán)能的權(quán)限是否超出了原權(quán)能的權(quán)限.在檢查完畢之后,算法最后將源權(quán)能拷貝至dest_slot處,并設(shè)置其權(quán)限為r.其具體流程如算法2所示.

算法2.權(quán)能鑄造算法

輸入:源權(quán)能空間地址S,源權(quán)能地址 src_addr,目的權(quán)能空間地址D,目的權(quán)能地址 dest_addr,目的權(quán)能權(quán)限r(nóng)

輸出:無

1.if(S == NULL)∨(D == NULL)then

2.return

3.endif

4. src_slot=mos_cap_resolve_addr(S,src_addr)

5. dest_slot=mos_cap_resolve_addr(D,dest_addr)

6.if(src_slot == NULL)∨(dest_slot != NULL)∨(r不是src_slot 中權(quán)能權(quán)限的子集)then

7.return

8.endif

9. 將src_slot中的權(quán)能拷貝至dest_slot

10. 將dest_slot中的權(quán)能權(quán)限設(shè)置為r

3)權(quán)能的復(fù)制

權(quán)能復(fù)制操作與權(quán)能的鑄造操作過程類似.權(quán)能復(fù)制函數(shù)以源權(quán)能空間地址S、源權(quán)能地址src_addr,目標(biāo)權(quán)能空間D、目標(biāo)權(quán)能地址dest_addr為輸入;該算法首先檢查S與D的合法性,再通過尋址算法找到權(quán)能地址所對(duì)應(yīng)的源槽地址src_slot與目標(biāo)槽地址dest_slot,同時(shí)檢查其是否合法.滿足以上條件后,算法將權(quán)能從src_slot拷貝至dest_slot,并保證拷貝前后的權(quán)能權(quán)限一致.

4)權(quán)能的移動(dòng)

權(quán)能的移動(dòng)過程需要將權(quán)能從一個(gè)槽移動(dòng)到另一個(gè)槽中,并且保證移動(dòng)后源槽中的權(quán)能被刪除.該算法的具體流程如與復(fù)制算法基本一致,但在完成拷貝之后需要將原位置的權(quán)能徹底刪除.

5)權(quán)能的刪除

權(quán)能刪除算法的詳細(xì)過程如算法3所示.該算法需要接受權(quán)能空間地址base與其中待刪除權(quán)能的地址addr作為輸入.算法首先對(duì)base地址進(jìn)行檢驗(yàn),確認(rèn)其合法后在其中查找權(quán)能地址addr所對(duì)應(yīng)的槽地址.若成功查找到,則算法刪除槽中存放的權(quán)能;否則傳入的參數(shù)不合法,直接返回.

算法3.權(quán)能刪除算法

輸入:權(quán)能空間地址base,權(quán)能地址 addr.

輸出:無

1.ifbase == NULL then

2.return

3.endif

4. slot=mos_cap_resolve_addr(base,addr)

5.ifslot != NULLthen

6. 刪除slot中存放的權(quán)能

7.endif

3.1.3 權(quán)限的設(shè)計(jì)和訪問控制

MOS中,權(quán)能所持有的權(quán)限共分為5類;這些權(quán)限又可根據(jù)是否與對(duì)象有關(guān)分為兩種.其具體分類如表2所示.需要注意的是,其中的可復(fù)制權(quán)限表示可以對(duì)某個(gè)權(quán)能進(jìn)行復(fù)制,而可深拷貝權(quán)限則表示可在復(fù)制權(quán)能的同時(shí)復(fù)制一個(gè)對(duì)象的副本.

表2 MOS中的權(quán)限類型Table 2 Authorities in MOS

根據(jù)權(quán)能的類型不同,權(quán)能可持有的權(quán)限類型也不同.在MOS中,只有Endpoint,Rgn,MQ 這3種權(quán)能能夠持有上述的權(quán)限;其具體對(duì)應(yīng)關(guān)系如表3所示.

表3 權(quán)能與權(quán)限的對(duì)應(yīng)關(guān)系Table 3 Relationship between capability and authorities

為了實(shí)現(xiàn)訪問控制功能,應(yīng)用程序只有在向內(nèi)核申請(qǐng)資源時(shí)才可設(shè)置對(duì)應(yīng)權(quán)能的權(quán)限;任何通過復(fù)制、鑄造等方式從其他進(jìn)程處得到的權(quán)限都不會(huì)超出原始范圍.此外,應(yīng)用程序若需要訪問內(nèi)核中的資源,則必須將之前獲得的相關(guān)權(quán)能一并傳入內(nèi)核,使得內(nèi)核得以通過權(quán)限位校驗(yàn)來確認(rèn)是否允許該進(jìn)程訪問相應(yīng)資源.在這種情景下,由于進(jìn)程不能未經(jīng)允許獲取其他進(jìn)程資源的權(quán)能,從而無法訪問其他進(jìn)程的資源,保證了系統(tǒng)的安全性.

3.2 基于權(quán)能的Libc庫設(shè)計(jì)

在實(shí)現(xiàn)了基礎(chǔ)的權(quán)能操作之后,為了讓應(yīng)用程序的所有操作經(jīng)過權(quán)能系統(tǒng)的檢驗(yàn),MOS中提供給用戶進(jìn)程的接口需要以權(quán)能調(diào)用的方式重新編寫.為了統(tǒng)一各類調(diào)用形式,本工作中所有的權(quán)能調(diào)用的形式為,其中CapType為權(quán)能類型,InvocLabel為該調(diào)用的調(diào)用標(biāo)識(shí),后面的部分為該調(diào)用所需的其他參數(shù).

本工作主要為用戶提供了3類經(jīng)過重構(gòu)的接口:動(dòng)態(tài)內(nèi)存管理、共享內(nèi)存和消息隊(duì)列.

3.2.1 動(dòng)態(tài)內(nèi)存管理的設(shè)計(jì)

動(dòng)態(tài)內(nèi)存是隨進(jìn)程在運(yùn)行中向系統(tǒng)發(fā)出申請(qǐng)、釋放等請(qǐng)求而動(dòng)態(tài)變化的內(nèi)存區(qū)域.本工作中提供了4個(gè)有關(guān)動(dòng)態(tài)內(nèi)存管理的接口:malloc、realloc、calloc和free函數(shù).

1)malloc

malloc函數(shù)是從系統(tǒng)中申請(qǐng)動(dòng)態(tài)內(nèi)存的關(guān)鍵函數(shù);其從用戶進(jìn)程處接受動(dòng)態(tài)申請(qǐng)的內(nèi)存大小為參數(shù),并向操作系統(tǒng)申請(qǐng)對(duì)應(yīng)大小的內(nèi)存,并在成功時(shí)返回申請(qǐng)到的內(nèi)存的起始地址.

在POSIX標(biāo)準(zhǔn)下,malloc函數(shù)需要使用brk系統(tǒng)調(diào)用進(jìn)行實(shí)現(xiàn)[27],但這么做會(huì)產(chǎn)生兩個(gè)問題:1)容易因內(nèi)存不斷回收釋放而產(chǎn)生內(nèi)存碎片;2)不斷的通過系統(tǒng)調(diào)用進(jìn)入內(nèi)核態(tài)有可能造成效率的下降.因此,本工作選擇以內(nèi)存池的方式對(duì)malloc函數(shù)進(jìn)行了實(shí)現(xiàn),即在用戶態(tài)維護(hù)一個(gè)容納多塊內(nèi)存的內(nèi)存池,在程序申請(qǐng)內(nèi)存時(shí)首先在內(nèi)存池中進(jìn)行查找,若存在符合要求的空閑內(nèi)存則直接分配給該程序;否則再向內(nèi)核申請(qǐng)一塊對(duì)應(yīng)大小的內(nèi)存分配給程序.而在程序進(jìn)行內(nèi)存釋放時(shí),相關(guān)函數(shù)只需要在內(nèi)存池中更改對(duì)應(yīng)的標(biāo)記,從而減少內(nèi)存碎片并提高內(nèi)存申請(qǐng)調(diào)用的速度.

基于內(nèi)存池方案,并使用權(quán)能重構(gòu)的malloc函數(shù)實(shí)現(xiàn)如圖3所示.malloc函數(shù)在被調(diào)用時(shí)首先會(huì)將請(qǐng)求的內(nèi)存大小與頁面大小4KB進(jìn)行對(duì)齊,計(jì)算出實(shí)際需要分配的內(nèi)存大小;之后,該函數(shù)會(huì)遍歷內(nèi)存池,尋找合適大小的未分配內(nèi)存塊;若查找成功,則將該內(nèi)存塊從內(nèi)存池中移除并準(zhǔn)備將其返回給應(yīng)用程序.若內(nèi)存池中不存在相匹配的內(nèi)存塊,則malloc函數(shù)需要通過系統(tǒng)調(diào)用向內(nèi)核申請(qǐng)對(duì)應(yīng)大小的內(nèi)存.

圖3 基于權(quán)能機(jī)制的malloc流程Fig.3 Workflow of malloc in capability mechanism

在系統(tǒng)調(diào)用過程中,內(nèi)核首先需要為該段動(dòng)態(tài)內(nèi)存分配一塊Rgn類型的權(quán)能,并將該權(quán)能加入調(diào)用進(jìn)程的權(quán)能空間中;之后,內(nèi)核還需要根據(jù)內(nèi)存大小申請(qǐng)一定數(shù)量的Page類型的權(quán)能,并同樣加入權(quán)能空間中;最后,內(nèi)核將分配的物理頁加入頁表并映射到用戶空間,同時(shí)上移brk指針并返回.此外,系統(tǒng)調(diào)用后,用戶態(tài)程序也必須上移其brk指針.

在將分配好的內(nèi)存返回之前,malloc函數(shù)還會(huì)檢查堆頂對(duì)應(yīng)的內(nèi)存塊是否空閑.若該內(nèi)存塊空閑,則malloc函數(shù)會(huì)通過系統(tǒng)調(diào)用進(jìn)入內(nèi)核態(tài),在內(nèi)核態(tài)中完成Rgn、Page兩種權(quán)能的刪除、物理內(nèi)存的釋放以及brk指針的下移,來完成該部分內(nèi)存的釋放工作.

2)free

free函數(shù)在動(dòng)態(tài)內(nèi)存管理系統(tǒng)中負(fù)責(zé)對(duì)動(dòng)態(tài)申請(qǐng)內(nèi)存的釋放.該函數(shù)接受一個(gè)指針為參數(shù),并嘗試釋放該指針?biāo)赶虻膬?nèi)存區(qū)域.

由于使用了內(nèi)存池機(jī)制,free函數(shù)的實(shí)現(xiàn)相對(duì)簡單.該函數(shù)會(huì)首先對(duì)傳入的指針進(jìn)行判斷,在確認(rèn)該指針指向一塊動(dòng)態(tài)分配內(nèi)存之后,該函數(shù)會(huì)去查找對(duì)應(yīng)的動(dòng)態(tài)內(nèi)存,將其狀態(tài)標(biāo)記為空閑,并加入內(nèi)存池的空閑鏈表中.

3)calloc

calloc函數(shù)接受兩個(gè)參數(shù):元素個(gè)數(shù)nelem與元素大小elsize,并向系統(tǒng)申請(qǐng)一塊nelem×elsize大小的內(nèi)存,并保證該塊內(nèi)存已被初始化為0.

在MOS中,calloc函數(shù)的實(shí)現(xiàn)使用了malloc函數(shù);首先根據(jù)參數(shù)計(jì)算申請(qǐng)的空間大小,將其傳入malloc函數(shù),并將malloc函數(shù)返回的空間清零,最后返還給用戶程序.

4)realloc

realloc函數(shù)接受動(dòng)態(tài)內(nèi)存指針ptr與新的內(nèi)存大小size,嘗試將ptr指針?biāo)傅膭?dòng)態(tài)內(nèi)存的大小更改至size,并返回指向更改后的動(dòng)態(tài)內(nèi)存的指針.

由于邏輯相似性,realloc函數(shù)的實(shí)現(xiàn)同樣使用了malloc函數(shù).realloc函數(shù)首先對(duì)傳入的新內(nèi)存大小與原有內(nèi)存大小進(jìn)行比較,若后者小于等于前者,則不做任何修改,直接返回原指針;若后者大于前者,則需要調(diào)用malloc函數(shù)分配一塊新的內(nèi)存,并將舊的內(nèi)存中的內(nèi)容拷貝過去,最后調(diào)用free函數(shù)釋放舊內(nèi)存.

3.2.2 共享內(nèi)存的設(shè)計(jì)

共享內(nèi)存一般指多個(gè)進(jìn)程在系統(tǒng)的支持下將不同虛地址空間中的地址映射到同一物理頁上,從而使得多個(gè)進(jìn)程能夠訪問同一內(nèi)容.由于其讀寫不需要系統(tǒng)內(nèi)核的額外操作,共享內(nèi)存的效率要高于管道、消息隊(duì)列等通信工具,是一種高效的進(jìn)程間通信方式.

在MOS中,共享內(nèi)存的實(shí)現(xiàn)主要基于兩個(gè)結(jié)構(gòu)體:內(nèi)核態(tài)共享內(nèi)存信息結(jié)構(gòu)體kshm與用戶態(tài)基本信息結(jié)構(gòu)體shm.kshm結(jié)構(gòu)體中保存了該結(jié)構(gòu)體對(duì)應(yīng)的共享內(nèi)存的大小、使用該共享內(nèi)存的進(jìn)程數(shù),以及該共享內(nèi)存的權(quán)能等信息;而shm結(jié)構(gòu)體中保存了共享內(nèi)存基址、共享內(nèi)存大小等基礎(chǔ)信息.之所以在用戶態(tài)維護(hù)記錄了共享內(nèi)存基本信息的shm結(jié)構(gòu)體,是為了相關(guān)函數(shù)能夠在內(nèi)存分配的過程中在用戶態(tài)同步更新brk指針,以防止動(dòng)態(tài)分配內(nèi)存機(jī)制與共享內(nèi)存分配機(jī)制之間發(fā)生沖突.

MOS共提供了3個(gè)共享內(nèi)存操作函數(shù):shmget,shmat和shmdt.

1)shmget

shmget調(diào)用用來根據(jù)約定好的索引值獲取相對(duì)應(yīng)的共享內(nèi)存的標(biāo)識(shí)符.該函數(shù)接受3個(gè)參數(shù):約定的共享內(nèi)存結(jié)構(gòu)體索引值key,共享內(nèi)存大小size和標(biāo)記位shmflg.

shmget函數(shù)首先會(huì)在用戶態(tài)根據(jù)索引值key查詢共享內(nèi)存記錄;若該key在用戶態(tài)有對(duì)應(yīng)記錄,則返回該記錄;若不存在對(duì)應(yīng)記錄,則將其傳入內(nèi)核進(jìn)行進(jìn)一步查詢.如果在內(nèi)核中也查詢不到對(duì)應(yīng)的記錄,程序會(huì)在內(nèi)核中新建一個(gè)kshm結(jié)構(gòu)體,使用size與shmflg對(duì)其各個(gè)字段進(jìn)行初始化,并將其權(quán)能指針rgn_cte字段置NULL;返回到用戶態(tài)后,函數(shù)會(huì)將信息同步到對(duì)應(yīng)的shm結(jié)構(gòu)體中,并最終返回其標(biāo)識(shí)符.

2)shmat

shmat函數(shù)用來將指定的共享內(nèi)存映射到傳入的虛擬地址上,從而使得共享內(nèi)存可以被程序直接使用.

shmat函數(shù)接受共享內(nèi)存標(biāo)識(shí)符shmid,目標(biāo)虛擬地址shmaddr和標(biāo)記位shmflg,并返回映射后的共享內(nèi)存起始地址.接受參數(shù)后,函數(shù)首先檢查shmaddr對(duì)應(yīng)的共享內(nèi)存是否已經(jīng)被綁定;若已被綁定則直接返回其對(duì)應(yīng)的地址.否則,shmat會(huì)通過系統(tǒng)調(diào)用進(jìn)入內(nèi)核態(tài),并建立類型為Rgn的權(quán)能r供進(jìn)程使用.在此之后,內(nèi)核態(tài)程序會(huì)找出shmid對(duì)應(yīng)的kshm結(jié)構(gòu)體t并檢測是否有其他進(jìn)程已經(jīng)映射了該共享內(nèi)存:若沒有進(jìn)程映射過,內(nèi)核需要申請(qǐng)對(duì)應(yīng)的Page類型的權(quán)能,完成頁表映射,并將該權(quán)能寫入權(quán)能空間,最終將權(quán)能r保存到t中;否則只需要查找結(jié)構(gòu)體t中的權(quán)能數(shù)組,映射t中的虛擬地址與該權(quán)能所對(duì)應(yīng)的物理地址,再將r寫入t中即可.完成以上操作后,程序返回用戶態(tài),在shm結(jié)構(gòu)體中進(jìn)行相應(yīng)的記錄,最后返回起始地址.

3)shmdt

shmdt函數(shù)負(fù)責(zé)無效化通過shmat函數(shù)與進(jìn)程綁定的共享內(nèi)存.區(qū)別于其他系統(tǒng),MOS的shmat函數(shù)中涉及到了權(quán)能的創(chuàng)建;因此在shmdt中這些權(quán)能需要被正確地銷毀.

shmdt函數(shù)接受待無效化的共享內(nèi)存地址addr作為參數(shù).shmdt首先檢驗(yàn)addr是否存在,之后將其通過系統(tǒng)調(diào)用傳入內(nèi)核.在內(nèi)核中,程序先通過addr查找權(quán)能空間中的對(duì)應(yīng)權(quán)能;再在kshm結(jié)構(gòu)體中查找包含該全能的記錄.若查找成功,則將kshm結(jié)構(gòu)體中的權(quán)能銷毀,取消頁表映射并返回用戶態(tài);用戶態(tài)程序再完成用戶態(tài)的清理工作,最后返回應(yīng)用程序.若上述查找過程失敗,則說明傳入的地址無效或者權(quán)能無效,程序直接返回.

3.2.3 消息隊(duì)列的設(shè)計(jì)

除去共享內(nèi)存外,消息隊(duì)列也是一種常見的進(jìn)程間通信手段.消息隊(duì)列是一種可在進(jìn)程間共享的公共資源,不同的進(jìn)程可以打開同一消息隊(duì)列并接收或發(fā)送消息,從而達(dá)到通信的目的.在MOS中,消息隊(duì)列被設(shè)計(jì)為一種獨(dú)立于所有進(jìn)程的內(nèi)核對(duì)象,并通過MQ類型的權(quán)能進(jìn)行管理.除了全能之外,MOS中與消息隊(duì)列有關(guān)的結(jié)構(gòu)還有3個(gè):消息隊(duì)列結(jié)構(gòu)體kmq_header(存放使用標(biāo)識(shí)、消息隊(duì)列索引、權(quán)能指針等),消息隊(duì)列屬性結(jié)構(gòu)體kmq_attr(存放最大消息數(shù)、消息大小等)和消息隊(duì)列節(jié)點(diǎn)結(jié)構(gòu)體kmq_node(存放消息、消息的優(yōu)先級(jí)等).其具體組織結(jié)構(gòu)如圖4所示.

圖4 消息隊(duì)列結(jié)構(gòu)示意圖Fig.4 Structure of message queue

修改后的MOS提供了一套完整的基于權(quán)能的消息隊(duì)列接口,包括mq_open,mq_close,mq_unlink,mq_receive,mq_send等眾多函數(shù).以下對(duì)消息隊(duì)列的主要功能所設(shè)計(jì)的函數(shù)進(jìn)行介紹.

1)消息隊(duì)列的獲取

用戶程序如果想要新建或者打開消息隊(duì)列資源,則需要調(diào)用mq_open接口.在MOS中,mq_open函數(shù)被設(shè)計(jì)為只接受3個(gè)參數(shù):消息隊(duì)列的鍵值key,標(biāo)志位oflag,以及消息隊(duì)列的屬性attr(僅在新建隊(duì)列時(shí)有效).

被調(diào)用時(shí),mq_open函數(shù)首先根據(jù)傳入的key進(jìn)行查找,若成功找到則增加該消息隊(duì)列的計(jì)數(shù)器并返回;若未能找到對(duì)應(yīng)消息隊(duì)列,則需要根據(jù)oflag與attr新建一個(gè)MQ類型的權(quán)能與kmq_header結(jié)構(gòu)體,將其與key互相關(guān)聯(lián)并返回.

2)消息隊(duì)列的銷毀

MOS中,與消息隊(duì)列銷毀相關(guān)的接口主要有兩個(gè):mq_close和mq_unlink.其中前者負(fù)責(zé)關(guān)閉消息隊(duì)列,后者則負(fù)責(zé)銷毀無用的消息隊(duì)列.

mq_close函數(shù)接受一個(gè)消息隊(duì)列描述符作為參數(shù).該函數(shù)會(huì)根據(jù)描述符查詢到消息隊(duì)列的信息,并檢查當(dāng)前消息隊(duì)列打開數(shù)是否為1;若為1,則調(diào)用mq_unlink函數(shù)將其刪除;否則將其打開計(jì)數(shù)器減一并返回.

mq_unlink同樣接受一個(gè)消息隊(duì)列描述符作為參數(shù).查找到消息隊(duì)列后,如果該消息隊(duì)列打開數(shù)不為1,則直接返回;否則,該函數(shù)會(huì)釋放該消息隊(duì)列資源以及該消息隊(duì)列中所含的所有消息節(jié)點(diǎn)資源,再從調(diào)用進(jìn)程的權(quán)能空間中刪除對(duì)應(yīng)的消息隊(duì)列權(quán)能,最終返回.

3)消息的發(fā)送與接收

消息隊(duì)列中消息的發(fā)送與接收分別依賴于兩個(gè)接口:mq_send與mq_receive.

mq_send接口接受一個(gè)消息隊(duì)列描述符,一條消息以及消息的優(yōu)先級(jí);該函數(shù)在調(diào)用時(shí)首先會(huì)通過傳入的消息隊(duì)列描述符獲取對(duì)應(yīng)的權(quán)能,并檢查進(jìn)程是否具有可寫權(quán)限;確認(rèn)寫入操作合法之后,該函數(shù)還會(huì)對(duì)消息的合法性進(jìn)行校驗(yàn);通過所有檢驗(yàn)之后,函數(shù)在內(nèi)核中新建一個(gè)消息節(jié)點(diǎn),將其加入消息隊(duì)列并返回.

mq_receive接口則主要接受一個(gè)消息隊(duì)列描述符,以及消息存放位置等其他信息;與mq_send類似,該函數(shù)也會(huì)首先獲取權(quán)能并檢查寫權(quán)限,并根據(jù)消息隊(duì)列信息檢查參數(shù)的合法性;在確認(rèn)合法之后,該函數(shù)會(huì)遍歷消息隊(duì)列節(jié)點(diǎn)以找到優(yōu)先級(jí)最高的消息,將該消息以及相關(guān)信息一并返回.

3.3 IPC機(jī)制與進(jìn)程服務(wù)器

MOS是一個(gè)微內(nèi)核系統(tǒng);這使得MOS的內(nèi)核中只包括最基礎(chǔ)的頁表映射、進(jìn)程管理等功能,而其他大部分的功能的實(shí)現(xiàn)均依賴于用戶態(tài)程序.因此,MOS的用戶態(tài)中有一些進(jìn)程需要為其他用戶進(jìn)程提供服務(wù),從而實(shí)現(xiàn)操作系統(tǒng)的全部功能;這些進(jìn)程被稱為進(jìn)程服務(wù)器.為了充分利用微內(nèi)核結(jié)構(gòu)的優(yōu)勢,同時(shí)為用戶態(tài)進(jìn)程提供與權(quán)能相關(guān)的一眾接口,本工作為MOS中添加了一套原生的IPC機(jī)制,并基于該IPC機(jī)制設(shè)計(jì)了一個(gè)處理權(quán)能相關(guān)調(diào)用的進(jìn)程服務(wù)器.

為了存放通信的內(nèi)容,本工作在進(jìn)程控制塊中加入了包括msg與caps兩個(gè)字段的ipc_buffer結(jié)構(gòu),其中msg數(shù)組存放IPC傳遞的參數(shù),而caps數(shù)組則負(fù)責(zé)傳遞權(quán)能指針;用戶態(tài)程序可通過系統(tǒng)調(diào)用來獲取本結(jié)構(gòu)中的信息.

在上述結(jié)構(gòu)的基礎(chǔ)上,本工作設(shè)計(jì)了如表4所示的一套接口,包括了測試連接、監(jiān)聽、請(qǐng)求發(fā)送等接口,以此來實(shí)現(xiàn)進(jìn)程服務(wù)器的全部功能.

表4 MOS中的進(jìn)程服務(wù)器接口Table 4 Server interfaces in MOS

為了實(shí)現(xiàn)消息的發(fā)送與接收,MOS系統(tǒng)中的用戶進(jìn)程通過Endpoint資源來記錄其發(fā)送或接收的請(qǐng)求;同時(shí),內(nèi)核中設(shè)計(jì)了全局的發(fā)送Endpoint鏈表與接收Endpoint鏈表,用來存放因IPC發(fā)送或接收而被阻塞的進(jìn)程所提交的Endpoint.當(dāng)用戶進(jìn)程進(jìn)行發(fā)送或接收時(shí),若對(duì)方尚未準(zhǔn)備好,則用戶進(jìn)程的Endpoint會(huì)被保存到列表中,同時(shí)用戶進(jìn)程被阻塞;但為了保證進(jìn)程服務(wù)器能夠?qū)Χ鄠€(gè)進(jìn)程進(jìn)行正常服務(wù),在進(jìn)程服務(wù)器進(jìn)行接收操作但沒有進(jìn)程向其發(fā)送請(qǐng)求時(shí),服務(wù)器會(huì)讓出時(shí)間片而非被阻塞.

用戶程序向進(jìn)程服務(wù)器發(fā)送請(qǐng)求的詳細(xì)過程如圖5所示.應(yīng)用程序首先需要向內(nèi)核申請(qǐng)Endpoint;在得到該Endpoint對(duì)應(yīng)的權(quán)能之后,應(yīng)用程序通過系統(tǒng)調(diào)用修改自身的ipc_buffer,并先后調(diào)用send與recv來向進(jìn)程服務(wù)器發(fā)送請(qǐng)求并得到請(qǐng)求結(jié)果.在內(nèi)核中,send與recv兩次調(diào)用所提供的Endpoint會(huì)被分別加入發(fā)送鏈表與接收鏈表,同時(shí)用戶程序被阻塞,直至進(jìn)程服務(wù)器完成該請(qǐng)求的相應(yīng).當(dāng)進(jìn)程服務(wù)器發(fā)現(xiàn)該請(qǐng)求后,對(duì)應(yīng)的Endpoint會(huì)被從鏈表中移除;服務(wù)器進(jìn)程根據(jù)Endpoint信息通過系統(tǒng)調(diào)用獲得用戶程序在ipc_buffer中儲(chǔ)存的調(diào)用參數(shù),根據(jù)調(diào)用信息進(jìn)行處理之后將結(jié)果放入自身的ipc_buffer中,通過send調(diào)用返回給用戶程序.

圖5 IPC請(qǐng)求流程示意圖Fig.5 Sequence diagram of IPC request

4 實(shí)驗(yàn)評(píng)估

本工作針對(duì)實(shí)現(xiàn)了權(quán)能機(jī)制的MOS操作系統(tǒng),從權(quán)能系統(tǒng)的安全性與權(quán)能系統(tǒng)的效率兩方面對(duì)其進(jìn)行了評(píng)估.

4.1 實(shí)驗(yàn)環(huán)境及準(zhǔn)備

該本工作的試驗(yàn)環(huán)境為使用Qemu仿真器模擬的ARMv8架構(gòu)環(huán)境;該Qemu仿真器運(yùn)行在Ubuntu操作系統(tǒng)中.作為試驗(yàn)對(duì)象的MOS系統(tǒng)使用aarch64-elf-gcc進(jìn)行編譯.其具體參數(shù)如表5所示.

表5 實(shí)驗(yàn)環(huán)境Table 5 Experiment environment

4.2 實(shí)驗(yàn)結(jié)果與分析

4.2.1 權(quán)能的共享與撤銷

算法4.權(quán)能共享方測試樣例

輸入:無

輸出:無

1. cap=vka_alloc_rgn(size)//初始化權(quán)能

2. new_cap=cl_sendcap_rgn(0x1111,cap,0)//分配權(quán)能

3. cl_revoke_rgn(new_cap)//釋放權(quán)能

4. mos_yield()

5. new_cap=cl_sendcap_rgn(0x2222,cap,CAP_RW)

6. cl_revoke_rgn(new_cap)

7. mos_yield()

8. new_cap=cl_sendcap_rgn(0x3333,cap,CAP_COPY)

9. cl_revoke_rgn(new_cap)

10. mos_yield()

11. new_cap=cl_sendcap_rgn(0x4444,cap,CAP_DEEPCOPY)

12. cl_revoke_rgn(new_cap)

算法5.權(quán)能接收方測試樣例

輸入:無

輸出:無

1. cap=cl_recvcap_rgn(0x1111)//接收分享權(quán)能

2. addr=mos_rgn_map(cap)//讀寫測試

3. mos_yield()

4. cap=cl_recvcap_rgn(0x2222)

5. addr=mos_rgn_map(cap)

6. mos_yield()

7. addr=mos_rgn_map(cap)

8. mos_yield()

9. cap=cl_recvcap_rgn(0x3333)

10. slot=mos_cnode_allocslot(disp,SLOT_RGN)

11. //拷貝測試

copy_cap=mos_cnode_copy(cap,SLOT_RGN,slot)

12. mos_yield()

13. slot=mos_cnode_allocslot(disp,SLOT_RGN)

14. copy_cap=mos_cnode_copy(cap,SLOT_RGN,slot)

15. mos_yield()

16. cap=cl_recvcap_rgn(0x4444)

17. slot=mos_cnode_allocslot(disp,SLOT_RGN)

18. //深拷貝測試

copy_cap=mos_cnode_deepcopy(cap,SLOT_RGN,slot)

19. mos_yield()

20. slot=mos_cnode_allocslot(disp,SLOT_RGN)

21. copy_cap=mos_cnode_deepcopy(cap,SLOT_RGN,slot)

算法4與算法5分別展示了本實(shí)驗(yàn)為驗(yàn)證權(quán)能系統(tǒng)有效性而編寫的兩段測試代碼.在實(shí)驗(yàn)過程中,這兩段代碼分別運(yùn)行在兩個(gè)用戶進(jìn)程中;其中共享方代碼負(fù)責(zé)向內(nèi)核申請(qǐng)創(chuàng)建Rgn類型的權(quán)能,其先后將無權(quán)限、可讀寫、可拷貝、可深拷貝四種權(quán)限不同的權(quán)能分享給另一個(gè)進(jìn)程,并在完成對(duì)應(yīng)測試后撤銷該權(quán)能;而接收方則負(fù)責(zé)不斷地接收分享的權(quán)能,并在權(quán)能撤銷前與撤銷后不斷的嘗試使用權(quán)能進(jìn)行讀寫、拷貝、深拷貝操作,以測試權(quán)能系統(tǒng)的有效性.

實(shí)驗(yàn)得到的結(jié)果如表6所示.在讀寫測試中,接收方只有在擁有讀寫權(quán)能的前提下才能夠進(jìn)行讀寫操作;而在拷貝操作測試中只有接收方進(jìn)程的權(quán)能被撤銷之前才能進(jìn)行對(duì)應(yīng)操作,符合預(yù)期.

表6 測試結(jié)果Table 6 Test result

4.2.2 權(quán)能系統(tǒng)的性能測試

本工作在MOS系統(tǒng)中共實(shí)現(xiàn)了Page、CNode、Endpoint、Pcb、Rgn、MQ 6大類提供具體調(diào)用的權(quán)能,不同的權(quán)能類型對(duì)應(yīng)的調(diào)用種類也不盡相同;本節(jié)實(shí)驗(yàn)借助ARMv8中全局系統(tǒng)計(jì)數(shù)器[28],在函數(shù)的入口與出口分別全局系統(tǒng)計(jì)數(shù)器中的值進(jìn)行讀取,從而測量MOS中實(shí)現(xiàn)的各類權(quán)能調(diào)用的性能.

Page,Endpoint,Rgn 3種權(quán)能的調(diào)用周期數(shù)如圖6所示;CNode,Pcb,MQ 3種權(quán)能的調(diào)用周期數(shù)如圖7所示.在6類權(quán)能調(diào)用中,對(duì)應(yīng)進(jìn)程控制塊的Pcb與對(duì)應(yīng)權(quán)能組織結(jié)構(gòu)的CNode兩類權(quán)能調(diào)用相比之下較為基礎(chǔ),因而消耗周期較少;而涉及內(nèi)存管理機(jī)制的Rgn類型權(quán)能調(diào)用需要維護(hù)內(nèi)存結(jié)構(gòu),其內(nèi)部邏輯較為復(fù)雜,因而所消耗周期最多.

圖6 Page,Endpoint,Rgn類型權(quán)能調(diào)用開銷Fig.6 Overhead of calls on Page,Endpoint and Rgn Capabilities

圖7 CNode,Pcb,MQ類型權(quán)能調(diào)用開銷Fig.7 Overhead of calls on CNode,Pcb and MQ capabilities

從總體來看,大部分的權(quán)能調(diào)用的時(shí)鐘周期數(shù)都在7500以下,而頁表、進(jìn)程控制塊等底層調(diào)用的時(shí)鐘周期數(shù)基本在5000以下,相對(duì)較快;Rgn類權(quán)能調(diào)用雖然經(jīng)過一定的優(yōu)化,但在所有調(diào)用中開銷最高;此外,Endpoint類調(diào)用中的endpoint_send函數(shù)的消耗周期數(shù)均明顯高于同類其他調(diào)用,這是因?yàn)檫@該函數(shù)流程中進(jìn)行了較多的系統(tǒng)調(diào)用,在基礎(chǔ)功能之外增加了一定的周期消耗.

5 結(jié) 論

本工作在ARMv8的多核環(huán)境下,在微內(nèi)核操作系統(tǒng)MOS上設(shè)計(jì)并實(shí)現(xiàn)了基于權(quán)能的安全系統(tǒng).本工作首先對(duì)MOS的內(nèi)核對(duì)象進(jìn)行了分類,并根據(jù)各類權(quán)能的具體作用設(shè)計(jì)了其對(duì)應(yīng)的權(quán)能調(diào)用與權(quán)能權(quán)限;之后,本工作通過實(shí)現(xiàn)權(quán)能的創(chuàng)建、鑄造、復(fù)制、移動(dòng)、刪除5種基本操作與尋址算法,建立起了基礎(chǔ)的權(quán)能系統(tǒng);此外,本工作對(duì)一部分的Libc接口基于權(quán)能體系進(jìn)行了重寫,將用戶程序的相關(guān)操作置于權(quán)能系統(tǒng)監(jiān)督之下;最后,本工作還在MOS中設(shè)計(jì)了進(jìn)程服務(wù)器,使得應(yīng)用程序可以通過一套IPC接口來獲得權(quán)能的相關(guān)服務(wù).完成設(shè)計(jì)之后,本工作驗(yàn)證了權(quán)能系統(tǒng)維護(hù)系統(tǒng)安全的有效性,并對(duì)與權(quán)能相關(guān)的一系列操作的性能進(jìn)行了測試與分析.

猜你喜歡
共享內(nèi)存權(quán)能內(nèi)核
五指成拳 靶向發(fā)力 拓展股權(quán)權(quán)能 助力富民增收
萬物皆可IP的時(shí)代,我們當(dāng)夯實(shí)的IP內(nèi)核是什么?
強(qiáng)化『高新』內(nèi)核 打造農(nóng)業(yè)『硅谷』
宅基地資格權(quán):原則遵循、性質(zhì)定位和權(quán)能闡述
上海房地(2021年12期)2021-05-23 12:36:22
通過QT實(shí)現(xiàn)進(jìn)程間的通信
基于嵌入式Linux內(nèi)核的自恢復(fù)設(shè)計(jì)
Linux內(nèi)核mmap保護(hù)機(jī)制研究
基于PCI總線的多處理器協(xié)同機(jī)制研究
“四荒”土地承包經(jīng)營權(quán)能抵押嗎
農(nóng)地產(chǎn)權(quán)權(quán)能擴(kuò)展及管理措施完善研究
平谷区| 金寨县| 白银市| 兴化市| 临汾市| 册亨县| 新乡县| 顺义区| 平江县| 天峻县| 开原市| 阳信县| 信宜市| 罗城| 调兵山市| 富顺县| 武川县| 文登市| 镇康县| 喜德县| 山阳县| 伽师县| 岫岩| 健康| 若尔盖县| 浦县| 南陵县| 元朗区| 泸西县| 新沂市| 凤庆县| 宿州市| 莎车县| 长乐市| 商洛市| 甘南县| 宜春市| 六枝特区| 塔城市| 昌吉市| 镇安县|