專利名稱:隔離擴展和設備驅動程序的配置的制作方法
隔離擴展和設備驅動程序的配置
背景
諸如操作系統的軟件系統一般伴隨有用于執行各種任務的軟件模塊的預 定義集合。這些模塊彼此相關聯,因為它們均是同一預定義集合的一部分。
然而,通常需要附加的功能和/或定制。換言之,功能被"擴展"。 一般, 軟件系統通過允許動態添加新軟件模塊或進程來允許擴展。這些添加通常被稱 為"擴展"或"插件"。常規系統中擴展或插件的常見示例包括但不限于操
作系統的設備驅動程序、數據庫中擴展的存儲過程、web瀏覽器中的插件和 ActiveXTM控件、web服務器中的ISAPI內容和過濾器擴展、用戶交互外殼的 外殼擴展等。由擴展添加的功能范圍遍及硬件驅動程序的更新版本的簡單支持 到對電子郵件客戶端中工作流工具的病毒掃描器。然而,用于集成擴展的常規 方法是有問題的。
例如,常規操作系統("OS")通過將一組可執行指令加載到內核保護 域中來加載擴展。 一旦驅動程序被安裝到該地址空間中時,常規內核不能阻止 所加載的擴展訪問計算系統中的任何(或所有)硬件。因此,惡意制作或惡意 的擴展可能會在OS內核中造成破壞。
設備驅動程序是在操作系統中找到的一類擴展。設備驅動程序是將操作系 統擴展成訪問特定的一個或一類設備的軟件模塊。例如,IDE驅動程序允許操 作系統訪問附連于IDE存儲控制器的磁盤驅動程序。設備驅動程序執行重要功 能,從諸如特定廠商的存儲控制器等與特定硬件對話的機械提取操作系統或應 用程序所理解的常見功能,諸如讀寫磁盤存儲塊。盡管設備驅動程序通常訪問 物理設備,但本領域的技術人員可以認識到,設備驅動程序也可提供對虛擬資 源的訪問,或可分層以添加附加的功能——諸如位于存儲控制器的設備驅動程 序上方的壓縮驅動程序。
設備驅動程序的復雜程度在最近的十年來顯著增長,因為用戶開始期望諸 如熱交換和電源管理等豐富的特征。眾多常規操作系統以各種方式響應,但就其核心而言,這些系統擁有與它們在十年前擁有的相同的驅動程序模型。
與擴展一樣,常規操作系統("OS")通過將可執行指令加載到內核保 護域中來加載設備驅動程序。 一旦驅動程序被安裝到該地址空間中,常規內核 就不能阻止所加載的驅動程序訪問計算系統中的任何(或所有)硬件。
而且,由于這些驅動程序一般用低級原語編寫以直接訪問硬件,常規內核 很少驗證驅動程序僅使用適當的硬件資源。相反,常規內核信任驅動程序將僅 訪問它聲稱服務的設備的硬件。而且,通常常規內核不能保證驅動程序被正確 配置、驅動程序將與被分配給活動進程的存儲器或甚至與被分配給常規內核內 其它組件的存儲器相關。
因此,常規驅動程序是OS中的最不可靠的組件之一。某些報告指出,在
最流行的常規OS中85%所診斷出的崩潰是因驅動程序而引起的。其它報告指 出,較不流行的常規OS的驅動程序與內核中的其它可執行指令相比,包含隱 錯的可能性高七倍。
概述
本文中描述了用于描述和/或解決軟件系統的應用程序、擴展、設備驅動 程序和其它組件的配置要求的一個或多個實現。
提供該概述是為了以簡化的形式介紹將在以下在詳細描述中進一步描述 的一些概念。該概述不旨在標識所要求保護的主題的關鍵特征或本質特征,也 不旨在用于幫助確定所要求保護的主題的范圍。
附圖簡述
貫穿附圖,使用相同的標號來指示同樣的元素和特征。
圖1是支持本文中描述的一個或多個實現的操作系統體系結構的操作場
旦 眾o
圖2是支持本文中描述的一個或多個實現的操作系統體系結構的框圖。 圖3是設備驅動程序進程內的對象及其與圖2中所示的操作系統體系結構 的其它部分的關系的框圖。
圖4是本文中所述的另一方法實現的流程圖。詳細描述
以下描述示出了用于描述和/或解決軟件系統的應用程序、擴展、設備驅 動程序和其它組件的配置要求的技術。
常規擴展(例如,設備驅動程序)包括用于對計算資源——諸如輸入/輸
出(I/O)、存儲器、視頻、聲音、中斷請求(IRQ)線或其它硬件——的直接 訪問的可執行指令。與常規擴展不同,根據本文中描述的一個或多個實現創建 的擴展(例如,設備驅動程序)經由一個或多個局部訪問對象來訪問計算資源, 這些對象是提供至計算資源的通路或橋梁的對象(即,具有一個或多個數據結 構的可執行指令)。
采用一個或多個所述實現,擴展包含指定其配置要求(包括其對這些資源 的需求在內)的嵌入元數據。操作系統(OS)基于這些元數據確定擴展的計算 資源需求。OS提供必需的可執行指令(按局部訪問對象的形式)來分配所需 資源并將擴展連接至其進程外的計算資源。
這種新的工作劃分向擴展的主機(一個或多個實施例中針對設備驅動程序 的的OS)提供了驗證所有配置要求并控制擴展對I/O或IPC資源的所有訪問 的能力。
軟件隔離進程
在計算機科學領域,更具體地在操作系統領域,術語"軟件進程"(或簡
稱為"進程")是公知的。應用程序通常由一個或多個進程組成。操作系統(os)
意識到并實際上可管理和監督運行在計算機上的一個或多個單獨的進程。 此處,進程包含可執行指令。程序模塊也包含可執行指令。 一個或多個進
程可基于程序模塊執行。
此處,擴展可被描述為程序模塊。而且,設備驅動程序是擴展的一個示例。
此處所述的一個或多個實施例可經由隔離進程實現。在圖1的上下文中描述了
隔離進程的上下文。
此處描述了在允許和/或支持軟件隔離進程(SIP)抽象模型的配置的OS 模型中操作一個或多個實現。SIP封裝程序或系統,并提供信息隱藏、故障隔離和強接口。根據所述實現,SIP在OS和應用程序軟件中貫穿使用。
圖1示出了 SIP構造的操作場景。它將進程構造體系結構100示為在計算 機120上存儲和/或執行的操作系統100的一部分。如圖1所示,進程構造體系 結構100可以是操作系統的一部分。或者,進程構造體系結構100的全部或部 分可與操作系統分開,但仍與操作系統協同工作。
進程構造體系結構100在計算機的工作存儲器中根據由擴展組件集編輯
的組成組件動態集構造進程。 一旦經構造之后,活動進程的可執行指令就是固 定的。 一旦被固定,活動進程就不常運行新的處理器可執行指令。為了這樣做, 進程一般用作為其一部分的新可執行指令重新構造,或創建新添的進程。 組成和擴展組件的動態集一般被表現為存儲在計算機存儲中的加載模塊
集。進程構造體系結構100按照允許關于要執行進程的一個或多個各種屬性(例
如,完整性、安全性、可靠性、可用性、資源使用分析、完整性分析和/或穩定 性)并為要執行的各種期望優化來分析的方式構造進程。
計算機120包括計算機存儲設備122 (例如,硬盤驅動程序、RAID系統 等),它存儲一組加載模塊124和工作存儲器130。在圖l的示例中,進程構 造體系結構100構造存儲在工作存儲器130中的進程140。如此處所述地,進 程140是根據加載模塊124構造的,加載模塊124是由進程的擴展組件編輯的 進程的組成組件的表現。
進程140具有進程清單142,它定義了進程140的最終內容。這些最終內 容的一部分包括由進程的擴展組件編輯的進程的組成組件。如此所述,進程清 單142與其描述組成的進程(諸如進程140)直接相關聯。
在構造進程時,進程構造體系結構100可采用以下功能組件中的一個或多 個進程清單合成器150、鍵入碼表示創建器152、鍵入碼表示更新器154、優 化器156、鍵入碼表示轉換器158、進程間干擾消除器160以及固定身份創建 器162。盡管圖l將這些功能組件示為彼此分開,但這些功能組件中的一個或 多個的功能可被組合。
"Inter-Process Communications Employing Bi-directional Message Conduits (采用雙向消息管道的進程間通信)"申請公開了支持可在SIP (以及os)之 中使用的進程間通信的OS模型的各組件。采用SIP,內核外的所有可執行指令在一SIP中執行,并通過強類型的通
信通道與其它SIP通信。SIP是封閉的環境,它不允許數據共享或動態代碼加 載。SIP在眾多方面不同于常規OS進程。
新內核(支持此處所述的實現,并由操作系統210表示)幾乎全部由安全 可執行指令和系統的其余部分組成,它在SIP中執行,由可驗證的安全可執行 指令組成,包括設備驅動程序、系統進程和應用程序。盡管所有不受信任的可 執行指令必須是可驗證安全的,但新內核和運行時系統中被稱為可信庫的部分 卻不是可驗證安全的。語言安全保護該可信庫免于不受信任的可執行指令的破 壞。而且,每一SIP的完整性依賴于指令安全以及進程不會保持對另一進程的 對象空間的引用的系統范圍不變性。
進程間通信
在至少一個所述實現中,SIP通過在通道上發送消息來排他地通信。通道
是兩個進程之間雙向、行為類型的連接。消息是交換堆中從發送進程傳輸到接 收進程的值或消息塊的帶標簽集合。通道由契約定類型,契約指定消息的格式 和沿通道的有效消息序列。
SIP通過調用契約的靜態NewChannd (新建通道)方法來創建通道,該 方法在其輸出參數中返回通道的兩個端點一一不對稱地被定為導出方和導入 方類型。
SIP可通過現有的通道將端點中任一個或兩個端點傳遞給其它進程。接收 端點的進程具有至保存另一相應端點的進程的通道。例如,如果應用程序進程 想要與系統服務通信,則應用程序創建兩個端點并向系統名服務器發送包含一 個端點的請求,該服務器將端點轉發給服務,從而建立進程與服務之間的通道。
通道上的發送是異步的。接收同步阻塞,直到特定的消息到達。使用語言 特征,線程可等待沿通道的一組消息中的第一個,或可等待來自不同通道的特 定的一組消息。當在通道上發送數據時,所有權從可能不會保留對消息的引用 的發送進程傳遞給接收進程。該所有權不變性由語言和運行時系統實施,并服 務于三個目的。第一是為防止進程之間的共享。第二是通過消除消息的指針混 疊來便于靜態程序分析。第三是通過提供可由復制或指針傳遞來實現的消息傳遞語義來允許實現的靈活性。 隔離可擴展性
軟件創建者很少能預見其系統或應用程序的用戶所要求的全部功能。代替 嘗試以單一系統滿足每個人,最不平凡的軟件提供通過加載附加的可執行指令
來擴充其功能的機制。例如,某些常規的市面上可購買的個人計算機操作系統
支持超過100,000個第三方設備驅動程序,這使得OS能夠控制幾乎任何硬件
設備。類似地,無數的因特網瀏覽器附件和擴展擴充了用于網頁的瀏覽器界面 和組件。甚至開放源項目提供"插件"機制,盡管這些項目潛在可修改,這是 因為擴展與新軟件版本相比更易于開發和分發。
擴展通常由被動態加載至擴展的父親的地址空間內的可執行指令組成。采 用對父親的內部接口和數據結構的直接訪問,擴展可提供豐富的功能。然而, 這種靈活性是有大代價的。擴展是軟件可靠性、安全性和后向兼容性問題的主 要原因。盡管擴展可執行指令通常是不受信任、未經驗證、有缺陷或甚至是惡 意的,但它們在沒有任何硬件接口、邊界或主機與擴展之間的區分的情況下被 直接加載到程序的地址空間中。
擴展通常是不可兼容性、不良功能或其它錯誤的源頭。而且,因為擴展缺 乏硬件接口,它可能變得依賴于其父親實現的細節,這限制了程序的將來版本 的發展,并要求大量的測試來避免不可兼容性。
可執行指令的動態加載對性能和正確性造成其次的較不明顯的負擔。可動 態加載可執行指令的系統是其中難以或不可能對系統的狀態、不變性或有效轉
換作出可靠假設的開放環境。考慮JavaTM虛擬機(JVM),其中在任何時候, 中斷、異常或線程切換可執行加載新文件、覆蓋類和方法體以及修改全局狀態 的指令。 一般而言,除了在環境不會在兩個可執行指令之間任意改變的不可靠 假設下以外,不存在分析在這樣的環境中運行的程序的可行方法。
由本文中所述的一個或多個實現采用的新方法是禁止可執行指令的動態 加載并將動態創建的擴展隔離在其自己的環境中。遵循這些原則的以往的嘗試 未被廣泛使用,因為隔離機制具有性能和可編程性問題,這使得它們與在沒有 隔離的情況下運行的風險相比較不吸引人。最普遍的隔離機制是傳統的os進程,但其高昂的成本限制了它的可用性。
現代處理器上的存儲器管理硬件向進程提供硬件邊界并保護處理器狀態,但它
對進程間控制和數據傳輸強加了高昂的懲罰。在現代x86處理器上,進程之間 的切換可能會花費數百到數千個循環,不包括TLB和高速緩存重新填充未命 中。
為可擴展性設計了更新的系統,諸如JavaTM虛擬機(JVM)和Microsoft 通用語言運行時(CLR),它們因此使用語言安全而非硬件作為隔離運行在同 一地址空間中的計算的機制。然而,安全語言本身可能是隔離的不充分保證。 共享數據提供計算的對象空間之間的路徑,在此點上反射API提供破壞數據抽
象和信息隱藏的機制。因此,這些系統需要復雜的安全機制和策略,諸如JVM 精細粒度訪問控制或CLR的代碼訪問安全來控制對系統機制和接口的訪問。
此外,共享運行時系統并在同一進程內執行的計算在發生故障時不被隔 離。當運行在JVM中的計算發生故障時,整個JVM進程一般被重新啟動,因 為難以隔離和丟棄被破壞的數據并找到沒有錯誤的一點來重啟發生故障的計 算。
本文中所述的至少一個實現采用SIP來將系統組件的可執行指令封裝在 封閉環境中。對系統或應用程序的擴展在新的SIP中運行,并通過提供有限且 適當功能的通道與父親通信。如果擴展發生故障,則其SIP終止,這允許OS 回收資源并通知通信伙伴。由于這些伙伴未與擴展共享狀態,因此錯誤恢復是 局部的,且通過通道的明確協議來促進。
本文中所述的一個或多個實現提供編譯時反射(CTR),它提供當編譯文 件來生成新的可執行指令時執行的功能。在運行時執行的正常反射具有對運行 時值的訪問權,且比CTR更普遍。然而,在眾多情況中,所需的新可執行指 令在執行之前己知。在這些情況中,CTR在編譯期間產生新的可執行指令。
支持隔離設備驅動程序的配置的計算機體系結構
某些常規設備驅動程序在沒有將驅動程序的可執行指令與內核的可執行 指令隔離的機制的情況下被加載到內核的地址空間以及硬件的保護域中。然 而, 一個或多個所述實現描述了支持隔離設備驅動程序的操作系統。圖2描述了支持隔離擴展和設備驅動程序的配置以及本文中所述的一個
或多個實現的示例性操作系統(OS)體系結構200。如所述的,示例性OS體 系結構200示出內核210、 一個或多個設備驅動程序220、 一個或多個文件系 統230以及一個或多個應用程序240。本領域的技術人員可以認識到,OS可包 括在SIP中運行的其它OS服務,如文件系統330。
內核210是控制對硬件資源的訪問、分配和回收存儲器、創建和調度線程、 提供進程內線程同步和管理1/0的特權系統組件。
內核210提供OS的核心功能。這例如包括管理存儲器和其它硬件資源、 進程創建和終止、進程間通信、通道操作、調度和I/0。該內核210的一些組 件包括IO管理器211、調度器212、頁管理器213、設備驅動程序協調器214 和硬件抽象層(HAL) 215。
該示例性OS體系結構200中的可執行指令或者經驗證或者可信。由編譯 器檢査經驗證指令的類型安全和存儲器安全。不可驗證的指令必須為OS所信 任,且被限于HAL215、內核210以及可信運行時324、 334和344中的部分。 內核的大部分是可驗證安全的。
內核和可信運行時外的所有可執行指令用安全語言,諸如C弁或Java編寫, 翻譯成安全中間語言(諸如Microsoft⑧中間語言(MSIL)),然后由一個或 多個其它后端編譯器編譯成處理器可執行指令。
可信運行時系統模糊了內核指令與SIP指令之間的分界線。可信運行時包 含可信但不可驗證的可執行指令。保護運行時可執行指令以免受SIP指令的影 響,因為SIP指令的經驗證類型安全阻止它們除通過安全接口以外與運行時系 統及其數據結構交互。在眾多情況中,后端編譯器可安全地將來自可信運行時 的指令內聯到SIP的其它可執行指令中,從而將傳統上在內核中運行的操作安 全地移入用戶進程中。
設備驅動程序220的可執行指令包括由設備驅動程序的編程員編寫的指令 加上來自一個或多個類庫222及其可信運行時224的可執行指令。類似地,如 所述的,文件系統230包括來自類庫232及其可信運行時234的可執行指令。 而且,如所述的,應用程序240包括來自類庫242及其可信運行時244的可執 行指令。圖3描繪了與示例性設備驅動程序進程300內的配置有關的對象,及其與
本文中所述的一個或多個實現所支持的示例性操作系統(OS)體系結構200 的其它部分的關系。如所述的,示例性OS體系結構200示出了OS內核210、 示例性設備驅動程序進程300以及硬件和其它計算資源350。
OS內核310包括啟用進程間消息傳遞的一個或多個通道312。如所述的, 硬件和其它計算資源350包括I/O端口 352 (也被稱為I/O寄存器)、I/O存儲 器354、 DMA控制器356和中斷請求(IRQ)線358。當然,這些僅是一些硬 件和其它計算資源的示例。其它實現可包括其它常見和不常見的硬件,以及其 它計算資源。實現也可包括一個以上的I/O端口 352、 I/O存儲器354、 DMA 控制器356或中斷請求線358。某些實現可能不全包括這些類型的硬件資源。
示例性設備驅動程序進程300包含實現設備驅動程序的功能的對象,即設 備驅動程序對象326。設備驅動程序進程300也包含可信運行時224、零個或 多個類庫222和配置對象328。
設備驅動程序對象326是可信程序模塊的一個示例。與常規方法不同,未 給予設備驅動程序的可執行代碼自由的支配。然而,其動作也不能被監督或檢 査。相反,采用本文中所述的一個或多個實現,給予不可信設備驅動程序對計 算資源的有限集合的自由但間接的訪問權。
可信運行時224包括居中調停對硬件和IPC資源的訪問權的訪問對象。這 些訪問對象包括(作為示例而非限制)1oPort332、 1oMemory334、 IoDma336、 Iolrq 338和端點340。可信運行時224中的訪問對象用作用于以下資源的通路
oPort 332+1/0端口 352;
IoMemory 334+存儲器354;
IoDma 336+DMA通道356;
k)Irq338+IRQ線358; *端點340+通道處理器312。
與常規設備驅動程序不同,包含設備驅動程序對象326的可執行指令的文 件不包括配置設備驅動程序或直接訪問諸如350處所示的硬件和其它計算資源 的可執行指令。相反,設備驅動程序對象326中的可執行指令僅經由訪問對象 332、 334、 336、 338和340訪問硬件和其它計算資源,這些訪問對象的可執行指令被包含在可信運行時224內。
創建配置對象328以及訪問對象332、 334、 336、 338和340的可執行指 令未被包括在由設備驅動程序程序員提供的文件中。相反,設備驅動程序程序 員嵌入配置需求作為附連于設備驅動程序的可執行指令的元數據。采用一個或 多個所述實現,用于創建配置對象328和訪問對象332、 334、 336、 338和340 的可執行指令是分開的,并與其余的設備驅動程序對象的可執行指令分開設 置。
在一個或多個實現中,創建配置對象328的可執行指令由操作系統提供。 在一個實現中,這些可執行指令在安裝時使用編譯時反射(CTR)模板生成。 CTR模板處理作為元數據嵌入在設備驅動程序中所編碼的配置對象的描述內 的配置要求。在另一實現中,CTR模板處理清單,其部分是根據包含設備驅動 程序對象326的可執行指令的文件中的配置元數據創建的。在另一實現中,可 信運行時224中的可執行指令通過解釋配置元數據或設備驅動程序清單來創建 配置對象。
示例性OS體系結構200在單獨的軟件隔離進程(SIP)中運行每一設備 驅動程序(諸如驅動程序220)。示例性OS體系結構200使用語言安全來驗 證沒有SIP能夠寫另一SIP的頁。封裝在SIP中,各個驅動程序可被按需停止 和重新啟動,而無需減慢整個操作系統。
示例性OS體系結構200的程序在安裝時被靜態鏈接至可信運行時。盡管 針對類型安全而靜態驗證了程序,但每一可信運行時是其系統的可信計算庫 (TCB)的組件。可信運行時中的可執行指令保持進程隔離,從而允許進程在 主機處理器的特權/管理員模式中運行,而不能夠影響其它進程的存儲器和硬件 資源。在一個所述實現中,在由設備驅動程序編程員提供的可執行指令中不允 許可規避類型安全的動態反射或其它機制。
設備驅動程序的可信運行時提供了抽象與硬件的通信的安全環境。通過由 驅動程序運行時展示的訪問對象保護用于處理中斷請求、訪問固定存儲器、訪 問I/0端口 (也被稱為I/0寄存器)以及控制直接存儲器訪問控制器(DMA) 的處理器可執行指令。
所有的進程間通信(IPC)是通過強類型的雙向通道的。這些通道具有正好兩個端點。通道上的消息受限于值類型,且這些消息的格式由契約定義。契 約也用作指定通道上發送的消息的有效序列的通道協議,且包括發起通信的信 號交換步驟。應用程序遵循契約與否可被靜態驗證。
某些端點具有公共名以便允許客戶機容易連接。這是通過單根、全局可訪
問名空間來達成的。全局名空間服務器管理名空間,并允許名字到通道端點、 目錄和符號鏈接的映射。名空間不附連于持久后備存儲。相反,系統策略允許 某些應用程序(諸如文件系統)創建名空間內的虛擬子樹,并將內容映射到這 些樹中。這允許傳統文件系統的等效實現,區別在于文件訪問是通過通道抽象 進行的。
示例性OS體系結構200具有用于將應用程序(諸如240)作為第一類實 體對待的抽象,這允許操作系統推出應用程序并提供保證。設備驅動程序是該 抽象的子類。而且,設備驅動程序安裝是由OS對應用程序執行的第一類操作。
在示例性OS體系結構200中,設備驅動程序聲明其I/O和IPC配置要求。 在常規方法中,配置要求是不可發現的。此處,配置要求被編碼在設備驅動程 序的可執行指令的同一文件中。所編碼的配置要求可例如為更易于處理起見而 被轉換成聲明配置要求的獨立的規范。
配置要求在編譯時、安裝時、引導時和執行時可驗證。實際上,將配置要 求編碼到設備驅動程序的同一文件中將其轉變成自描述產物。給定設備驅動程 序的MSIL程序集,OS可完全推出必須滿足以便設備驅動程序能正確運作的 配置前提(以及對軟件和硬件資源兩者的依賴性)。
采用應用程序抽象和驅動程序配置聲明,示例性OS體系結構200可提供 關于由設備驅動程序使用的I/0和IPC資源的保證。例如,OS可通過將新設 備驅動程序所需的資源集與所有其它設備驅動程序使用的資源集進行比較并 檢查諸如I/0端口或I/0存儲器的范圍的資源重疊(從而是沖突),來在驅動 程序執行之前檢測配置沖突。在優選實施例中,在安裝時檢測配置沖突,且僅 在新設備驅動程序與包括所有之前安裝的設備驅動程序在內的系統的其余部 分之間不存在沖突時才允許安裝。
作為另一示例,OS可通過從每一設備驅動程序中提取其配置依賴性,然 后對列表排序使得沒有設備驅動程序在其依賴對象之一之前初始化來創建有效的總引導次序——初始化設備驅動器的次序。有效總系統引導次序的自動創 建是優于以往系統的顯著的進步,在以往的系統中,或者引導次序是在開發時 硬編碼到OS中或者引導次序是由管理員手動更新的。作為從聲明性配置要求 得到的保證的最后一個示例,OS能夠生成與驅動程序的配置和資源的獲取相關的驅動程序初始化的所有可執行指令。因此,OS可保證,驅動程序僅使用所聲明的資源,且資源是在遵循系統策略的情況下獲取的。這些能力增加了系 統的可靠性和可維護性,而在運行時性能上沒有顯著代價。設備驅動程序協調與常規方法不同,本文中所述的一個或多個實現的設備驅動程序協調器214阻止驅動程序訪問不適當的存儲器位置或其它硬件資源。相反,設備驅動 程序協調器僅允許驅動程序訪問適當的存儲器位置和其它硬件資源。而且,代 替驅動程序直接訪問硬件和資源(這是常規方法允許的),內核210審査驅動 程序對硬件和資源的訪問。本文中所述的一個或多個實現具有由三個層組成的輸入/輸出(I/O)系統 HAL 214、 I/O管理器211和驅動程序220。 HAL 214是抽象對計算機硬件的訪 問的可信可執行指令的小型庫。例如,在一個實施例中,HAL實現用于操縱 硬件的四個訪問對象用于訪問I/O端口 352 (也被稱為I/O寄存器)的IoPort 對象332、用于訪問I/O存儲器354的IoMemory對象334、用于訪問DMA控 制器356的IoDma對象336、用于訪問中斷請求線358的Iolrq對象338。在一 個實施例中,HAL314也包括控制定時器、中斷控制器和實時時鐘硬件的可執 行指令。I/O管理器211負責初始化設備驅動程序并將應用程序連接至設備驅 動程序220。內核210或者直接使用設備驅動程序220配置元數據,或者使用每一設備 驅動程序的清單(例如圖1中所示的進程清單142)來正確配置設備驅動程序 220并連接執行所需的資源。一旦啟動之后,內核210就對系統進行即插即用 配置。內核210使用引導加載器從BIOS中獲取的信息以及來自諸如PCI總線 等總線的信息來枚舉設備、啟動適當的設備驅動程序、以及傳遞封裝對設備硬 件的訪問的這些驅動程序對象。16每一驅動程序220用安全可執行指令編寫,且在其自己的進程中運行。驅 動程序排他地通過通道與系統的其它部分通信,包括網絡堆棧和文件系統。當驅動程序啟動時,I/O管理器211提供如由設備驅動程序220的清單所需的I/O 訪問對象332、 334、 336和338以便與設備硬件352、 354、 356和358通信。所有這些訪問對象提供在直接訪問硬件的存儲器映射位置之前檢查每一引用 的安全接口。在使用軟件隔離的一個實施例中,I/O訪問對象的整個可執行指令被包含 在可信運行時324內,并在設備驅動程序進程300內運行。由可信運行時224 中的1/0訪問對象332、 334、 336和338中的可執行指令執行確保對硬件的訪 問有效的檢查。在使用硬件隔離的另一實施例中,處理器的進程隔離硬件被編 程來允許設備驅動程序僅訪問I/O端口空間或I/O存儲器空間中該驅動程序被 準許訪問的特定區域。在使用硬件隔離的實施例中,配置進程隔離硬件的可執 行指令駐留在OS內核210內。驅動程序配置一個或多個實現使用編碼在系統組件中的元數據中的配置要求來描述系 統各部分、解釋它們如何組合并指定它們與系統的其它部分的行為交互。元數 據聲明性地對系統的每一組件及其配置要求加上標簽,諸如內核、應用程序或 設備驅動程序。配置要求包括關于依賴性、導出服務和資源要求的信息。工具 在系統執行之前使用這種元數據來驗證系統組件的可執行指令被正確配置。該 元數據在系統執行期間使用以正確配置系統的每一組件,使得它可按其程序員 所期望地執行。系統元數據被歸檔在被稱為清單的一個或多個系統存儲中。頂層系統清單 指向描述各個組件(諸如設備驅動程序)的清單。通過這些清單,諸如引導加 載器或系統驗證器的軟件可發現系統的每一組件。系統清單足以允許對系統的離線分析。采用本文中所述的實現,管理員能 夠僅使用硬件設備的描述和系統清單來發現對眾多"設備驅動程序"相關問題 的回答。這樣的問題例如包括系統是否會對特定硬件引導、哪些驅動程序和 服務將初始化、以及哪些應用程序可運行?規范可運行系統映像包含作為元數據嵌入的整個系統的配置要求。使用元數 據, 一個或多個所述實現維持三個不變性。第一,OS將永遠不會安裝因與另 一驅動程序或系統的另一部分沖突的配置要求而不能成功啟動的設備驅動程 序。第二, OS將永遠不會啟動因配置沖突或缺少資源而不能成功運行的設備 驅動程序。第三,設備驅動程序不能在運行時使用未在其配置要求中聲明的資 源。當可能時,本文中所述的一個或多個實現使用高級語言的自定義元數據屬 性來將配置要求插入源代碼,使得僅必須維護一個源文檔。自定義屬性可附連 于源代碼實體,諸如類、方法或字段聲明。編譯器將屬性編碼到包含得到的中 間語言可執行指令的文件中。編譯器、鏈接器、安裝工具和驗證工具可讀取用 可執行指令編碼的元數據,盡管它們未執行指令。作為示例,以下源代碼示出用于聲明視頻設備驅動程序(諸如,S3 Trio64 )的配置要求的某些屬性[DriverCategory]
class s3TrioCoirMg : Dr"ivercategoryDeclarat"ion
//來自PCI配置的硬件資源 loMemoryRange textBuffer; ioMemoryRange fontBuffer; ioPortRange control; loPortRange advanced; ioPortRange gpstat;
〃通道 TRef<Extensi onContract. Exp: Start> "i osys; TRef<ServiceProviderContract.Exp:Start> video;和[Signature (簽名)]屬性聲明該模塊 為PCI視頻設備的特定類的設備驅動程序。DriverCategory表示實現特定硬件 的設備驅動程序的應用程序的類別。其它類別包括用于實現軟件服務的應用程序的ServiceCategory (服務類別)、用于web服務器擴展的WebAppCategory (web應用程序類別)。[IoMemoryRange (Io存儲器范圍)]屬性聲明frameBuffer (幀緩沖器)是 從設備的PCI配置空間中的第一條目得到的。幀緩沖器的該位置是在配置硬件 時確定的,且硬件參數,諸如存儲器區域的大小,必須可與屬性中的配置值兼 容。[IoFixedMemoryRange (Io固定存儲器范圍)]和[IoFixedPortRange (Io固 定端口范圍)]屬性指定驅動程序或者需要用于存儲器映射訪問的固定范圍的 地址空間或者用于訪問設備寄存器的固定范圍的I/O端口 。在此實施例中,IoDmaRange (IoDMA范圍)、IoIrqRange (Io中斷請求 范圍)、IoMemoryRange (Io存儲器范圍)和IoPortRange (Io端口范圍)對 象是連續訪問對象的集合的容器,且可分別與1oDma、IoIrq、IoMemory和IoPort 訪問對象互換使用。[ExtensionEndpoint (擴展端點)]屬性聲明,驅動程序必須配備通道端點 來與設備程序的父進程通信。在諸如S3,Trio64TM的設備驅動程序中,I/O系 統是父進程。[ServiceEndpoint (服務端點)]屬性聲明驅動程序必須配備有至系統目錄 服務的通道端點,且使用視頻驅動程序的應用程序將通過該端點被目錄服務綁 定至設備驅動程序。編譯時在編譯時,高級語言編譯器將自定義屬性作為元數據嵌入到包含設備驅動 程序的中間語言可執行指令的文件中。使用中間語言元數據訪問庫, 一個或多 個所述實現可從中間語言文件中檢索所嵌入的元數據,而不執行文件中所包含 的可執行指令。在鏈接時,清單創建工具從中間語言文件中讀取自定義屬性元數據來創建 應用程序清單。應用程序清單是枚舉應用程序的組件和配置要求的XML文件。 應用禾呈序清單在"Self-Describing Artifacts and Application Abstractions (自描述 產物和應用程序抽象)"中更詳細描述。以下XML包含視頻設備驅動程序(諸如S3TMTrio64 視頻設備驅動程序)的清單信息的部分<marHfest> application identity="S3THo64" /> <assemblies> <assembly filename=''s3Trio64.exe" /> <assembly fi1ename="Namespace.Contracts.dl1"versionJ'l.0,0.2299" /> <assemb1y f"ename-"lo.Contracts.d"M" vers"ion="l.0.0.2299" /><assemb1y filename=''corlib.cn"r version="l.0.0.2299" /> <assembly filename=''Corlibsg.dll" version="l.0.0.2299" /> <assemb1y filename="system.compi1er.Runtime.dll"version="l.0.0.2299" /> <assembly fi 1 ename="MS. Si ngsharp. Runt"ime. dl 1"version=''l.0.0.2299" /> <assembly filename-"lLHelpers.dll'' version="l.0.0.2299" /> <assembly filename=''OS.Vl."MT' version="l.0.0.2299" /> </assemblies> <d門,ve rCat ego ry> <device signature=7pci/03/00/S333/8811" /> <ioMemoryRange index="0" baseAddress="0xf8000000"rangel_ength="0x400000" /> <ioMemoryRange baseAddress="0xb8000" rangel_ength="0x8000"f"ixed=''True" /> <ioMemoryRange baseAddress="0xa0000" rangel_ength="0x8000"fixed="True" /> <ioPortRange baseAddress=''0x3c0" rangei_ength=''0x20"fixed="True" /> <ioPortRange baseAddress="0x4ae8" rangel_ength="0x2"fixed="True" /> <ioPortRange baseAddress="0x9ae8" rangel_ength="0x2"f"ixed="True" /> <extension startstateid="3" contractName="MS.OS-.Extending.ExtensionContract" endpointEnd="Exp"assemb1y=''Namespace-Contracts" /> <serviceProvider startstateid="3" contractName=" MS.os- lo.VideoDevi ceContract" endpoi ntEnd="Exp"assembly="lo.Contracts" /> </driverCategory></man"ifest>
安裝時
采用本文中所述的一個或多個實現,系統保證不會安裝不能啟動的設備驅 動程序。為此,系統在設備驅動程序安裝之前驗證設備驅動程序的整個配置要 求可被滿足。
應用程序是支持本文中所述的一個或多個實現的OS中的第一類抽象。該 概念在"Self-Describing Artifacts and Application Abstractions"中更詳細描述。 在一個實施例中,為了被執行, 一組可執行指令由安裝程序添加到應用程序以 根據應用程序的配置要求來初始化應用程序。在替換實現中,根據應用程序的 配置要求初始化應用程序的可執行指令被包含在可信運行時中,并通過解釋應 用程序的配置元數據來創建配置對象和訪問對象。
安裝程序從應用程序清單中的元數據開始。安裝程序驗證,應用程序的每 一程序集存在且是類型和存儲器安全的。它也驗證,所有通道契約被正確實現。
一旦這些內部特性被解決并驗證,安裝程序就接著試圖解決和驗證所有外 部依賴性。例如,安裝程序確保設備驅動程序使用的任何硬件資源不會與任何 其它驅動程序所需的硬件資源沖突。安裝程序也驗證應用程序所使用的每個類 型的通道的存在。如果應用程序導出通道,則安裝程序驗證,所導出的通道不 與另一應用程序沖突。當沖突發生時,系統清單中的策略解決沖突。例如,清 單可聲明僅一個設備驅動程序可提供視頻控制臺契約。其它視頻驅動程序的安 裝可被禁止,或在引導時僅激活單個視頻驅動程序。
編譯時反射(CTR)用于生成可信可執行指令來為系統資源初始化應用程 序的配置對象和訪問對象。在一個實施例中,CTR模板在安裝時處理執行應用 程序清單中所指定的程序集中的屬性程序元素。
通過將系統清單元數據更新為包括新應用程序或設備驅動程序來完成安 裝進程。
在至少一個實現中,整個安裝進程離線進行,安裝僅在下一系統引導時才 變為可見。或者,整個安裝進程可在線執行和/或部分在線執行。運行時
在運行時,元數據驅動內核、設備驅動程序、服務和應用程序的初始化。 引導加載器讀取系統清單的一部分來確定應加載哪些內核、設備驅動器和服 務。這些加載和啟動執行的次序不在任何地方指定;相反,系統從所指定的依 賴性來推斷次序。
隨著每一應用程序被啟動,內核驗證并解決所有元數據依賴性,并在內核
中建立進程配置記錄。使用CTR發射到應用程序內的可信可執行指令解析配 置記錄來創建配置對象328并創建訪問對象332、 334、 336、 338、 340以便訪 問外部資源。編譯時反射(CTR)為配置對象428生成可執行指令。
回到S3TMTrio64TM設備驅動程序的示例,驅動程序配置記錄中的內核記 錄記錄了用于frameBuffer、 textBuffer (文本緩沖器)和fontBuffer (字體緩沖 器)的IoMemoryRange對象的需求。內核也記錄用于控制、高級和gpstat I/O 端口的IoPortRange對象。內核創建將設備驅動程序連接至I/O子系統的通道 以及將驅動程序連接至名空間的第二通道。通道端點被添加到驅動程序的配置 記錄。
當設備驅動程序開始執行時,可信運行時中的可執行指令在驅動程序的對 象空間中創建適當的IoMemoryRange和IoPortRange訪問對象。因為這些僅可 由可信運行時構造,所以設備驅動程序僅可訪問在其配置元數據中聲明并由內 核I/O子系統檢査過沖突的I/O資源。
在配置元數據中聲明通道端點確保三個特性。第一,SIP的可執行指令可 被靜態驗證以確保它們僅通過完全聲明的通道、嚴格遵循通道契約來通信。第 二,應用程序不需包含全局名。例如,S3TMTri064TM視頻設備驅動程序不知道 系統名空間中的/dev/video名。相反,驅動程序使用局部名,S3Trio64Config. video來指示具有給定契約(ServiceProviderContract (服務提供者契約))的 通道。I/O名空間的整個布局可在不影響視頻驅動程序中的單行源代碼的情況 下改變。第三,應用程序可以是遵循至少可能的特權的原則裝入"沙箱"的, 以移除當前系統中的差錯和安全易受攻擊性的源。例如,盡管S3TMTrio64M驅 動程序保存連接至系統目錄服務的端點,但驅動程序沒有能力創建新名字或連接至任何其它系統進程。
隔離設備驅動程序的方法實現
圖4示出了用于任何擴展(諸如設備驅動程序)的初始化的方法400。采 用該方法400, OS從設備的驅動程序清單中讀取元數據來創建設備驅動程序對 象。該方法400由如圖1中所示的各種組件中的一個或多個執行。而且,該方 法400可用軟件、硬件、固件或其組合執行。
在圖4的402,操作系統(OS)獲取不可信程序模塊(諸如設備驅動程序)。 OS從設備驅動程序的清單中確定一組所要求或請求的計算資源。此處,計算 資源可包括虛擬資源(諸如通道)或硬件資源(諸如多個I/0端口或I/0存儲 器)或其它這樣的資源。
OS通過讀取設備驅動程序的清單來作出該判斷。或者,OS可分析設備驅 動程序的可執行指令。或者,OS可從可執行指令或相關聯的數據結構提取元 數據。
在404, OS確定是否有資源已經被分配給OS或另一設備驅動程序。如果 是,則進程在406異常中止。本發明的替換實施例可在異常中止后繼之以附加 策略,諸如在系統資源被釋放時重啟初始化進程、與當前所有者協商來釋放資 源、請求用戶許可停止沖突的驅動程序、向設備驅動程序作者通知潛在錯誤的 資源請求等。
而且,此處OS可作出關于設備驅動程序和所請求的計算資源的其它判斷。 OS確認設備驅動程序被允許訪問所請求的計算資源并以它所請求的方式訪問 資源。
在408, OS記錄對設備驅動程序的資源分配。
在410, OS提供要由設備驅動程序對每一所要求或請求的資源使用的可 信局部訪問對象。可信運行時對象(圖3中描繪)是局部訪問對象的示例。
OS執行的"提供"在此處可包括簡單地采用已經預先設定和固定的可執 行指令(和數據),它們是局部訪問對象。這可包括生成對特定需求和條件定 制的新指令(可能基于模板)。或者,OS可在之間做些事。例如,它可配置 或略微更改現有的可執行指令,這些指令是局部訪問對象。實際上,OS可將可信局部訪問對象的可執行指令(或數據)插入或鏈接 到不可信設備驅動程序,使得設備驅動程序可經由所插入或鏈接的局部訪問對 象獲取訪問權。在412, OS針對所要求的資源使用該組局部訪問對象來初始化設備配置 對象。配置對象可包括在清單中指定的附加設置。附加設置的示例可以是表明 用戶優選數據/時間格式的排序擴展的設置。在414, OS啟動設備驅動程序可執行指令的執行。初始化設備驅動程序 的可執行指令由OS或安裝系統而非設備驅動程序編程員提供。在416,執行設備驅動程序通過局部訪問對象來訪問所請求的計算資源。 而且,執行設備驅動程序僅可訪問所請求的計算資源(沒有其它)且僅經由所 鏈接或插入的局部訪問對象。結論本文中所述的技術可用眾多方式實現,包括(但不限于)作為一個或多個 計算機網絡的一部分或其組合的程序模塊、通用或專用計算系統、網絡服務器和裝備、專用電子和硬件、固件。盡管用結構特征和/或方法步驟專用的語言描述了一個或多個上述實現, 但可以理解,其它實現可無需此處所述的特定的示例性特征或步驟而實現。相 反,特定的示例性特征和步驟被公開為一個或多個實現的優選形式。在某些情 況中,可略去或簡化公知特征以闡明示例性實現的描述。而且,為易于理解起 見,某些方法步驟被描繪為分開的步驟;然而,這些分開描繪的步驟不應被解 釋為在其實現時必然次序相關。
權利要求
1.一個或多個具有處理器可執行指令的處理器可讀介質,所述指令在由處理器執行時,執行包括以下步驟的方法獲取設備驅動程序(300),其中所述設備驅動程序(300)是一組可執行指令;確定執行所述設備驅動程序(300)的所述一組可執行指令所需的一組計算資源(312和350);提供一個或多個局部訪問對象(332、333、336、338和340)以供所述設備驅動程序(300)用于訪問所需的一組計算資源(312和350),所述一個或多個局部訪問對象(332、333、336、338和340)中的每一個包括可執行指令;啟動所述設備驅動程序(300)的所述一組可執行指令和所述一個或多個局部訪問對象(332、333、336、338和340)的可執行指令的執行。
2. 如權利要求1所述的一個或多個介質,其特征在于,所述確定動作包 括獲取與所述設備驅動程序(300)相關聯的處理器可讀清單(142),所述 設備驅動程序清單(142)指定執行所述設備驅動程序(300)的所述一組可執 行指令所需的所述一組計算資源(312和350)。
3. 如權利要求1所述的一個或多個介質,其特征在于,所述方法還包括 確認所述設備驅動程序(300)被授權來訪問所需的一組計算資源(312和350)。
4. 如權利要求1所述的一個或多個介質,其特征在于,所述提供動作還 包括生成一個或多個局部訪問對象(332、 333、 336、 338和340)以供所述 設備驅動程序(300)用來訪問所需的一組計算資源(312和350),所述局部 訪問對象由操作系統提供。
5. —個或多個具有處理器可執行指令的一個或多個處理器可讀介質,所 述指令在由處理器執行時,執行包括以下步驟的方法獲取包括一組可執行指令的不可信程序模塊(300),且所述不可信程序 模塊(300)被配置成訪問一個或多個計算資源(312和350);確定所述不可信程序模塊(300)的一個或多個目標計算資源(312和350), 其中所述一個或多個目標計算資源(312和350)是所述不可信程序模塊(300)在所述不可信程序模塊(300)的所述一組可執行指令被執行時將設法訪問的 計算資源(312和350);向所述不可信程序模塊(300)提供一個或多個可信局部訪問對象(332、 333、 336、 338和340),使得所述不可信程序模塊經由所提供的一個或多個 可信局部訪問對象(332、 333、 336、 338和340)獲取對所述一個或多個目標 計算資源(312和350)的訪問權。
6. 如權利要求5所述的一個或多個介質,其特征在于,所述可信局部訪 問對象(332、 333、 336、 338和340)中的每一個與一個或多個計算資源(312 和350)相關聯,且所述可信局部訪問對象(332、 333、 336、 338和340)中 的每一個包括一組可執行指令。
7. 如權利要求5所述的一個或多個介質,其特征在于,所述可信局部訪 問對象(332、 333、 336、 338和340)中的每一個與一個或多個計算資源相關 聯,所述可信局部訪問對象(332、 333、 336、 338和340)中的每一個包括可 執行指令,且所述提供還包括配置所述一個或多個可信局部訪問對象(332、 333、 336、 338和340)的可執行指令以經由所述一個或多個可信局部訪問對 象(332、 333、 336、 338和340)所配置的可執行指令向所述不可信程序模塊(300)提供對所述一個或多個目標計算資源(312和350)的訪問權。
8. 如權利要求5所述的一個或多個介質,其特征在于,所述不可信程序 模塊(300)是設備驅動程序(300)。
9. 一個或多個具有處理器可執行指令的處理器可讀介質,所述指令在由 處理器執行時,執行包括以下步驟的方法獲取包括一組可執行指令的不可信程序模塊(300),且所述不可信程序 模塊(300)被配置成訪問一個或多個計算資源(312和350);確定所述不可信程序模塊(300)的一個或多個目標計算資源(312和350), 其中所述一個或多個目標計算資源(312和350)是所述不可信程序模塊(300) 在所述程序模塊的所述一組可執行指令被執行時將設法訪問的計算資源(312 和350);向所述不可信程序模塊(300)提供一個或多個可信局部訪問對象(332、 333、 336、 338和340),使得所述不可信程序模塊經由所提供的一個或多個可信局部訪問對象(332、 333、 336、 338和340)獲取對所述一個或多個目標 計算資源(312和350)的訪問權,所述一個或多個可信局部訪問對象(332、 333、 336、 338和340)與所述一個或多個目標計算資源(312和350)相關聯;許可所述程序模塊訪問僅可經由與所述一個或多個目標計算資源(312和 350)相關聯的一個或多個可信局部訪問對象(332、 333、 336、 338和340) 來訪問所述一個或多個目標計算資源(312和350)。
10.如權利要求9所述的一個或多個介質,其特征在于,所述不可信程序 模塊(300)是設備驅動程序(300)。
全文摘要
本文中描述的是用于描述和/或解決軟件系統的應用程序、擴展、設備驅動程序(300)和其它組件的配置要求的一個或多個實現。
文檔編號G06F15/16GK101297280SQ200680040116
公開日2008年10月29日 申請日期2006年10月16日 優先權日2005年10月26日
發明者B·斯汀斯嘉德, B·齊爾, C·霍伯利特澤, D·R·泰迪蒂, G·C·亨特, J·R·勞瑞斯, M·A·范德瑞, M·卡賓, M·埃肯, M·斯帕爾斯, M·阿巴迪, N·墨菲, O·霍德森, P·巴罕姆, S·P·萊維, T·沃伯 申請人:微軟公司