TWI777636B - 組成模組化韌體的方法、裝置及電腦程式產品 - Google Patents
組成模組化韌體的方法、裝置及電腦程式產品 Download PDFInfo
- Publication number
- TWI777636B TWI777636B TW110123673A TW110123673A TWI777636B TW I777636 B TWI777636 B TW I777636B TW 110123673 A TW110123673 A TW 110123673A TW 110123673 A TW110123673 A TW 110123673A TW I777636 B TWI777636 B TW I777636B
- Authority
- TW
- Taiwan
- Prior art keywords
- module
- modules
- firmware
- firmware package
- computing device
- Prior art date
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/65—Updates
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/4401—Bootstrapping
- G06F9/4411—Configuring for operating with peripheral devices; Loading of device drivers
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/4401—Bootstrapping
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
可模組化地及動態地組成計算裝置之啟動韌體,以幫助實作對於計算裝置之韌體的改變與更新。韌體映像檔可包含主要模組及模組清單,主要模組負責某些基本的初始化,模組清單可包含於啟動程序之期間所執行的附加模組之列表。模組清單可用以鑑別及存取從模組庫所選取的模組,像是經由通用獨一辨識碼。一旦取得所選取模組,便可將所需依附模組(無論是否包含在所選取模組中)及組態設定列入考慮,而執行所選取模組。模組庫可以是完全儲存於本地端(例如部分的分散式韌體映像檔)、完全儲存於遠端,或者是混雜本地端與遠端。
Description
本揭露大致涉及計算裝置,特別涉及用以使計算裝置得以運作的韌體。
當今的計算裝置(例如個人電腦、伺服器及其他裝置)中,韌體可用於各種目的。啟動韌體(boot firmware),像是基本輸入輸出系統(Basic Input/Output System;BIOS)及/或統一可延伸韌體介面(unified extensible firmware interface;UEFI),在計算裝置啟動時處理各種初始化程序,像是初始化及幫助與計算裝置之硬體的溝通,以及初始化作業系統。韌體通常是於製造之期間,儲存及安裝在記憶體中(例如 串列週邊介面唯讀記憶體(Serial Peripheral Interface Read Only Memory;SPI ROM))。
若終端使用者希望對韌體作改變,像是除錯的議題、提升效能、作客製化,或者添加新功能,使用者會需要向開發者提出請求,像是原始設備製造商(Original Equipment Manufacturer;OEM)或原始設計製造商(Original Design Manufacurer;ODM)。一旦提出請求,OEM或ODM就會對韌體作所請求的修改,並重建韌體映像檔。此新韌體映像檔,於是需要被安裝在計算裝置中,無論是由OEM、ODM或者是終端使用者所安裝。可能也會需要額外的步驟,像是新韌體映像檔之驗證/測試,以及計算裝置之重新啟動。這整個程序,可能是昂貴且費時的。此外,無論所請求的改變之類型或範圍,合併新韌體映像檔所需的時間與金錢投入可能大約相同。因此,即使是對韌體編碼作出的小改變,也可能終究需要可觀的時間與費用。
「實施例」一詞及類似的用語意圖廣泛地指代本發明及以下請求項的所有申請標的。包含這些詞彙的陳述不應被理解為限制在此所述的申請標的或限制以下的請求項的含義或範圍。在此所涵蓋的本揭露之實施例,是由以下的請求項而非本發明內容所限定。本發明內容是本揭露之各方面的高階綜述,並且介紹了一些概念,這些概念在以下實施方式的段落中會進一步描述。本發明內容並不旨在標識出所請求的申請標的之必要特徵,也不旨在單獨用於決定所請求的申請標的之範圍。藉由參考本發明的整個說明書的適當部分、任何或所有的圖式,以及每個請求項,應當理解本申請標的。
本揭露之實施例包含一種組成模組化韌體的方法,包括存取來自計算裝置之本地端儲存的韌體映像檔。韌體映像檔包含主要模組及模組清單。該方法更包括執行主要模組,執行主要模組包含初始化計算裝置之一或多個硬體資源。該方法更包括存取關聯於韌體映像檔的模組清單。模組清單包含關聯於模組庫之一組所選取模組的獨一辨識資訊(unique identification information)。模組庫包含複數個可執行模組。該方法更包括基於該組所選取模組,組成韌體包。組成韌體包包含存取該組所選取模組之每一模組。該方法更包括執行韌體包。
在某些情況中,組成韌體包更包含存取關聯於該組所選取模組之至少一模組的依附資訊。組成韌體包更包含使用依附資訊鑑別附加模組。在某些情況中,附加模組未包含在該組所選取模組中,在這種情況中,組成韌體包更包含將附加模組添加到韌體包。在某些情況中,依附資訊鑑別母模組及子模組。在這種情況中,組成韌體包更包含使用依附資訊產生模組序列。產生模組序列包含在子模組之前,將母模組部署於模組序列中。在這種情況中,執行韌體包包含基於模組序列執行韌體包。
在某些情況中,模組庫儲存在韌體映像檔中。在某些情況中,至少某些模組庫儲存在經由網路介面可存取的遠端儲存裝置。在這種情況中,存取該組所選取模組之每一模組包含經由網路介面,存取來自遠端儲存裝置的該組所選取模組之至少一模組。
在某些情況中,計算裝置包含處理器及獨立處理器。在這種情況中,執行主要模組、存取模組清單,以及組成韌體包,是由獨立處理器所實施;以及執行韌體包是由主處理器所實施。在某些情況中,組成韌體包更包含將該組所選取模組之每一模組複製到主處理器可存取的系統記憶體中。在這種情況中,執行韌體包包含存取來自系統記憶體的韌體包。在某些情況中,該方法更包括存取來自韌體映像檔的組態參數,並將組態參數儲存在系統記憶體中。該方法更包括將模組序列儲存在系統記憶體中,模組序列指示執行韌體包之模組的順序。在這種情況中,執行該韌體包更包含,以模組序列所指示的順序,執行韌體包之每一模組。執行韌體包之每一模組,包含套用組態參數。
在某些情況中,該方法更包括存取關聯於模組清單的組態參數,其中執行韌體包包含套用組態參數。在某些情況中,該方法更包括在執行韌體包之後,初始化作業系統。在某些情況中,該方法更包括更新模組清單,以產生已更新模組清單,已更新模組清單具有一組已更新所選取模組。該組已更新所選取模組不同於該組所選取模組。在這種情況中,該方法更包括重新啟動計算裝置,以及基於該組已更新所選取模組,組成已更新韌體包。該方法更包括執行已更新韌體包。在某些情況中,計算裝置包含一或多個硬體資源及一或多個附加硬體資源。執行該韌體包包含初始化一或多個附加硬體資源。
本揭露之實施例包含一種電腦程式產品,有形地實施於一非暫態機器可讀取儲存媒體中,包含多個指令,設置以使一或多個資料處理設備實施上述的任何方法。
本揭露之實施例包含一種組成模組化韌體的計算裝置。該計算裝置包括第一硬體裝置、第二硬體裝置,以及一或多個處理器。該計算裝置更包括非暫態電腦可讀取儲存媒體,含有多個指令,當在一或多個處理器上執行時,使一或多個處理器實施操作。該等操作包含存取韌體映像檔,韌體映像檔包含主要模組及模組清單。該等操作更包含執行主要模組,執行主要模組包含初始化第一硬體裝置。該等操作更包含存取關聯於韌體映像檔的模組清單。模組清單包含關聯於模組庫之一組所選取模組的獨一辨識資訊。模組庫包含複數個可執行模組。該等操作更包含基於該組所選取模組,組成韌體包。組成韌體包包含存取該組所選取模組之每一模組。該等操作更包含執行已更新韌體包,執行已更新韌體包包含初始化第二硬體裝置。
在某些情況中,組成韌體包更包含存取關聯於該組所選取模組之至少一模組的依附資訊。組成韌體包更包含使用該依附資訊鑑別附加模組。在某些情況中,附加模組未包含在該組所選取模組中,在這種情況中,組成韌體包更包含將附加資訊添加到韌體包。在某些情況中,依附資訊鑑別母模組及子模組。在這種情況中,組成韌體包更包含使用依附資訊產生模組序列。產生模組序列包含在子模組之前,將母模組部署於模組序列中。在這種情況中,執行韌體包包含基於模組序列執行韌體包。
在某些情況中,韌體映像檔儲存在非暫態電腦可讀取儲存媒體中。在某些情況中,至少某些模組庫儲存於經由網路介面可存取的遠端儲存裝置。在這種情況中,該計算裝置更包括網路介面。存取該組所選取模組之每一模組包含經由網路介面,存取來自遠端儲存裝置的該組所選取模組之至少一模組。
在某些情況中,一或多個處理器包含主處理器及獨立處理器。執行主要模組、存取模組清單,以及組成韌體包,是由獨立處理器所實施;以及執行韌體包是由主處理器所實施。在某些情況中,組成韌體包更包含將該組所選取模組之每一模組複製到主處理器可存取的系統記憶體中。執行韌體包包含存取來自系統記憶體的韌體包。在某些情況中,該等操作更包括存取來自韌體映像檔的組態參數,並將組態參數儲存在系統記憶體中。該等操作更包含將模組序列儲存在系統記憶體中。模組序列指示執行韌體包之模組的順序。在這種情況中,執行該韌體包更包含,以模組序列所指示的順序,執行韌體包之每一模組。行韌體包之每一模組,包含套用組態參數。
本揭露之額外的特徵及優點,將會在以下的敘述中列舉,且會在某種程度上,從敘述中顯而易見;或者可藉由在此列舉的原則之實作所得知。本揭露之特徵及優點,可藉由附帶的請求項中特別指出的器械及組合之手段,所實現與獲得。本揭露的這些特徵及其他特徵,將從以下的敘述及附帶的請求項而變得完全顯而易見,或者可藉由在此列舉的原則之實作所得知。
本揭露之某些態樣與特徵涉及計算裝置之啟動韌體,該啟動韌體可模組化地及動態地組成,以幫助實作對於計算裝置之韌體的改變與更新。韌體映像檔可包含主要模組及模組清單,主要模組負責某些基本的初始化,模組清單可包含於啟動程序之期間所執行的附加模組(additional modules)之列表。模組清單可用以鑑別及存取從模組庫(module library)所選取的模組,像是經由通用獨一辨識碼(globally unique identifier;GUID)。一旦取得所選取模組,便可將所需依附模組(無論是否包含在所選取模組中)及組態設定列入考慮,而執行所選取模組。模組庫可以是完全儲存於本地端(例如部分的分散式韌體映像檔)、完全儲存於遠端(例如經由網路連接所存取),或者是混雜本地端與遠端。
本揭露之某些態樣與特徵,能以任何於啟動期間使用韌體之適用的計算裝置所使用,像是個人電腦(例如筆記型電腦、桌上型電腦,或者類似的裝置)、可攜式計算裝置(例如平板、智慧型手機,或者類似的裝置),或者計算伺服器(例如機架式伺服器或刀鋒伺服器)。啟動程序可以在計算裝置上電後開始,也可以在重新啟動後開始。於啟動程序之期間,執行啟動韌體。傳統的啟動韌體經常是BIOS及/或UEFI韌體,然而本揭露並非意圖限制韌體之任何特定節結構風格。
根據本揭露之某些態樣,模組化的韌體映像檔可至少包含主要模組及次要模組。主要模組包含平台依附(例如晶片組依附(chipset-dependent))基本必要編碼(platform-dependent basic essential code),用以對存取次要模組及隨後的附加模組所必要的某些硬體資源進行初始化。舉例來說,主要模組可包含用以允許讀取儲存附加模組的儲存裝置的編碼。次要模組包含模組清單,以及可選地包含組態參數。模組清單是,於啟動程序之期間所使用的所有模組之列表。在某些情況中,模組清單被稱為模組配方(module recipe)或韌體配方(firmware recipe)。次要模組可儲存在非揮發性隨機存取記憶體(non-volatile random access memory;NVRAM)中,允許模組清單依需求而修改,像是經由管理介面或應用程式介面(application programming interface;API)。模組清單之修改,可允許個人對最終在計算裝置啟動期間所執行的韌體進行修改。組態參數可包含通用參數(global parameters)或模組特定參數(module-specific parameters),當附加模組被執行時,模組特定參數可被傳到任何的附加模組。
在某些情況中,使用者(例如終端使用者、經銷商、製造商、開發者,及其他使用計算裝置者)可根據系統需求修改模組清單,毋須對整個韌體進行程式改寫以及重建韌體映像檔。舉例來說,製造商可實作遍及大量不同產品之相同的韌體映像檔,僅僅針對每個不同產品之個別需求調整主要模組及/或次要模組。在這種範例中,低端個人電腦與高端個人電腦可享有相同韌體映像檔,包含相同的模組庫,但是不同的次要模組。於是,低端個人電腦之次要模組可包含對於低端個人電腦之硬體與特徵而言特定的模組清單,而使低端個人電腦僅使用其模組清單上的那些模組來啟動。同樣地,高端個人電腦之次要模組可包含對於高端個人電腦之硬體與特徵而言特定的模組清單,而使高端個人電腦僅使用其模組清單上的那些模組來啟動。為了實作出第三產品(例如中階個人電腦),製造商可重複使用相同的韌體映像檔,僅為那個特定產品修改次要模組。在某些情況中,模組庫可儲存於本地端(例如儲存在SPI ROM上),像是儲存於分配給計算裝置的韌體映像檔中。在其他情況中,某些模組庫或所有模組庫可位於遠端的儲存裝置上,像是網路伺服器。如在此所使用的,於本地所儲存及存取的模組庫可稱為帶內(in-band)模組庫,而在遠端所儲存及存取的模組庫,像是經由網路介面,可稱為帶外(out-of-band)模組庫。在某些情況中,帶內模組庫可仍然經由網路介面所更新(例如經由基板管理控制器(baseboard management controller;BMC)之網路介面)。
此外,若有需要或想要為韌體之個別的模組作更新,本揭露之某些態樣允許輕易地進行如此更新。在某些情況中,新韌體映像檔可產生及分配給所有的計算裝置,伴隨著每個計算裝置僅保留其主要模組及/或次要模組,或者伴隨著新的主要模組及/或次要模組。在其他情況中,模組庫之模組可被個別地更新及分配,包含基於依附的任何相關模組(例如,若所更新模組目前是依附於新的母模組或所更新的母模組,則那個母模組亦可被更新;同樣地,在某些情況中,所更新模組可能要求依附於所更新模組的子模組也要被更新,在這種情況中子模組亦可被更新)。在某些情況中,可更新整個模組庫或者部分的模組庫(例如,儲存在遠端儲存裝置的某些或所有的模組庫)。
如在此所使用的,「韌體映像檔」一詞可以是指單一檔案(例如二進制檔案),或者是多個檔案。舉例來說,在某些情況中,韌體映像檔可將主要模組、次要模組及模組庫包含在單一檔案中。然而在其他情況中,包含主要模組、次要模組及模組庫的韌體映像檔,可切分為多個檔案(例如,包含主要模組的第一檔案、包含次要模組的第二檔案,以及包含模組庫的第三檔案)。在某些情況中,「韌體映像檔」一詞可以是指位於連續記憶體空間(contiguous memory space)的單一檔案或多個檔案。
根據本揭露之某些態樣,計算系統可使用主處理器(main processor)以啟動。如在此所使用的「主處理器」一詞,可包含能用以讀取及執行啟動韌體編碼的任何處理裝置,像是為特定目的所建置的處理器(purpose-built processor)、計算裝置之中央處理單元(central processing unit;CPU),或是中央處理單元之核心。在某些情況中,啟動程序亦可使用附加的的獨立處理器(independent processor)。如在此所使用的「獨立處理器」一詞,意圖表示獨立處理器被分派到實施主處理器所未實施的某些啟動功能之任務。獨立處理器可與主處理器隔絕,使得獨立處理器內所載入的編碼及資料在執行之期間,無法被主處理器直接存取。獨立處理器可以是任何適用的處理器,像是外部的微控制器,或是中央處理單元內的核心(例如平台安全性處理器(platform security processor;PSP),像是透過信賴的執行環境所實作的平台安全性處理器)。這種獨立處理器(例如PSP)可以是隔絕的安全性處理器,獨立於計算裝置之主核心所運行。這種獨立處理器可負責提供硬體的信任根(root of trust)、訓練記憶體、將BIOS複製進動態隨機存取記憶體(dynamic random access memory;DRAM),以及釋出對於核心(例如x86核心)的控制權。
於啟動程序之期間僅使用主處理器時,可執行主要模組以初始化各種硬體資源,接著可存取次要模組以鑑別模組清單及任何現存的組態參數。主處理器會接著繼續組成含有模組清單中的每個所選取模組的韌體包(firmware bundle),然後執行該韌體包。在某些情況中,組成韌體包僅包含鑑別待執行的模組,像是藉由包含來自模組清單的所選取模組,以及包含執行任何所選取模組可能必要之任何附加的依附模組(dependent module)。在某些情況中,組成韌體包包含產生模組序列,或者模組將被執行的順序。處理器可接著藉由存取模組庫及執行每個所指派模組,以執行韌體包。在某些情況中,處理器直接從模組庫執行模組,然而並非總是必須如此。在某些情況中,組成韌體包包含將所指派模組複製到儲存位置,然後從儲存位置執行該等模組。一旦所指派模組已全數執行完畢,處理器可初始化及/或將控制權移交給作業系統。
根據本揭露之某些態樣,當獨立處理器與主處理器並列使用以啟動電腦時,獨立處理器可被分派到從次要模組之模組清單鑑別出所選取模組的任務,接著將所選取模組複製到儲存主處理器可存取的儲存裝置(例如系統記憶體)。在某些情況中,獨立處理器可執行主要模組,然後存取次要模組。在其他情況中,獨立處理器可僅將所選取模組複製到系統記憶體,而讓主處理器執行主要模組,再接著執行複製出來的所選取模組。
在一範例中,當啟動程序開始,獨立處理器可初始化系統記憶體;檢查來自儲存組件(例如模組清單)的系統需求;載入及存取模組庫(例如在本地端及/或遠端);基於系統需求(例如模組清單),將所選取模組複製到系統記憶體,視需要包含依附模組;可選地將附加的記憶體設定及/或模組序列儲存至一張表(table);以及釋出對主處理器的控制權。一旦主處理器的控制權已釋出,主處理器能可選地執行主要模組;可選地從該張表載入記憶體設定及/或模組序列;以及可選地使用模組序列,以執行複製出來的模組。
在某些情況中,模組清單是在啟動程序之期間所執行的所選取模組之GUID的清單,然而並非總是必須如此。在某些情況中,模組清單可包含附加資訊,像是一或多個註解(例如指示關聯於特定GUID的模組之名稱或目標的註解)。模組清單可以是使用者可更新的。在某些情況中,模組清單能以特定順序所存在,或者可包含序列資訊,然而並非總是必須如此。在某些情況中,模組序列是基於每個所選取模組之模組屬性,而自動地產生。
在某些情況中,模組清單可包含關聯於特定模組GUID之替代模組(alternate module)GUID。舉例來說,模組清單可包含「模組A」之模組GUID,以及關聯於模組A之模組GUID的「模組A1」之模組GUID。在這種情況中,模組A1可以是模組A的替代版本或新版本,當模組A及模組A1同時可相容於電腦系統,若可用時,將會被使用。處理器可在模組庫中搜尋模組A1,且如果找出模組A1,則進一步使用那個模組。然而,若無法在模組庫中找到模組A1,處理器可退回使用模組A。
在某些情況中,模組清單可採取記錄收集(collection of record)的形式,或者被解讀為記錄收集。每筆記錄可代表一段所執行的編碼。在某些情況中,記錄可包含單一模組GUID,在這種情況中,記錄表示將會使用給定的模組GUID。在某些情況中,記錄可包含基本模組(basic module)GUID,以及那個基本模組GUID的一或多個替代模組GUID。因此,如在此所使用的片語「該組所選取模組之每個模組」及類似的片語,可視情況包含:(i)在該組所選取模組中的各處,所鑑別出的所有模組;或(ii)模組清單之每筆記錄的一個模組。因此,對於僅包含模組A及替代模組A1的模組清單而言,執行「該組所選取模組之每個模組」可以是指僅執行模組A1,或者是在模組A及模組A1同時可相容於電腦系統時,若模組A1無法取得而僅執行模組A。
在某些情況中,次要模組中的模組清單是儲存於本地端,像是SPI ROM,或是計算裝置之BMC的記憶體中,然而並非總是必須如此。在某些情況中,模組清單能儲存在可經由網路介面所存取的遠端儲存裝置中。在某些情況中,可使用管理介面(例如BMC網頁使用者介面(WebUI)或通用非同步接收發送器(universal asynchronous receiver/transmitter;UART)控制台)以提供模組清單及/或組態參數的管理。
每個模組可包含屬性資訊。屬性資訊可以是表(table)的形式,然而並非總是必須如此。屬性資訊可包含模組之GUID、模組之版本資訊,以及依附資訊。依附資訊可包含任何的母模組依附(例如必須在執行給定模組之前所執行的模組)及/或任何子模組依附(例如必須在執行給定模組之後所執行的所需子模組,或是需要在執行子模組之前執行給定模組的可選子模組)。其他資訊亦可包含在屬性資訊中,像是模組位置(例如記憶體中的位置)、模組大小、所需變數或參數,以及可選變數或參數。
當存取模組庫及/或當組成韌體包時,可對來自模組清單的每個所選取模組存取屬性資訊。屬性資訊可用以(i)確保所選取的是正確的模組;(ii)鑑別待執行而未包含在模組清單中的任何附加模組;(iii)以及產生模組序列,確保母依附模組是在其子模組之前所執行。
舉例來說,若用以初始化圖形處理單元(graphics processing unit;GPU)卡的GPU模組包含在模組清單中,則那個GPU模組可包含依附資訊,指示出用以提升記憶體位址空間的記憶體模組將先被執行。若那個GPU模組尚未在模組清單中,它將會被包含在待執行的韌體包中。藉由使用依附資訊,包含記憶體模組的模組序列可在GPU模組之前所產生。在某些情況中,母依附模組本身可能需要更進一步的母依附模組。
在某些情況中,可使用管理介面(例如BMC WebUI、UART控制台,或者任何其他適用的介面)以檢查模組庫中的給定模組之屬性(例如依附屬性)。在某些情況中,若管理介面是用以提供或修改模組清單(例如在次要模組中),則管理介面可自動檢查所選取模組之屬性,並加入任何必要的依附模組。在某些情況中,管理介面可更進一步自動將模組清單安排進模組序列中,以確保母依附模組是在其子依附模組之前所執行。在某些情況中,管理介面可儲存慣用的模組清單及/或組態設定,允許使用者將慣用的模組清單及/或組態設定部署遍及多個計算裝置。
本發明可以許多不同的形式所實施。代表性的實施例被圖式所顯示,並將在此被詳細地敘述。本揭露為本發明的原則之範例或圖解,且並非意圖將本揭露之廣泛的觀點限制於繪式的實施例。在此基礎上,例如在摘要、發明內容及實施方式等段落中被揭露,但並未明確地在請求項中列舉的元件及限制,不應被單獨地、集體地、暗示地、推論地或其他方式地併入至請求項中。為了本詳細敘述之目的,除非被具體地否認,否則單數形包含複數形,反之亦然;且「包含」一詞意指「無限制地包含」。此外,表近似的詞彙,例如「約」、「幾乎」、「大體上」、「大概」及類似的詞彙,能在此被用來意指「在」、「近」、「近於」、「3-5%的範圍內」或「可接受的製造公差內」,或者其任何的邏輯組合。
這些圖示的範例,是提供以向讀者介紹此處所討論的整體主題,而並非意圖限制所揭露概念之範圍。以下段落參考圖式而敘述各種額外的特徵及範例,圖式中相同的符號表示相同的元件,且指向性的敘述是用以敘述圖示的實施例,但也如同圖示的實施例,不應用以限制本揭露。圖式中所包含的元件,可能未依比例所繪製。
根據本揭露之某些態樣,第1圖是描繪實作模組韌體組成的計算環境100的示意圖。計算裝置102可以是任何適用的計算裝置,像是個人電腦、伺服器或其他裝置。計算裝置102可包含主處理器104,以及可選地包含獨立處理器106。主處理器104可以是任何適用的處理器,像是CPU,或是CPU之一或多個核心。獨立處理器106於使用時,可以是微控制器(例如為特定目的所建置的微控制器)、分離於CPU的處理器,或者是CPU之核心,像是安全核心(secure core),像是透過信賴的執行環境所實作的平台安全性處理器。計算裝置102能可選地包含管理控制器158,像是基板管理控制器(BMC)。計算裝置102可包含本地端儲存裝置108,遍及一或多個儲存裝置,像是唯讀記憶體、隨機存取記憶體,以及類似的儲存裝置。計算裝置102可包含附加組件,像是各種附加的硬體組件、匯流排、周邊,以及類似的組件。
當計算裝置102啟動時,可執行來自韌體套件(firmware package)116的某些韌體模組,韌體套件116是儲存在計算裝置102之本地端儲存裝置108中。韌體套件116包含平台特定(platform-specific)韌體152,平台特定韌體152是特定於計算裝置102本身,或是特定於計算裝置102之某些硬體元件。平台特定韌體152的執行可使主處理器104及/或獨立處理器106使用計算裝置102之某些組件,像是某些儲存組件、電源組件,或網路組件。
在執行平台特定韌體152之後,主處理器104或獨立處理器106可鑑別一或多個附加模組,以基於平台特定韌體152中的模組清單而執行。模組清單可包含模組庫138之選定的模組。模組庫138可以是在本地端、遠端,或者是本地端與遠端的組合所實作。於本地端實作時,模組庫138可僅包含模組庫組件178。模組庫組件178可儲存在本地端儲存108中,像是部分的韌體套件116。於遠端實作時,模組庫138可僅包含模組庫組件118,模組庫組件118是儲存在遠端儲存裝置112(例如韌體伺服器或網路可定址儲存(network addressable storage)裝置)上。於本地端與遠端的組合實作時,模組庫138可將模組庫組件178及模組庫組件118兩者皆包含在內。
當至少某些模組庫138是在遠端實作時,主處理器104或獨立處理器106可使用網路介面180(例如有線或無線的網路介面),經由網路110(例如區域網路(local area network;LAN)、廣域網路(wide area network;WAN)、雲端網路,或網際網路)存取遠端儲存裝置112。當至少某些模組庫138是在遠端實作時,主處理器104或獨立處理器106可在搜尋另一處之前,先在某一處搜尋某個模組。舉例來說,於搜尋給定的模組GUID時,可在搜尋模組庫組件118之前,先搜尋模組庫組件178。可先使用其他順序,以及預先設定的順序。
如第1圖中所描繪,計算環境100可包含第二計算裝置114。第二計算裝置114可以與計算裝置102相同,或者是類似於計算裝置102,只不過是帶有不同的韌體套件120。單純出於圖示之目的,第二計算裝置114之組件並未被描繪出。韌體套件120可包含模組庫組件139,模組庫組件139與模組庫組件178完全相同。同樣地,在模組庫138是於本地端與遠端之組合所實作的情況下,模組庫138可被類似地定義為模組庫組件139與模組庫組件118之組合。第二計算裝置114的至少某些平台特定韌體153,是不同於計算裝置102的平台特定韌體152。
在一範例中,計算裝置102與第二計算裝置114皆可以是帶有相同硬體的相同裝置。計算裝置102與第二計算裝置114各自的平台特定韌體152與平台特定韌體153,可以是近乎完全相同的,帶有用以初始化多個組件(例如硬體)之相同的編碼,該等組件(例如硬體)是用以讀取其各自的模組清單。在本範例中,平台特定韌體152與平台特定韌體153之間只有模組清單是不同的。因此,當計算裝置102啟動,計算裝置102將會執行關聯於其平台特定韌體152中的模組清單的韌體,藉此執行來自模組庫138(例如來自模組庫組件178)的特定一組韌體模組。當第二計算裝置114啟動時,第二計算裝置114將會執行關聯於其平台特定韌體152中的模組清單的韌體,藉此執行來自模組庫138(例如來自模組庫組件139)的不同一組韌體模組。如此一來,計算裝置102及第二計算裝置114可彼此具有不同的能力、狀態或用途。
在某些情況中,第二計算裝置114是非常不同於計算裝置102的裝置。舉例來說,計算裝置102可以是儲存區域網路(storage area network;SAN)之儲存裝置,而第二計算裝置114可以是應用程式伺服器。在計算裝置102與第二計算裝置114中所使用的硬體以及規格需求與應用程式,可以是不同的。然而,供應給每個裝置的韌體套件116與韌體套件120可以是近乎完全相同的,帶有完全相同的模組庫組件178與模組庫組件139,但不同的平台特定韌體152與平台特定韌體153。出於平台特定韌體152與平台特定韌體153的差異,計算裝置102與第二計算裝置114能夠適當地初始化其各自的硬體,以讀取其各自的模組清單,然後執行來自模組庫138之各自選定的模組。如此一來,計算裝置102可被適當地初始化以作為儲存區域網路之儲存裝置所使用,而第二計算裝置114則可被適當地初始化以作為應用程式伺服器所使用。
當模組庫138中的任何模組需要被更新時,這種更新可推出作為單一的模組,或者可包含在新的韌體套件116與韌體套件120中,又或者可在遠端的儲存裝置112上自動更新。當想要改變計算裝置102之韌體中所使用的特定模組或設定時,可更新平台特定韌體152之模組清單或其他設定(例如組態參數)。
在某些情況中,計算環境100可包含管理計算裝置160。管理計算裝置160可耦接至網路110,以與計算裝置102進行通訊,以管理其韌體。管理計算裝置160可用以對平台特定韌體152作調整(例如對模組清單作改變,或者對組態參數或其他設定作改變),或者可對某些或所有的模組庫組件178作更新,又或者可將韌體套件116整個替換掉。管理計算裝置160可與計算裝置102中的管理控制器158互動,然而並非總是必須如此。
根據本揭露之某些態樣,第2圖是描繪初始的韌體套件216及可執行的韌體包240的示意圖。韌體套件216可以是任何適用的韌體套件,像是第1圖之韌體套件116。如第2圖中所描繪,整個模組庫238是展示為部分的韌體216,然而並非總是必須如此。在其他情況下,某些或所有的模組庫238是位於遠端儲存裝置中,像是第1圖之遠端儲存裝置112。
韌體套件216包含平台特定韌體252及模組庫238。平台特定韌體252包含主要模組222及次要模組224。主要模組222包含計算裝置(例如第1圖之計算裝置102的主處理器104或獨立處理器106)可執行的基本編碼,以初始化其某些組件(例如硬體),該等組件(例如硬體)是用以存取次要模組224、存取模組庫238,及/或實施存取與執行來自模組庫238的特定模組所需的任何其他任務。
次要模組224可包含模組清單282,並且可選地包含組態參數256。次要模組224可儲存在可寫入的記憶體中,像是NVRAM,然而並非總是必須如此。
模組清單282為所選取模組之列表,將使用於給定的計算裝置之啟動程序中。在某些情況中,模組清單282是完整的,然而並非總是必須如此,因為在某些情況中,其他依附模組毋須包含在模組清單282本身當中,即可自動實作。如第2圖中所描繪,模組清單282鑑別出要包含在韌體包240中的模組A及模組C。雖然模組清單282被描繪為「A」與「C」,模組清單282會包含待實作的模組之GUID。舉例來說,模組清單282會包含模組C 230之GUID(例如在此更進一步詳述的B516efee-2a80-4c10-a976-ff453d6c4bf1),而非使用「C」來表示待實作的是模組C 230。模組可以其他方式所組織。此外,模組清單282可包含附加資訊,像是若可用時所使用的替代模組(例如給定模組之替代版本)、註解,以及其他資訊。
組態參數256可包含,於啟動程序之期間所使用的變數或其他設定。這些參數可使用於解讀模組清單282(例如協助鑑別使用哪個版本的給定模組)、組成韌體包240,或者執行韌體包240之一或多個模組227、模組233、模組231。組態參數256可以是在啟動程序之期間持續使用的全域參數(global parameters),或者是至少在執行韌體包240之期間持續使用的全域參數。
模組庫238可包含任意數個模組,如第2圖中所描繪的模組A 226至模組n 236。模組A 226、模組B 228、模組C 230、模組D 232、模組E 234及模組n 236可儲存在一起,然而並非總是必須如此。模組庫238之每個模組A 226、模組B 228、模組C 230、模組D 232、模組E 234及模組n 236,可以是不同的。在某些情況中,模組庫238之多個模組可實施類似的功能(例如初始化相同部分的韌體),但是以不同的方式或不同的結果所實施。在某些情況中,模組庫238之多個模組可用以取得相同的結果,但可使用不同硬體以不同方式來這麼做。
出於圖示之目的,模組C 230被更詳細地敘述,然而模組庫238之任何其他模組226、228、232、234、236可包含類似的元件。模組C 230可包含模組屬性242及模組編碼254。模組編碼254是被執行為部分韌體包240的真實編碼。模組屬性242可包含模組GUID244及依附資訊,像是母依附GUID 246及子依附GUID 248。出於圖示之目的,完整的GUID(例如”B516efee-2a80-4c10-a976-ff453d6c4bf1”)被描繪給模組GUID 244,但縮寫版本的GUID(例如「D」、「A」、「E」)被描繪在母依附GUID 246與子依附GUID 248中。
當組成韌體包240時,可存取模組清單282中的每個模組之模組屬性242,以鑑別出任何潛在的依附資訊。藉由使用該依附資訊,可以判斷韌體包240中是否有任何的附加模組必須被使用,以及判斷使用的順序。
在第2圖中所描繪的範例中,次要模組224中的模組清單282表示模組A 226及模組C 230待使用。當模組C 230之模組屬性242被存取時,可見模組D 232及模組A 226均被列入母依附GUID 246的片段中。因此,當組成韌體包240時,模組A 226及模組D 232被包含在內,並且是在模組C 230之前被包含。更具體而言,由於模組A 226已被包含在模組清單282中,依附資訊將用以確保模組A 226是在模組C 230之前被包含,因為模組A 226是模組C 230的母模組。然而,模組D 232並不在模組清單282中,因此會被新包含進來,並且是在模組C 230之前被包含。
在本範例中,模組E 234被列入模組C 230之子依附GUID 248的片段中。在某些情況中,這個子模組將在模組C 231之後自動被包含在韌體包240中的某個位置,然而並非總是必須如此。在某些情況中,若模組清單282亦包含這個子模組(例如模組E 234),該子模組將會僅被包含在韌體包240中,在這種情況中,該子模組將會在模組C 231之後,才會被包含。
每當加入一個不在模組清單282上的模組(例如模組D 232),那個模組的模組屬性242將被存取,以判斷是否存在任何的依附資訊。若存在依附資訊,則那個依附資訊將會用以添加附加模組及/或將給定的模組調配到韌體包中正確的順序。
出於圖示之目的,韌體包240被描繪為一組模組227、模組223及模組231。韌體包240是由平台特定韌體252及模組庫238所組成。出於圖示之目的,在韌體包240本身之中,模組A 226是以模組A 227為代表,模組D 232是由模組D 233為代表,模組C 230是由模組C 231為代表。第2圖中所描繪的模組227、模組233、模組231可以是(i)其各自的模組226、模組232、模組230之副本;(ii)其各自的模組226、模組232、模組230的模組編碼254之副本;(iii) 指向其各自的模組226、模組232、模組230的指標(pointers),或是其各自的模組226、模組232、模組230之GUID;或(iv) 指向其各自的模組226、模組232、模組230之模組編碼254的指標。
因此,在某些情況中,韌體包240可以是一種實際的檔案,內含於啟動程序之階段所執行的編碼。在某些情況中,韌體包240可以是一種模組順序的檔案,指示要存取及執行那些模組。在這種情況中,韌體包240可在執行之前組成,然而並非總是必須如此。在某些情況中,韌體包240可以是所欲模組的執行順序之抽象代表(abstraction representative),像是若於組成韌體240的程序之期間,經手啟動程序的處理器直接執行模組。在這種情況中,「組成」韌體包240包含相繼地執行每個待執行的模組。
根據本揭露之某些態樣,第3圖是描繪多個計算裝置360、計算裝置364與計算裝置368上所使用的一般模組庫338的示意圖。模組庫338可以是任何適用的模組庫,像是第2圖之模組庫238。模組庫338可以是部份的韌體套件316,並可與平台特定韌體352儲存在一起(例如連續地,或者是在本地端),或者是儲存在遠端。模組庫338包含多個模組,像是模組326、模組328、模組330、模組332、模組334及模組336。
在第3圖之範例中,計算裝置A 360、計算裝置B 364及計算裝置C 368個別包括相同的硬體,且個別具有韌體套件316之完全相同的副本,包含主要模組322之完全相同的副本,除了在其各自的次要模組324中的差異。計算裝置A 360之次要模組324包含模組清單362,表示模組A 326及模組C 330;計算裝置B 364之次要模組324包含模組清單366,表示模組A 326及模組E 334;以及計算裝置C 368之次要模組324包含模組清單370,表示模組B 328及模組C 330。
於計算裝置A 360的啟動程序之期間,將會執行其主要模組322之副本,接著將會存取其模組清單362。模組清單362表示模組A 326及模組C 330。因此,如同從第2圖之模組清單282所組成的韌體包240,韌體包372將會從模組清單362所組成。韌體包372包含模組A 326、模組D 332及模組C 330。雖然模組D 332不再模組清單362上,模組D 332仍被加入韌體包372,因為模組D 332是模組C的母依附模組。同樣地,由於模組A 326及模組D 332皆為模組C 330的母依附模組,在韌體包372中,模組A 326及模組D 332皆會出現在模組C 330之前。計算裝置A 360執行韌體包372的每個模組,以完成其啟動程序。
於計算裝置B 364的啟動程序之期間,將會執行其主要模組322之副本,接著存取其模組清單366。模組清單366表示模組A 326及模組E 334。因此,韌體包374將會組成以包含模組A 326及模組E 334。在本範例中,無論是模組A 326或是模組E 334皆不包含任何的模組依附。計算裝置B 364執行韌體包374的每個模組,以完成其啟動程序。
於計算裝置C 368的啟動程序之期間,將會執行其主要模組322之副本,接著將會存取其模組清單370。模組清單370表示模組B 328及模組C 330。因此,韌體包376將會組成以包含模組B 328及模組C 330。在本範例中,由於模組A 326及模組A 332是模組C 330之母依附,它們也包含在韌體包376之組成中。此外,在本範例中,模組B 328是模組D 332之子依附。因此,由於模組D 332及模組B 328包含在韌體包376中,模組B 328是在模組D 332之後所包含。計算裝置C 368執行韌體包376的每個模組,以完成其啟動程序。
每個計算裝置A 360、計算裝置B 364及計算裝置C 368的次要模組324,其各自的模組清單362、模組清單366與模組清單370的小改變,導致每個這些計算裝置使用不同的韌體模組所啟動。雖然傳統的技術會需要為每個這些計算裝置A 360、計算裝置B 364及計算裝置C 368產生新的韌體映像檔;本揭露之某些態樣允許對所有計算裝置A 360、計算裝置B 364及計算裝置C 368使用單一的韌體套件316,僅在可輕易寫入的次要模組324中有小改變。
此外,若模組A 326待更新(例如修正錯誤或實作新功能),使用者可以只更新模組A 326,接著提供該更新給每個計算裝置A 360、計算裝置B 364及計算裝置C 368,以更新其模組庫338之本地端儲存的模組A 326,或者提供該更新給遠端的儲存裝置,以更新模組庫338之遠端儲存的模組A 326。
此外,雖然在第一範例中是以帶有相同硬體的不同計算裝置所敘述,在第二範例中,計算裝置A 360、計算裝置B 364及計算裝置C 368可以是單一計算裝置在不同時間(例如分別為第一時間、第二時間與第三時間)的不同情況。在這種範例中,計算裝置B 364可以是在藉由移除模組C 330及加入模組E 334,以將模組清單362更新至模組清單366之後的計算裝置A 360。在這種範例中,當計算裝置於第一時間使用模組清單362啟動時,它將會使用韌體包472以啟動。然而,在將模組清單362更新至模組清單366之後,那個相同的計算裝置可以在第二時間使用韌體包474以啟動。因此,單純藉由對次要模組324作改變,即可以不同的兩組韌體編碼啟動單一計算裝置。
每個模組326、模組328、模組330、模組332、模組334及模組336可代表於啟動程序之期間,可被計算裝置所執行的編碼單位。在一範例中,某些模組可代表用以實作系統管理規格或協定的編碼,像是Redfish標準。在本範例中,模組C可代表Redfish版本1.5,而模組E可代表Redfish版本1.1。於是,在模組清單362與模組清單366中的些微模組清單362與模組清單366中的些微差異,可分別使計算裝置A 360與計算裝置B 364以不同的韌體包372與韌體包374所啟動,而帶往Redfish標準之不同的實作。在某些情況中,單一模組清單可將模組C 330列為模組E 334的較佳替代。在這種情況中,若可能的話會使用模組C 330,但若模組C 330無法取得或者無法使用,則可改用模組E 334。
在某些情況中,計算裝置A 360、計算裝置B 364及計算裝置C 368可包含不同的硬體。在這種情況中,計算裝置A 360、計算裝置B 364與計算裝置C 368各自的韌體包372、韌體包374與韌體包376,可用以初始化不同的硬體組件。然而在某些情況中,可使用不同的硬體以存取次要模組324、存取模組庫338,或者執行計算裝置A 360、計算裝置B 364與計算裝置C 368各自的韌體包372、韌體包374與韌體包376。在這種情況中,計算裝置A 360、計算裝置B 364與計算裝置C 368可個別使用不同的主要模組,而非使用相同的主要模組322。因此,可使用計算裝置A 360、計算裝置B 364與計算裝置C 368各自的主要模組中的不同編碼,以初始化其適合的硬體組件。
根據本揭露之某些態樣,第4圖是描繪模組化組成韌體之程序400的流程圖。程序400可以是在任何適合的計算裝置上所實施,像是第1圖之計算裝置102。
於區塊402,可存取韌體映像檔。存取韌體映像檔可包含存取含有韌體映像檔的本地端記憶體。存取韌體映像檔可包含對計算裝置供電,以使計算裝置之處理器(例如主處理器或獨立處理器)存取及開始執行韌體映像檔。
於區塊404,執行韌體映像檔之主要模組。執行主要模組可包含初始化計算裝置之至少一個硬體組件。該至少一個硬體組件可以是用以實施以下將更進一步詳述的一或多個區塊406、區塊408及區塊410的一種組件。舉例來說,在區塊408的實施需要使用網路介面的情況中,則主要模組於區塊404的執行可包含網路介面的初始化。
於區塊406,可存取模組清單。模組清單可表示一組所選取模組,待使用於實施程序400的計算裝置之啟動。於區塊406所存取的模組清單可以是使用者可修改的,像是經由文字編輯器或管理介面。在某些情況中,於區塊406的模組清單可包含關聯於給定模組的一或多個較佳替代模組,然而並非總是必須如此。在某些情況中,模組清單可儲存在,於區塊402所存取的韌體映像檔之次要模組中,然而並非總是必須如此。
於可選的區塊424,可存取組態參數。組態參數可以是平台特定及/或使用者可修改的參數,於程序400之期間所使用,像是於區塊408組成韌體包之期間,及/或於以下將更進一步詳述的區塊420執行一或多個模組之期間。
於區塊408,可組成韌體包。韌體包是在實施程序400的計算裝置啟動之期間,待執行的模組之清單、待執行的一組模組,或待執行的模組之代表。韌體包是基於在區塊406所存取的模組清單。於區塊408組成韌體包,可包含反覆地在模組清單中所鑑別出該組所選取模組之每個模組間跨越。在較佳替代模組表示一個給定模組的情況中,若較佳替代模組被鑑別出以及被使用,則該給定模組可以被跳過。
對於從區塊406,模組清單中所鑑別出所選取模組之每個模組而言,於區塊408組成韌體包,可包含於區塊410存取來自模組庫的模組。於區塊410存取模組可包含將模組設置於模組庫中,像是使用模組之GUID。在某些情況中,於區塊410存取模組可包含存取儲存在實施程序400的計算裝置中的本地端儲存裝置上的模組庫組件。在某些情況中,於區塊410存取模組可包含存取儲存在遠端儲存裝置上的模組庫組件,該模組庫組件可經由實施程序400的計算裝置之網路介面所存取。
在某些情況中,於區塊408組成韌體包,包含於區塊412為給定模組(例如於區塊410所存取的每個模組)存取依附資訊。每個模組可包含模組依附資訊,模組依附資訊表示給定模組與一或多個其他模組之間的依附鏈(chain of dependency)或依附關係。存取模組依附資訊可包含存取母依附資訊(例如一或多個母依附GUID)及/或存取子依附資訊(例如一或多個子依附GUID)。
在某些情況中,依附資訊可使用於區塊414,以將模組清單之模組(例如該組所選取模組)排列至模組序列中。將模組排列至模組序列中可包含排列模組,以使得在模組序列中,每個模組是在其任一母依附模組之後以及其任一子依附模組之前出現。於是,當韌體包於區塊420所執行時,任何母模組可以是在需要母依附模組的模組執行之前所執行。
在某些情況中,於區塊416,可使用模組依附資訊以鑑別欲加入韌體包的附加模組。在某些情況中,母依附模組或子依附模組可表示為可選的或需要的,然而並非總是必須如此。在某些情況中,可假定所列出的任何母依附模組或子依附模組都是需要的。當所需依附模組(例如母依附模組或子依附模組)被列入給定模組之依附資訊中,但未被列入來自模組清單的該組所選取模組中,於區塊408構成韌體包,可包含於區塊416將所需依附模組添加至韌體包(例如將所需依附模組以正確的順序添加至模組序列,像是參考區塊414)。添加所需依附模組可包含在那個模組上實施區塊408的所有態樣,就如同它原本被包含在模組清單中一般,像是參考那個模組以實施區塊410、區塊412、區塊414及區塊416。
在某些情況中,像是使用單一處理器(例如主處理器)以實施程序400時,於區塊408韌體包可以是以模組序列或一模組集合之形式所組成。此韌體包可於區塊420執行。韌體包的執行可包含執行於區塊408所組成的韌體包之每個模組,包含來自區塊106之模組清單的每個該組所選取模組,以及於區塊416所添加的任何附加模組。
在某些情況中,像是使用多個處理器以實施程序400時,於區塊408組成韌體包,可包含於區塊418將給定模組複製到系統記憶體。在這種情況中,可由獨立處理器執行程序400之某些態樣,於區塊420將韌體包的執行留給主處理器。在這種情況中,於區塊408組成韌體包可由獨立處理器所實施,並可包含於區塊418將給定模組複製到系統記憶體。複製給定模組可包含於區塊408將每個待執行模組複製為部份的韌體包,包含來自區塊406之模組清單的每個該組所選取模組,以及於區塊416所添加的任何附加模組。在某些情況中,複製模組可包含使用區塊414之模組序列,以將模組以模組序列的順序進行複製。在某些情況中,區塊414之模組序列可分開地儲存在主處理器可存取的表中(例如儲存在系統記憶體中)。在某些情況中,於區塊418將模組複製到系統記憶體,可包含將記憶體設定儲存在主處理器可存取的表中(例如含有模組序列的表,或是儲存在系統記憶體中的另一張表)。
當使用多個處理器時,於區塊408組成韌體包之後,獨立處理器可將控制權移交給主處理器。於區塊420,主處理器可接著執行韌體包。在這種情況中,執行韌體包可包含存取儲存在系統記憶體中的韌體包。在某些情況中,主處理器可更進一步存取其他資訊,像是含有模組序列及/或記憶體設定的表,其他資訊可被主處理器用以存取及執行韌體包。
在組態參數於區塊424所存取的情況中,於給定模組之執行期間,可將組態參數傳遞給一或多個(例如一個、某些或所有)於區塊420所執行的模組。
在韌體包已於區塊420所執行之後,於區塊422,計算裝置能可選地進入作業系統。在某些情況中,於區塊420所執行的模組可幫助或觸發作業系統的載入。
雖然程序400之區塊是以特定的順序所描繪,在某些情況中,程序400之區塊可以不同的順序發生,可選地包含額外的區塊及/或較少的區塊。在一範例中,於使用獨立處理器時的某些情況中,於區塊406存取模組清單,以及於區塊408組成韌體包,可在主要模組於區塊404執行之前發生。在這種情況中,於區塊418獨立處理器已完成將每個該組所選取模組的每個模組複製到系統記憶體時,獨立處理器可將控制權移交給主處理器,主處理器可在區塊420執行韌體包之前,於區塊404接著執行主要模組。
第5圖是實作本揭露之某些特徵及程序(像是參考第4圖之程序400所呈現)的範例系統架構500之方塊圖。系統架構500可用以實作伺服器、使用者裝置、計算裝置(例如第1圖之計算裝置102、第二計算裝置114、遠端儲存裝置112,或管理計算裝置160),或是任何其他適用以實施本揭露之某些或所有態樣的裝置。系統架構500可以在運行從已編譯指令所取得的軟體應用程式的任何電子裝置上所實作,包含但不限於個人電腦、伺服器、智慧型手機、電子平板、遊戲機、電子郵件裝置,以及類似的裝置。在某些實作中,系統架構500可包含一或多個處理器502(例如主處理器及可選的獨立處理器)、一或多個輸入裝置504、一或多個顯示裝置506、一或多個網路介面508,以及一或多個電腦可讀取媒體。每個這些組件可被匯流排512所耦接。
顯示裝置506可以是任何習知的顯示技術,包含但不限於使用液晶顯示(Liquid Crystal Display;LCD)或發光二極體(Light Emitting Diode;LED)技術的顯示裝置。處理器502可使用任何習知的處理器技術,包含但不限於圖形處理器及多核心處理器。輸入裝置504可以是任何習知的輸入裝置技術,包含但不限於鍵盤(包含虛擬鍵盤)、滑鼠、軌球(trackball),以及觸摸感應墊(touch-sensitive pad),或顯示器。在某些情況中,可使用聲音輸入以提供聲音訊號,像是個人說話的聲音訊號。匯流排512可以是任何以知的內部或外部匯流排技術,包含但不限於工業標準架構(industry standard architecture;ISA)、延伸工業標準架構(extended industry standard architecture;EISA)、周邊組件互連(peripheral component interconnect;PCI)、快速周邊組件互連(PCI Express)、無匯流排(NoBus)、通用序列匯流排(universal serial bus;USB)、序列進階技術附接(Serial ATA),或火線(FireWire)。
電腦可讀取媒體510可以是參與提供指令給處理器502以執行的任何媒體,包含但不限於非揮發性儲存媒體(例如光碟、磁碟、快閃碟等)或揮發性的媒體(例如同步動態隨機存取記憶體(SDRAM)、唯讀記憶體(ROM)等)。舉例來說,電腦可讀取媒體510(例如儲存裝置、媒體及記憶體)可包含纜線,或者含有位元流(bit stream)的無線訊號,以及其他類似的媒體。然而,當被提及時,非暫態電腦可讀取儲存媒體明確地排除像是能量、載波信號(carrier signals)、電磁波及信號本身的媒體。
電腦可讀取媒體510可包含各種指令,以實作作業系統514,以及應用程式520,像是電腦程式。作業系統514可以是多使用者的、多重處理的(multiprocessing)、多重任務的(multitasking)、多執行緒的(multithreading)、即時的,以及類似的作業系統。作業系統514實施基本任務,包含但不限於:從輸入裝置504辨識輸入;將輸出發送給顯示裝置506;記錄電腦可讀取媒體510上的檔案或目錄;控制可透過I/O控制器所直接控制的周邊裝置(例如儲存碟、介面裝置等);以及管理匯流排512上的流量。電腦可讀取媒體510可包含各種指令以實作韌體程序,像是BIOS。在某些情況中,電腦可讀取媒體510可包含韌體套件,韌體套件包含主要模組、次要模組,以及模組庫中的任意數個附加模組(例如第2圖之主要模組222、次要模組224及模組庫238)。電腦可讀取媒體510可包含各種指令,以實作在此所敘述的任何程序,包含但不限於至少第4圖之程序400。
記憶體518可包含高速隨機存取記憶體及/或非揮發性記憶體,像是一或多個磁碟儲存裝置、一或多個光學儲存裝置,及/或快閃記憶體(例如反及(NAND)、反或(NOR))。記憶體518(例如電腦可讀取儲存裝置、媒體及記憶體)可包含纜線,或者含有位元流的無線訊號,以及類似的媒體。然而,當被提及時,非暫態電腦可讀取儲存媒體明確地排除像是能量、載波信號、電磁波及信號本身的媒體。記憶體518可儲存在作業系統上,像是達爾文(Darwin)、RTXC、LINUX、UNIX、OSX、WINDOWS,或是嵌入式作業系統,像是VxWorks。在某些情況中,根據本揭露之某些態樣的韌體套件之態樣,可儲存在記憶體518中。
系統控制器522可以是獨立於處理器502所運作的服務處理器。在某些實作中,系統控制器522可以是基板管理控制器(BMC)。
本揭露之某些態樣及特徵,可以在一或多個電腦程式中有利地實作,電腦程式能在可程式化系統上執行,可程式化系統包含至少一個可程式化處理器,耦接以從資料儲存系統、至少一個輸入裝置及至少一個輸出裝置接收資料及指令,以及將資料及指令傳輸至資料儲存系統、至少一個輸入裝置及至少一個輸出裝置。電腦程式是一組指令,可直接或間接地使用在計算裝置中,以實施某些活動或造成某些結果。電腦程式可以是以任何形式的程式語言(例如Objective C、Java)所編寫,包含已編譯或已解讀的語言,並且能以任何形式所部署,包含部署為單獨的程式,或者是部署為模組、組件、副常式(subroutine),或者適用於計算環境的其他單位。
適用於執行程式指令的處理器包含,例如通用微處理器及特別用途微處理器兩者,以及單一處理器,或是任何一種計算裝置之多個處理器或核心的其中一者。一般來說,處理器會從唯讀記憶體或隨機存取記憶體或上述兩者接收指令及資料。計算裝置的必要元件是處理器以執行指令,以及一或多個記憶體以儲存指令及資料。一般來說,計算裝置也會包含一或多個大量儲存裝置(mass storage device),以儲存資料檔案。這種裝置包含磁碟,像是內部硬碟(internal hard disk)及可移磁碟(removable disk)、磁光碟(magneto-optical disk)及光碟。適用於有形地實施電腦程式指令及資料的儲存裝置,包含所有形式的非揮發性記憶體,包含例如半導體記憶體裝置,像是可抹除可程式化唯讀記憶體(erasable programmable read only memory;EPROM)、電子可抹除可程式化唯讀記憶體(electrically erasable programmable read only memory;EEPROM)及快閃記憶體裝置;磁碟,像是內部硬碟及可移磁碟;磁光碟;以及CD-ROM與DVD-ROM碟。處理器及記憶體可補充或納入特定應用積體電路(application specific integrated circuit;ASIC)。
為了提供與使用者的互動,特徵可實作在具有顯示裝置以及鍵盤與指向裝置(pointing device)的計算裝置上,像是陰極射線管(cathode ray tube;CRT)或LCD螢幕等顯示裝置以向使用者展示資訊,以及像是滑鼠或軌球以讓使用者提供輸入給計算裝置。
本揭露之某些態樣可以在電腦系統中實作,該電腦系統包含後端組件(像是資料伺服器)、中間軟體(middleware)組件(像是應用程式伺服器或網際網路伺服器)、前端組件(像是具有圖形使用者介面或網際網路瀏覽器的客戶端計算裝置),或者上述的任何組合。系統之組件可被任何形式或媒介的數位資料通訊所連接,像是通訊網路。通訊網路之範例包含,例如區域網路(LAN)、廣域網路(WAN),以及形成網際網路的電腦與網路。
計算系統可包含客戶端及伺服器。客戶端及伺服器一般是互為彼此的遠端,且通常是透過網路進行互動。客戶端與伺服器的關係,是藉由在各自的電腦上運行且彼此具有客戶端與伺服器關係的電腦程式所形成。
所揭露實施例的一或多個特徵或步驟,可以是使用應用程式介面(API)所實作。API可定義一或多個參數,該一或多個參數被傳遞於呼叫應用程式(calling application)及其他軟體編碼(例如作業系統、函式庫常式(library routine)、函式)之間,該等軟體編碼提供服務、提供資料,或者實施作業或計算。API可實作為程式碼中的一或多個呼叫,基於API文規格文件中所定義的約定,透過參數清單或其他結構發送或接收參數。參數可以是常數(constant)、金鑰(key)、資料結構、物件、物件類別(object class)、變數、資料類型、指標、陣列、清單,或是另一個呼叫。API呼叫及參數可以任何一種程式語言所實作。程式語言可定義程式設計師會運用來存取API支持功能的詞彙及呼叫約定(calling convention)。在某些實作中,API呼叫可將運行應用程式的裝置之能力,像是輸入能力、輸出能力、處理能力、電源能力、通訊能力,以及類似的能力,回報給應用程式。
以上對於實施例的敘述,包含圖示的實施例,僅出於例證及敘述的目的所提出,而並非意圖窮舉或限制於所揭露的確切形式。對於本領域通常知識者而言,許多的修改、調適及其使用將是顯而易見的。在不背離本發明之精神或範圍的前提下,可根據此處的揭露,對所揭露實施例作出許多改變。因此,本發明之廣度及範圍不應受限於任何一種上述的實施例。
雖然本發明已參考一或多種實作所圖示及敘述,當本領域通常知識者閱讀與理解本說明書及附加的圖式,將會想到或知道均等的替代及修改。此外,雖然本發明之特定特徵可能已僅參考數種實作之一所揭露,在可能需要或利於任何給定之特定應用的情況下,這種特徵可以與其他種實作的一或多個其他特徵合併。
在此所使用的術語僅以敘述特定的實施例為目的,而並非意圖限制本發明。如在此所使用的,單數形「一」及「該」意圖亦包含複數形,除非文意明顯另有所指。此外,倘若「包含」、「具有」、「帶有」等用詞或者其變形,被使用在實施方式及/或請求項中,這類詞彙意圖被包含在類似於「包括」一詞的方式中。
除非另有定義,在此所使用的所有詞彙(包含技術性及科學性的詞彙),與本技術領域之普通技術之人一般所理解的,具有相同的含意。此外,像是被定義在一般所使用的字典中的詞彙,應被解讀為具有與它們在相關技術的文意中一致的含意,且除非在此被明確地如此定義,否則該等詞彙不會被解讀為理想化或過度正式的概念。
100:計算環境
102:計算裝置
104:處理器
106:獨立處理器
108:本地端儲存裝置
110:網路
112:遠端儲存裝置
114:第二計算裝置
116:韌體套件
118:模組庫組件
120:韌體套件
138:模組庫
139:模組庫組件
152:平台特定韌體
153:平台特定韌體
158:管理控制器
160:管理計算裝置
178:模組庫組件
180:網路介面
216:韌體套件
222:主要模組
224:次要模組
226:模組A
227:模組A(副本)
228:模組B
230:模組C
231:模組C(副本)
232:模組D
233:模組D(副本)
234:模組E
236:模組n
238:模組庫
240:韌體包
242:模組屬性
244:模組GUID
246:母依附GUID
248:子依附GUID
252:平台特定韌體
254:模組編碼
256:組態參數
282:模組清單
316:韌體套件
322:主要模組
324:次要模組
326:模組A
328:模組B
330:模組C
332:模組D
334:模組E
336:模組n
338:模組庫
352:平台特定韌體
360:計算裝置A
362:模組清單
364:計算裝置B
366:模組清單
368:計算裝置C
370:模組清單
372,374,376:模組包
400:程序
402-424:區塊
500:系統架構
502:處理器
504:輸入裝置
506:顯示裝置
508:網路介面
510:電腦可讀取媒體
512:匯流排
514:作業系統
518:記憶體
520:應用程式
522:系統控制器
本說明書參考以下附帶的圖式,其中在不同圖中使用相同的參考符號,是意圖繪示相同或類似的組件。
第1圖是根據本揭露之某些態樣描繪實作模組韌體組成的計算環境的示意圖。
第2圖是根據本揭露之某些態樣描繪初始的韌體套件及可執行的韌體包的示意圖。
第3圖是根據本揭露之某些態樣描繪多個計算裝置上所使用的一般模組庫的示意圖。
第4圖是根據本揭露之某些態樣描繪模組化組成多個計算裝置上的韌體之程序的流程圖。
第5圖是實作本揭露之某些態樣及特徵的範例系統架構之方塊圖。
本揭露可接受各式各樣的修改及替代的形式。某些代表性的實施例,已被圖式中的範例所顯示,並將在此被詳細地敘述。然而,應被理解的是,本發明並非意圖限定於所揭露的特定形式。反之,本揭露涵蓋所有的修改、均等物,以及落在如附加的請求項所定義的本發明之範圍與精神之內的替代方案。
400:程序
402-424:區塊
Claims (10)
- 一種組成模組化韌體的方法,包括:存取來自一計算裝置之本地端儲存裝置的一韌體映像檔,該韌體映像檔包含一主要模組及一模組清單;執行該主要模組,其中執行該主要模組包含初始化該計算裝置之一或多個硬體資源;存取關聯於該韌體映像檔的該模組清單,其中該模組清單包含關聯於一模組庫之一組所選取模組的獨一辨識資訊(unique identification information),其中該模組庫包含複數個可執行模組,該組所選取模組是該等可執行模組中於一啟動程序之期間所執行者;基於該組所選取模組,組成一韌體包,其中組成該韌體包包含存取該組所選取模組之每一模組;以及執行該韌體包。
- 如請求項1之方法,其中組成該韌體包更包含:存取關聯於該組所選取模組之至少一模組的依附資訊;使用該依附資訊鑑別一附加模組,其中該附加模組未包含在該組所選取模組中;以及將該附加模組添加到該韌體包。
- 如請求項1之方法,其中組成該韌體包更包含:存取關聯於該組所選取模組之至少一模組的依附資訊,其中該依附資訊鑑別一母模組及一子模組;以及 使用該依附資訊產生一模組序列,其中產生該模組序列包含在該子模組之前,將該母模組部署於該模組序列中,其中執行該韌體包包含基於該模組序列執行該韌體包。
- 如請求項1之方法,其中該計算裝置包含一主處理器及一獨立處理器;其中執行該主要模組、存取該模組清單,以及組成該韌體包,是由該獨立處理器所實施;以及其中執行該韌體包是由該主處理器所實施;其中組成該韌體包更包含將該組所選取模組之每一模組複製到該主處理器可存取的系統記憶體中;以及其中執行該韌體包包含存取來自該系統記憶體的該韌體包。
- 如請求項4之方法,更包括:存取來自該韌體映像檔的多個組態參數,並將該等組態參數儲存在該系統記憶體中;以及將一模組序列儲存在該系統記憶體中,其中該模組序列指示執行該韌體包之該等模組的一順序;其中執行該韌體包更包含以該模組序列所指示的該順序,執行該韌體包之每一模組;其中執行該韌體包之每一模組,包含套用該等組態參數。
- 如請求項1之方法,更包括:更新該模組清單,以產生一已更新模組清單,該已更新模組清單具有一組已更新所選取模組,其中該組已更新所選取模組不同於 該組所選取模組;重新啟動該計算裝置;基於該組已更新所選取模組,組成一已更新韌體包;以及執行該已更新韌體包。
- 一種電腦程式產品,有形地實施於一非暫態機器可讀取儲存媒體中,包含多個指令,設置以使一或多個資料處理設備實施請求項1之方法。
- 一種組成模組化韌體的計算裝置,包括:一第一硬體裝置及一第二硬體裝置;一或多個處理器;以及一非暫態電腦可讀取儲存媒體,含有多個指令,當在該一或多個處理器上執行時,使該一或多個處理器實施操作,包含:存取一韌體映像檔,該韌體映像檔包含一主要模組及一模組清單;執行該主要模組,其中執行該主要模組包含初始化該第一硬體裝置;存取關聯於該韌體映像檔的該模組清單,其中該模組清單包含關聯於一模組庫之一組所選取模組的獨一辨識資訊,其中該模組庫包含複數個可執行模組,該組所選取模組是該等可執行模組中於一啟動程序之期間所執行者;基於該組所選取模組,組成一韌體包,其中組成該韌體包包含存取該組所選取模組之每一模組;以及 執行該韌體包,其中執行該韌體包包含初始化該第二硬體裝置。
- 如請求項8之計算裝置,更包括一網路介面,其中存取該組所選取模組之每一模組包含經由該網路介面,存取來自一遠端儲存裝置的該組所選取模組之至少一模組。
- 如請求項8之計算裝置,其中該一或多個處理器包含一主處理器及一獨立處理器;其中執行該主要模組、存取該模組清單,以及組成該韌體包,是由該獨立處理器所實施;以及其中執行該韌體包是由該主處理器所實施;其中組成該韌體包更包含將該組所選取模組之每一模組複製到該主處理器可存取的系統記憶體中;以及其中執行該韌體包包含存取來自該系統記憶體的該韌體包。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US17/205,818 | 2021-03-18 | ||
US17/205,818 US11989551B2 (en) | 2021-03-18 | 2021-03-18 | Modular firmware composition |
Publications (2)
Publication Number | Publication Date |
---|---|
TWI777636B true TWI777636B (zh) | 2022-09-11 |
TW202238379A TW202238379A (zh) | 2022-10-01 |
Family
ID=83284740
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
TW110123673A TWI777636B (zh) | 2021-03-18 | 2021-06-29 | 組成模組化韌體的方法、裝置及電腦程式產品 |
Country Status (3)
Country | Link |
---|---|
US (1) | US11989551B2 (zh) |
CN (1) | CN115113912A (zh) |
TW (1) | TWI777636B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
TWI846417B (zh) * | 2023-04-07 | 2024-06-21 | 緯穎科技服務股份有限公司 | 電腦網路及對電腦網路中電腦系統的周邊裝置的更新韌體的方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
TW200405209A (en) * | 2002-02-11 | 2004-04-01 | Intel Corp | Method and system for linking firmware modules in a pre-memory execution environment |
CN101114233A (zh) * | 2006-07-26 | 2008-01-30 | 戴尔产品有限公司 | 固件更新的设备与方法 |
TW202004496A (zh) * | 2018-05-22 | 2020-01-16 | 廣達電腦股份有限公司 | 透過遠端工具程式更新靭體的方法、電腦系統以及非暫態電腦可讀取媒體 |
TW202034176A (zh) * | 2019-03-13 | 2020-09-16 | 廣達電腦股份有限公司 | 伺服器系統、集中式快閃記憶體模組以及更新快閃韌體映像檔的方法 |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6381693B2 (en) * | 1998-12-31 | 2002-04-30 | Intel Corp. | Arrangements having firmware support for different processor types |
US6633976B1 (en) * | 2000-08-10 | 2003-10-14 | Phoenix Technologies Ltd. | Method of storing BIOS modules and transferring them to memory for execution |
US7146609B2 (en) * | 2002-05-17 | 2006-12-05 | Sun Microsystems, Inc. | Method, system and article of manufacture for a firmware image |
US7603562B2 (en) * | 2005-02-02 | 2009-10-13 | Insyde Software Corporation | System and method for reducing memory requirements of firmware |
TWI349882B (en) * | 2007-09-04 | 2011-10-01 | Quanta Comp Inc | Firmware update system and method for update the same |
US8898654B2 (en) * | 2012-08-29 | 2014-11-25 | Microsoft Corporation | Secure firmware updates |
US9311486B2 (en) * | 2013-08-13 | 2016-04-12 | American Megatrends, Inc. | Network based firmware feature configuration and firmware image generation |
WO2017052528A1 (en) * | 2015-09-23 | 2017-03-30 | Hewlett Packard Enterprise Development Lp | Selecting and loading firmware volumes |
US10331434B2 (en) * | 2016-12-21 | 2019-06-25 | Quanta Computer Inc. | System and method for remotely updating firmware |
US11126725B2 (en) * | 2019-06-12 | 2021-09-21 | Dell Products L.P. | Secure firmware capsule update using NVMe storage and method therefor |
-
2021
- 2021-03-18 US US17/205,818 patent/US11989551B2/en active Active
- 2021-06-29 TW TW110123673A patent/TWI777636B/zh active
- 2021-07-22 CN CN202110829531.1A patent/CN115113912A/zh active Pending
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
TW200405209A (en) * | 2002-02-11 | 2004-04-01 | Intel Corp | Method and system for linking firmware modules in a pre-memory execution environment |
CN101114233A (zh) * | 2006-07-26 | 2008-01-30 | 戴尔产品有限公司 | 固件更新的设备与方法 |
TW200813834A (en) * | 2006-07-26 | 2008-03-16 | Dell Products Lp | Apparatus and methods for updating firmware |
TW202004496A (zh) * | 2018-05-22 | 2020-01-16 | 廣達電腦股份有限公司 | 透過遠端工具程式更新靭體的方法、電腦系統以及非暫態電腦可讀取媒體 |
TW202034176A (zh) * | 2019-03-13 | 2020-09-16 | 廣達電腦股份有限公司 | 伺服器系統、集中式快閃記憶體模組以及更新快閃韌體映像檔的方法 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
TWI846417B (zh) * | 2023-04-07 | 2024-06-21 | 緯穎科技服務股份有限公司 | 電腦網路及對電腦網路中電腦系統的周邊裝置的更新韌體的方法 |
Also Published As
Publication number | Publication date |
---|---|
US20220300276A1 (en) | 2022-09-22 |
TW202238379A (zh) | 2022-10-01 |
US11989551B2 (en) | 2024-05-21 |
CN115113912A (zh) | 2022-09-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9864600B2 (en) | Method and system for virtualization of software applications | |
US8370835B2 (en) | Method for dynamically generating a configuration for a virtual machine with a virtual hard disk in an external storage device | |
Zimmer et al. | Beyond BIOS: developing with the unified extensible firmware interface | |
US20110010700A1 (en) | Virtualization of configuration settings | |
US8539214B1 (en) | Execution of a program module within both a PEI phase and a DXE phase of an EFI firmware | |
US10025587B2 (en) | Method of bootup and installation, and computer system thereof | |
CN114222975A (zh) | 使用存储器孔径冲刷顺序的数据保存 | |
US10402204B1 (en) | Multi-platform firmware support | |
US9672047B1 (en) | Systems and methods for accessing a bootable partition on a serial peripheral interface device | |
US10664598B1 (en) | Firmware security patch deployment | |
US11663020B2 (en) | Bootstrapping frameworks from a generated static initialization method for faster booting | |
JP2023507709A (ja) | 統合された参照及び二次のマーキング | |
US10514940B2 (en) | Virtual application package reconstruction | |
TWI777636B (zh) | 組成模組化韌體的方法、裝置及電腦程式產品 | |
CN111782335A (zh) | 通过进程内操作系统的扩展应用机制 | |
US10540151B1 (en) | Graphical customization of a firmware-provided user interface (UI) | |
Barnes | Pro Windows Subsystem for Linux (WSL) | |
US7873807B1 (en) | Relocating a program module from NVRAM to RAM during the PEI phase of an EFI-compatible firmware | |
US11200203B1 (en) | Accessing files stored in a firmware volume from a pre-boot application | |
US20070260577A1 (en) | Providing COM access to an isolated system | |
US8135943B1 (en) | Method, apparatus, and computer-readable medium for generating a dispatching function | |
US20150227723A1 (en) | Flexible licensing architecture | |
US11748117B2 (en) | Operating system partitioning of different users for single-user applications | |
TWI549056B (zh) | 以函式庫作業系統達成之應用程式相容性 | |
Waldén | Customizing BIOS/UEFI From OS Using EFI Variables |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
GD4A | Issue of patent certificate for granted invention patent |