專利名稱:安全使用基本輸入輸出系統(tǒng)服務(wù)的系統(tǒng)和方法
技術(shù)領(lǐng)域:
本發(fā)明涉及安全使用基本輸入輸出系統(tǒng)(BIOS)報(bào)務(wù)的系統(tǒng)和方法。
背景技術(shù):
在虛擬存儲(chǔ)器子系統(tǒng)中,采用“虛擬”存儲(chǔ)器尋址方法,在該方法中,軟件程序中利用的存儲(chǔ)器地址間接映射到物理存儲(chǔ)器的存儲(chǔ)單元上。翻譯成物理地址一般由處理器完成,這種物理地址不能訪問用戶模式軟件和基本輸入/輸出系統(tǒng)(BIOS)。
這種虛擬存儲(chǔ)器子系統(tǒng)的一個(gè)例子是由Windows NT使用、由微軟公司生產(chǎn)和銷售的子系統(tǒng)。尤其是,Windows NT包含了請求分頁式虛擬存儲(chǔ)器子系統(tǒng)。為在Windows NT操作系統(tǒng)上運(yùn)行的程序所提供的存儲(chǔ)器地址空間被保護(hù)以防止其他用戶模式程序,正如其他程序也受到保護(hù)一樣。這保證了用戶模式服務(wù)程序和應(yīng)用程序不覆蓋彼此的存儲(chǔ)器或者執(zhí)行彼此的指令。核心模式服務(wù)程序和應(yīng)用程序以類似的方式受到保護(hù)。如果出現(xiàn)試圖訪問程序指定的虛擬空間之外的存儲(chǔ)器的情況,則終止程序并通知用戶。虛擬存儲(chǔ)器子系統(tǒng)還防止以用戶模式軟件直接訪問物理存儲(chǔ)器地址和作為計(jì)算機(jī)一部分的輸入/輸出設(shè)備。
目前的趨勢日益朝著使用能用虛擬存儲(chǔ)器子系統(tǒng)執(zhí)行操作系統(tǒng)的計(jì)算機(jī)系統(tǒng)上的輸入/輸出設(shè)備方向發(fā)展。在這些系統(tǒng)中,沒有訪問程序虛擬存儲(chǔ)空間之外的存儲(chǔ)器的裝置,例如BIOS功能。解決這種問題的一個(gè)方法是為設(shè)備安裝讀包含指令的文件的設(shè)備驅(qū)動(dòng)程序。驅(qū)動(dòng)程序讀出文件并將這些指令寫(或下載)到設(shè)備存儲(chǔ)器中。但是,這種類型的設(shè)備驅(qū)動(dòng)程序僅具有存儲(chǔ)器和輸入/輸出操作的有限尋址能力。此外,它不允許執(zhí)行物理存儲(chǔ)空間中的系統(tǒng)處理器指令。
因此,在技術(shù)上需要一種通過虛擬存儲(chǔ)器子系統(tǒng)訪問和執(zhí)行物理存儲(chǔ)器內(nèi)容的系統(tǒng)和方法,以便于提高存儲(chǔ)器和輸入/輸出操作的尋址能力和允許直接通過物理存儲(chǔ)器執(zhí)行處理器指令。
而且,能更新或配置存儲(chǔ)在計(jì)算機(jī)系統(tǒng)或平臺(tái)上的數(shù)據(jù)。在特定情況下,數(shù)據(jù)是十分敏感的??膳渲玫拿舾袛?shù)據(jù)(sensitive data)的一個(gè)好例子是計(jì)算機(jī)系統(tǒng)的基本輸入輸出系統(tǒng)(BIOS)。通常存儲(chǔ)在某種非易失性存儲(chǔ)器中,BIOS是機(jī)器代碼,通常是操作系統(tǒng)(OS)的一部分,它使中央處理單元(CPU)能完成各種任務(wù),例如初始化、診斷、從大容量存儲(chǔ)器裝載操作系統(tǒng)核心和常規(guī)輸入/輸出(“I/O”)功能。一旦加電,CPU通過取駐留在BIOS中的指令代碼“引導(dǎo)”。在沒有任何安全保護(hù)的情況下,BIOS容易通過捕獲和重現(xiàn)服務(wù)請求調(diào)用BIOS提供的函數(shù)。
因此,還需要提供一種系統(tǒng)和方法來校驗(yàn)訪問或修改BIOS中數(shù)據(jù)的服務(wù)請求的安全性以及實(shí)施那些遠(yuǎn)程請求消息的正確權(quán)限。
發(fā)明內(nèi)容
本發(fā)明提供了一種安全利用基本輸入輸出系統(tǒng)(BIOS)服務(wù)的系統(tǒng)和方法。
根據(jù)本發(fā)明的一個(gè)方面,系統(tǒng)包括存儲(chǔ)指令序列的存儲(chǔ)器,通過指令序列處理基于處理器的系統(tǒng),其中存儲(chǔ)器包括物理存儲(chǔ)器和虛擬存儲(chǔ)器。系統(tǒng)還包括執(zhí)行所存儲(chǔ)的指令序列的處理器。存儲(chǔ)的指令序列包括的過程使處理器將多個(gè)預(yù)定指令從物理存儲(chǔ)器映射到虛擬存儲(chǔ)器中,確定對虛擬存儲(chǔ)器中多個(gè)預(yù)定指令序列之一的補(bǔ)償,接收指令執(zhí)行多個(gè)預(yù)定指令序列其中之一,將控制傳送到多個(gè)預(yù)定指令序列其中之一,以及處理來自虛擬存儲(chǔ)器的多個(gè)預(yù)定指令序列其中之一。
系統(tǒng)的另一個(gè)方面包括訪問驅(qū)動(dòng)程序產(chǎn)生使用BIOS服務(wù)的服務(wù)請求,使得服務(wù)請求包含用密鑰對中的密鑰建立的服務(wù)請求簽名。系統(tǒng)還包括校驗(yàn)使用密鑰對中的公開密鑰的服務(wù)請求簽名的接口以保證服務(wù)請求的安全性。
圖1是信息分配系統(tǒng)的一個(gè)實(shí)施例的系統(tǒng)方框圖,其中使用了本發(fā)明的方法。
圖2示出了實(shí)現(xiàn)本發(fā)明實(shí)施例的一個(gè)示范性處理器系統(tǒng)或用戶計(jì)算機(jī)系統(tǒng)。
圖3示出了圖2計(jì)算機(jī)系統(tǒng)的一個(gè)實(shí)施例圖,其中使用了本發(fā)明的系統(tǒng)和方法。
圖4示出了利用本發(fā)明系統(tǒng)和方法的操作系統(tǒng)結(jié)構(gòu)的全功能框圖。
圖5是方框圖,示出了根據(jù)本發(fā)明原理提供的訪問驅(qū)動(dòng)程序46初始化過程。
圖6A示出了本發(fā)明初始化過程的一個(gè)實(shí)施例的流程圖。
圖6B示出了圖6A的過程塊610的詳細(xì)流程圖。
圖6C示出了圖6A的過程塊630的詳細(xì)流程圖。
圖7A示出了本發(fā)明執(zhí)行過程的流程圖。
圖7B示出了圖7A的過程塊640的詳細(xì)流程圖。
圖8示出了利用本發(fā)明系統(tǒng)和方法的操作系統(tǒng)結(jié)構(gòu)的另一個(gè)全功能框圖。
圖9示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的兩個(gè)系統(tǒng)組件之間的交互序列的序列。
圖10略述了根據(jù)本發(fā)明一個(gè)實(shí)施例的會(huì)話請求的產(chǎn)生。
圖11示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的權(quán)限證明。
圖12示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的會(huì)話請求。
圖13示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的服務(wù)請求。
圖14略述了根據(jù)本發(fā)明一個(gè)實(shí)施例請求建立工作會(huì)話的條款(acts)。
圖15略述了根據(jù)本發(fā)明一個(gè)實(shí)施例的服務(wù)請求的產(chǎn)生。
圖16示出了根據(jù)本發(fā)明一個(gè)實(shí)施例處理服務(wù)請求中所需的條款。
圖17示出了根據(jù)本發(fā)明一個(gè)實(shí)施例涉及終止當(dāng)前工作會(huì)話的條款。
圖18示出了根據(jù)本發(fā)明實(shí)施例產(chǎn)生權(quán)限證明的過程。
具體實(shí)施例方式
定義正如本文所討論的,“計(jì)算機(jī)系統(tǒng)”是一個(gè)包括能處理數(shù)據(jù)的電路的產(chǎn)品。計(jì)算機(jī)系統(tǒng)可以包括但不限于以下產(chǎn)品通用計(jì)算機(jī)系統(tǒng)(例如服務(wù)器、便攜式電腦、臺(tái)式電腦、掌上電腦、個(gè)人電子設(shè)備等)、個(gè)人計(jì)算機(jī)(PC)、硬拷貝設(shè)備(例如打印機(jī)、繪圖儀、傳真機(jī)等)、銀行設(shè)備(例如自動(dòng)取款機(jī))以及類似產(chǎn)品。信息介質(zhì)是提供代表貨物和服務(wù)的生產(chǎn)商信息的WEB站點(diǎn),為供應(yīng)者和其他商業(yè)所提供的產(chǎn)品和/或服務(wù)交易提供相應(yīng)的信息。內(nèi)容指應(yīng)用程序、驅(qū)動(dòng)程序、實(shí)用程序、文件、有效負(fù)載等以及其中一些的組合,也指圖形、信息材料(文章、股票報(bào)價(jià)(stock quotes)等)以及類似物,既可以是單一的也可以是任何一種組合。另外,“通信鏈接”指通信的媒體或通道。通信鏈接可以包括、但不限于電話線、調(diào)制解調(diào)器連接、Internet連接、綜合業(yè)務(wù)數(shù)字網(wǎng)(ISDN)連接、異步轉(zhuǎn)移模式(ATM)連接、幀中斷連接、以太網(wǎng)連接、同軸連接、光纖連接、衛(wèi)星連接(例如數(shù)字衛(wèi)星服務(wù)等)、無線連接、無線電頻率(RF)鏈接、電動(dòng)鏈接、雙向傳呼連接等,以及這些連接的組合。加電自檢(POST)指在裝入OS前執(zhí)行配置和檢測系統(tǒng)硬件的指令。
系統(tǒng)綜述下面描述的是對結(jié)合本發(fā)明實(shí)施例的示例性系統(tǒng)的說明。
圖1示出了信息分配系統(tǒng)10的一個(gè)實(shí)施例的系統(tǒng)方框圖,其中使用了本發(fā)明的設(shè)備和方法。系統(tǒng)10涉及提供信息介質(zhì)。它包括安全的構(gòu)建和維護(hù)、Internet用戶的私人知識(shí)庫以及系統(tǒng)性狀,主要通過保證書服務(wù)注冊、Internet服務(wù)注冊,系統(tǒng)性狀以及用戶選擇來收集。最初,該信息被用來由所購硬件和軟件產(chǎn)品的制造商、以及在線或其它服務(wù)的提供者對用戶進(jìn)行注冊。隨著時(shí)間的推移,利用用戶數(shù)據(jù)建立用戶性狀或通知用戶有關(guān)軟件的更新和升級(jí),從而鼓勵(lì)在線購買相關(guān)產(chǎn)品以及使一對一交易和其它服務(wù)成為可能。
在一個(gè)實(shí)施例中,使用兩個(gè)軟件模塊實(shí)現(xiàn)本發(fā)明的不同實(shí)施例。一個(gè)常駐用戶系統(tǒng),用來訪問預(yù)定WEB站點(diǎn)。例如,在一個(gè)實(shí)施例中,操作系統(tǒng)及基本輸入輸出系統(tǒng)(BIOS)預(yù)裝在計(jì)算機(jī)系統(tǒng)內(nèi),當(dāng)計(jì)算機(jī)系統(tǒng)隨后被首次加電時(shí),為便于討論,將應(yīng)用程序稱為第一軟件模塊(在一個(gè)實(shí)施例中,第一軟件模塊為初始啟動(dòng)應(yīng)用程序(ISUA),這將在以下加以討論),該應(yīng)用程序允許在預(yù)引導(dǎo)環(huán)境下啟動(dòng)一個(gè)或多個(gè)可執(zhí)行程序。在一個(gè)實(shí)施例中,第一軟件模塊便于在OS裝入、引導(dǎo)、執(zhí)行和/或運(yùn)行之前啟動(dòng)一個(gè)或多個(gè)可執(zhí)行程序。在一個(gè)實(shí)施例中,鼓勵(lì)用戶選擇使用這樣的程序(例如使用第一軟件模塊),在另一個(gè)實(shí)施例中,自動(dòng)啟動(dòng)該程序。包含在第一軟件模塊中的程序可作為在適當(dāng)時(shí)間運(yùn)行的工具和效用,通過正確的用戶授權(quán),也允許用戶通過連接到PC上的Internet下載包括驅(qū)動(dòng)程序、應(yīng)用程序以及附加文件或有效負(fù)載的第二軟件模塊。如果OS不能成功啟動(dòng),這些程序也可用來提供系統(tǒng)的遙控管理。
一旦第二軟件模塊被發(fā)送,它就變成存儲(chǔ)駐留,并不能傳送第一軟件模塊的拷貝。在第二軟件模塊不能運(yùn)行并變得不可靠或被刪除前,一旦最初的第一軟件模塊如上所述被再次傳送,仍駐留在系統(tǒng)非易失性存儲(chǔ)器中的第一軟件模塊的原始拷貝保持空閑。第二軟件模塊可包括將用戶連接到Internet上的特殊服務(wù)器的應(yīng)用程序,以及指導(dǎo)用戶至預(yù)定WEB站點(diǎn)查找授權(quán)以下載更多的預(yù)約材料。第二軟件模塊也可以包括與第一軟件模塊內(nèi)容相同或機(jī)似的內(nèi)容。
在一個(gè)實(shí)施例中,系統(tǒng)也可以包括存儲(chǔ)在只讀存儲(chǔ)器BIOS(ROM BIOS)中的初始有效負(fù)載。在一個(gè)實(shí)施例中,初始有效負(fù)載是第一軟件模(例如ISUA)的一部分。在另一個(gè)實(shí)施例中,初始有效負(fù)載作為模塊存儲(chǔ)在ROM BIOS中,且與第一軟件模塊分開。在一個(gè)實(shí)施例中,在加電自檢(POST)之后但在引導(dǎo)、裝入和/或執(zhí)行OS之前,從ROM BIOS啟動(dòng)初始有效負(fù)載并在屏幕上顯示出來。這可以發(fā)生在預(yù)定時(shí)間內(nèi),例如當(dāng)建立、裝配和檢測系統(tǒng)時(shí),或當(dāng)最終用戶首次激活系統(tǒng)時(shí)。在另一個(gè)實(shí)施例中,該初始有效負(fù)載在預(yù)定時(shí)間內(nèi)被復(fù)制至預(yù)定位置(例如系統(tǒng)的硬盤上),例如當(dāng)建立、裝配和檢測系統(tǒng)時(shí),或當(dāng)最終用戶首次激活系統(tǒng)時(shí)。一旦被復(fù)制,在POST后但OS運(yùn)行前執(zhí)行有效負(fù)載,并在屏幕上顯示圖形、廣告、動(dòng)畫、聯(lián)合照相專家組(JPEG)/活動(dòng)圖像專家組(MPEG)格式的材料。當(dāng)發(fā)送附加程序和/或有效負(fù)載時(shí)(通過Internet或其它的外部連接),在OS引導(dǎo)前以及引導(dǎo)期間可用顯示屏幕以消息或圖形的形式來提供可定制屏幕。此外,可利用在第一軟件模塊中發(fā)送的可執(zhí)行程序以及從Web站點(diǎn)下載的后續(xù)程序(例如第二軟件模塊)來測量PC以確定安裝的不同類型的設(shè)備、驅(qū)動(dòng)程序及應(yīng)用程序。在一個(gè)實(shí)施例中,本文結(jié)合題為“用于計(jì)算機(jī)上自動(dòng)安裝及配置軟件的方法及設(shè)備”的未決的申請序列號(hào)為__的美國專利進(jìn)行描述,利用第一軟件模塊識(shí)別及為用戶自動(dòng)產(chǎn)生快捷方式和/或書簽。從Web站點(diǎn)下載的程序可包括收集和維護(hù)基于用戶選擇的用戶性狀的軟件。這些信息可提供給信息介質(zhì),隨后將部分信息和/或基于該信息的已編譯數(shù)據(jù)給供應(yīng)者和其它商業(yè)以獲得供應(yīng)者和其它商業(yè)所提供的信息升級(jí)或修訂。
參考圖1,信息分配系統(tǒng)10包括將一個(gè)或多個(gè)通信鏈接301-30N連接到一個(gè)或多個(gè)用戶計(jì)算機(jī)系統(tǒng)401-40N(“40”)的服務(wù)中心20。該服務(wù)中心20包括一個(gè)或多個(gè)服務(wù)器22、一個(gè)或多個(gè)數(shù)據(jù)庫24以及一個(gè)或多個(gè)計(jì)算機(jī)261-26M。多個(gè)用戶計(jì)算機(jī)系統(tǒng)401-40N能同時(shí)訪問一個(gè)或多個(gè)計(jì)算機(jī)261-26M。如果使用多個(gè)計(jì)算機(jī),則可通過局域網(wǎng)(LAN)或其它類似的連接技術(shù)連接計(jì)算機(jī)261-26M。然而,服務(wù)中心20也可能有其他配置。例如,具有許多運(yùn)行在大型計(jì)算機(jī)上的內(nèi)部程序或過程的更少量的大型計(jì)算機(jī)(即少數(shù)大型機(jī)、小型計(jì)算機(jī)等計(jì)算機(jī))能夠與用戶計(jì)算機(jī)建立通信鏈接。
服務(wù)中心20也可以連接到遠(yuǎn)程網(wǎng)絡(luò)50(例如Internet)或遠(yuǎn)程站點(diǎn)(例如圖1中未示出的衛(wèi)星)。遠(yuǎn)程網(wǎng)絡(luò)50或遠(yuǎn)程站點(diǎn)允許服務(wù)中心20提供更多種類的可存儲(chǔ)在服務(wù)中心20上的計(jì)算機(jī)軟件、內(nèi)容等。可使用連接到服務(wù)中心計(jì)算機(jī)(例如計(jì)算機(jī)26)上的一個(gè)或多個(gè)數(shù)據(jù)庫24將由計(jì)算機(jī)軟件組成的數(shù)據(jù)庫入口存儲(chǔ)在計(jì)算機(jī)26上。在一個(gè)實(shí)施例中,每個(gè)用戶計(jì)算機(jī)系統(tǒng)401-40N具有使其他計(jì)算機(jī)無法訪問的自身的安全數(shù)據(jù)庫(未示出)。通信鏈接301-30N允許一個(gè)或多個(gè)用戶計(jì)算機(jī)系統(tǒng)401-40N同時(shí)與計(jì)算機(jī)261-26M相連接。該連接由服務(wù)器22控制。
在用戶計(jì)算機(jī)系統(tǒng)40與信息服務(wù)計(jì)算機(jī)26建立雙向通信后,以下文所述的方式將內(nèi)容發(fā)送到用戶計(jì)算機(jī)系統(tǒng)40中。下載的內(nèi)容包括測量用戶和/或用戶計(jì)算機(jī)系統(tǒng)的硬件和/或軟件以開發(fā)用戶性狀及用戶系統(tǒng)性狀的應(yīng)用程序。隨后將從用戶和/或用戶計(jì)算機(jī)系統(tǒng)中收集的信息提供給服務(wù)中心20,服務(wù)中心20將附加內(nèi)容提供給基于用戶及系統(tǒng)性狀的用戶計(jì)算機(jī)40。從連接到服務(wù)計(jì)算機(jī)26上的數(shù)據(jù)庫的數(shù)據(jù)庫入口包含關(guān)于計(jì)算機(jī)軟件、硬件以及用戶可用的第三方服務(wù)及產(chǎn)品的信息?;谟脩艉?或系統(tǒng)性狀,該內(nèi)容進(jìn)一步被發(fā)送至用戶計(jì)算機(jī)上顯示。該內(nèi)容也可以包括諸如對現(xiàn)有計(jì)算機(jī)軟件、現(xiàn)有計(jì)算機(jī)軟件的新版本、商標(biāo)新的計(jì)算機(jī)軟件、新的幫助文件等修訂和糾錯(cuò)的信息摘要。該內(nèi)容還可包括有關(guān)用戶感興趣的硬件及第三方產(chǎn)器和服務(wù)的信息。然后用戶能夠從可得到的產(chǎn)品和服務(wù)的摘要中進(jìn)行一個(gè)或多個(gè)選擇,并請求將產(chǎn)品從服務(wù)計(jì)算機(jī)26上傳送到用戶計(jì)算機(jī)上。用戶也可以選擇從可得到的產(chǎn)品和服務(wù)的摘要中購買所需的產(chǎn)品或服務(wù)。
圖2示出了實(shí)現(xiàn)本發(fā)明實(shí)施例的示例性計(jì)算機(jī)系統(tǒng)100。盡管其它的實(shí)施例可能易于使用,但該計(jì)算機(jī)系統(tǒng)100示出了用戶計(jì)算機(jī)系統(tǒng)401-40N和/或計(jì)算機(jī)261-26M的一個(gè)實(shí)施例(圖1)。
參考圖2,計(jì)算機(jī)系統(tǒng)100包括處理器或中央處理器(CPU)104。示出的CPU104包括用于執(zhí)行計(jì)算算術(shù)邏輯部件(ALU)、收集用于暫時(shí)存儲(chǔ)數(shù)據(jù)和指令的寄存器以及控制系統(tǒng)100運(yùn)行的控制器。在一個(gè)實(shí)施例中,CPU104包括由IntelTM公司銷售的任何一種X86、PentiumTM、PentiumLITM以及Pentium ProTM微處理器,由AMDTM公司銷售的K-6微處理器或CyrixTM公司銷售的6X86MX微處理器。其他還包括由數(shù)字設(shè)備公司TM銷售的AlphaTM處理器、MotorolaTM銷售的680X0處理器或IBMTM銷售的Power PCTM處理器。此外,還包括任何一種其它的處理器,包括那些來自于Microsystems、MIPS、IBM、Motorola、NEC、Cyrix、AMD、Nexgen及其它公司的可執(zhí)行CPU104的處理器。CPU104不限于微處理器,還可以是諸如微控制器、數(shù)字信號(hào)處理器、精簡指令集計(jì)算機(jī)(RIS)、應(yīng)用專用集成電路及類似的形式。盡管示出的只有一個(gè)CPU104,但計(jì)算機(jī)系統(tǒng)100可以有多個(gè)處理裝置。
CPU104通過CPU總線108與總路控制器112相連??偩€控制器112包括集成在其中的存儲(chǔ)控制器116,而存儲(chǔ)控制器116在總線控制器112的外部。存儲(chǔ)控制器116設(shè)有CPU104或其它設(shè)備通過存儲(chǔ)器總線120訪問系統(tǒng)存儲(chǔ)器124的接口。在一個(gè)實(shí)施例中,系統(tǒng)存儲(chǔ)器124包括同步動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(SDRAM)。系統(tǒng)存儲(chǔ)器124可隨意包括任何附加或可選擇的高速存儲(chǔ)設(shè)備或存儲(chǔ)電路。總線控制器112與系統(tǒng)總線128相連,該系統(tǒng)總線可以是外圍部件互連(PCI)總線、工業(yè)標(biāo)準(zhǔn)結(jié)構(gòu)(ISA)總線等。與系統(tǒng)總線128相連的是圖形控制器、圖形引擎或視頻控制器132、大容量存儲(chǔ)器152、通信接口設(shè)備156、一個(gè)或多個(gè)輸入/輸出(I/O)設(shè)備1681-168N以及擴(kuò)展總線控制器172。視頻控制器132與視頻存儲(chǔ)器136(例如8兆字節(jié))和視頻BIOS140相連,所有這些都可以集成到一塊卡或設(shè)備上,如數(shù)字144所示。視頻存儲(chǔ)器136用于包含在顯示屏幕148上顯示信息的顯示數(shù)據(jù),視頻BIOS140包括控制視頻控制器132的編碼和視頻服務(wù)。在另一個(gè)實(shí)施例中,視頻控制器132通過加速圖形端口(AGP)總線連接到CPU104上。
大容量存儲(chǔ)器152包括(但不限于)硬盤、軟盤、CD-ROM、DVD-ROM、磁帶、高密度軟盤、大容量可移動(dòng)介質(zhì)、低容量可移動(dòng)介質(zhì)、固態(tài)存儲(chǔ)設(shè)備等,及其組合。大容量存儲(chǔ)器152可以包括任何其他大容量存儲(chǔ)介質(zhì)。通信接口設(shè)備156包括網(wǎng)卡、調(diào)制解調(diào)器接口等,以通過通信鏈路160訪問網(wǎng)絡(luò)164。I/O設(shè)備1681-168N包括鍵盤、鼠標(biāo)、聲頻/語音卡、打印機(jī)和類似設(shè)備。I/O設(shè)備1681-168N可以是盤驅(qū)動(dòng)器,例如光盤驅(qū)動(dòng)器、數(shù)字磁盤驅(qū)動(dòng)器、磁帶驅(qū)動(dòng)器、zip驅(qū)動(dòng)器、jazz驅(qū)動(dòng)器、大容量可移動(dòng)介質(zhì)驅(qū)動(dòng)器、低容量介質(zhì)設(shè)備,和/或它們的任意組合。擴(kuò)展總線控制器172與非易失性存儲(chǔ)器175連接,非易失性存儲(chǔ)器175包括系統(tǒng)固件176。系統(tǒng)固件176包括系統(tǒng)BIOS82,用于控制在其他物品中計(jì)算機(jī)系統(tǒng)100中的硬件設(shè)備。系統(tǒng)固件176還包括ROM180和快速(或EEPROM)184。擴(kuò)展總線控制器172還與具有RAM、ROM和/或快速存儲(chǔ)器(未示出)的擴(kuò)展存儲(chǔ)器188a連接。此外系統(tǒng)100可以包括與總線控制器112連接的存儲(chǔ)器模塊190。在一個(gè)實(shí)施例中,存儲(chǔ)器模塊190包括ROM192和快速(或EEPROM)194。
正如本領(lǐng)域技術(shù)人員所熟悉的,計(jì)算機(jī)系統(tǒng)100還包括操作系統(tǒng)(OS)和至少一個(gè)應(yīng)用程序,在一個(gè)實(shí)施例中,在POST之后從大容量存儲(chǔ)器152將所述操作系統(tǒng)和應(yīng)用程序裝入系統(tǒng)存儲(chǔ)器124中并啟動(dòng)它們。OS可以包括任何類型的OS,包括但不限制于或局限于DOS、WindowTM(例如Window95TM,Window98TM,WindowNTTM),Unix、Linux、OS/2、OS/9、Xenix等。操作系統(tǒng)是一組控制計(jì)算機(jī)系統(tǒng)操作和資源分配的一個(gè)或多個(gè)程序。應(yīng)用程序是一組執(zhí)行用戶所期望的任務(wù)的一個(gè)或多個(gè)軟件程序。
根據(jù)計(jì)算機(jī)編程領(lǐng)域技術(shù)人員的實(shí)踐,下面參考用符號(hào)表示的操作來描述本發(fā)明,除非特別指出,否則這些操作都是由計(jì)算機(jī)系統(tǒng)100執(zhí)行的。這種操作有時(shí)稱為計(jì)算機(jī)執(zhí)行的操作。應(yīng)當(dāng)理解,用符號(hào)表示的這些操作包括通過CPU104操作表示數(shù)據(jù)位的電信號(hào)的和將數(shù)據(jù)位保持在系統(tǒng)存儲(chǔ)器124中的存儲(chǔ)單元中,其他信號(hào)的處理也一樣。保持?jǐn)?shù)據(jù)位的存儲(chǔ)單元是物理單元,這些物理單元具有與數(shù)據(jù)位相對應(yīng)的特殊的電、磁、光或有機(jī)特性。
當(dāng)以軟件實(shí)現(xiàn)時(shí),本發(fā)明的部件實(shí)質(zhì)上是執(zhí)行所需任務(wù)的代碼段。程序或代碼段可以存儲(chǔ)在處理器可讀介質(zhì)中或通過傳輸媒介或通信鏈路由包含在載波中的計(jì)算機(jī)數(shù)據(jù)信號(hào)傳輸?!疤幚砥骺勺x介質(zhì)”可以包括能存儲(chǔ)或傳送信息的任何介質(zhì)。處理器可讀介質(zhì)的例子包括電子電路、半導(dǎo)體存儲(chǔ)器設(shè)備、ROM、快速存儲(chǔ)器、可擦除ROM(EROM)、軟盤、CD-ROM、光盤、硬盤、光纖介質(zhì)、射頻(RF)鏈路等。計(jì)算機(jī)數(shù)據(jù)信號(hào)可以包括能通過傳輸媒介傳播的任何信號(hào),傳輸媒介例如電子網(wǎng)絡(luò)信道、光纖、空氣、電磁、RF鏈路等。代碼段可以通過計(jì)算機(jī)網(wǎng)絡(luò)例如Internet、Intranet等下載。圖3示出了計(jì)算機(jī)系統(tǒng)100的邏輯框圖。參考圖2和3,系統(tǒng)固件176包括在POST期間裝入系統(tǒng)存儲(chǔ)器124并隨后由處理器104執(zhí)行的軟件模塊和數(shù)據(jù)。在一個(gè)實(shí)施例中,系統(tǒng)固件176包括具有系統(tǒng)BIOS處理程序、硬件例行程序等的系統(tǒng)BIOS模塊,ROM應(yīng)用程序接口(RAPI)模塊84,初始啟動(dòng)應(yīng)用程序(ISUA)模塊86,初始有效負(fù)載88a,密鑰90,加密引擎92和顯示引擎94。上述模塊和部分系統(tǒng)固件176可以包含在ROM180和/或閃存184中。或者,上述模塊和部分系統(tǒng)固件176可以包含在ROM190和/或閃存194中。RAPI84,ISUA86和初始有效負(fù)載88a可以獨(dú)立開發(fā)并在首次使用計(jì)算機(jī)系統(tǒng)100之前存儲(chǔ)在系統(tǒng)固件176中。在一個(gè)實(shí)施例中,RAPI84,ISUA86和初始有效負(fù)載88a中每一個(gè)都包括Phoenix技術(shù)有限公司開發(fā)的專用軟件。
RAPI84通常在ROM應(yīng)用程序和系統(tǒng)BIOS82之間提供安全接口。RAPI84的一個(gè)實(shí)施例在以下圖8-18中有所描述并伴有文字說明。ISUA86的一個(gè)實(shí)施例在申請序列號(hào)為__、題目為“在計(jì)算機(jī)上自動(dòng)安裝和配置軟件的方法和設(shè)備”、申請日為1999年6月18日、轉(zhuǎn)讓給Phoenix技術(shù)有限公司的未決美國專利申請中做了描述,本文在此通過參考結(jié)合該專利申請的內(nèi)容。
從虛擬存儲(chǔ)器訪問和執(zhí)行物理存儲(chǔ)器的內(nèi)容參考圖2所示的安裝在處理系統(tǒng)100上的操作系統(tǒng)描述本發(fā)明的一個(gè)方面。圖4是示出了利用本發(fā)明系統(tǒng)和方法的操作系統(tǒng)結(jié)構(gòu)的全功能框圖。處理系統(tǒng)100包括支持應(yīng)用程序232和服務(wù)程序2234的操作系統(tǒng)2230,基本輸入/輸出系統(tǒng)(“BIOS”)236和系統(tǒng)硬件238。BIOS236是硬件設(shè)備驅(qū)動(dòng)程序或軟件接口的集合,硬件設(shè)備如控制臺(tái)(鍵盤和顯示器),打印機(jī)類、輔助設(shè)備(串口)、計(jì)算機(jī)時(shí)鐘和引導(dǎo)磁盤設(shè)備。BIOS236通常嵌入可編程的只讀存儲(chǔ)器(ROM)中。通常,BIOS函數(shù)本身實(shí)際上是利用訪問物理存儲(chǔ)器更快的優(yōu)點(diǎn)從ROM拷貝到物理存儲(chǔ)器中。這就是所知道的“陰影”BIOS236,因?yàn)锽IOS236的兩個(gè)副本導(dǎo)致一個(gè)在ROM(不再被使用)中,而另一個(gè)在物理存儲(chǔ)器中。存儲(chǔ)BIOS236的物理存儲(chǔ)器部分稱為BIOS陰影空間。Windows NT這樣的操作系統(tǒng)在操作系統(tǒng)已經(jīng)被引導(dǎo)并正在運(yùn)行之后不使用BIOS236。Windows NT操作系統(tǒng)中的核心級(jí)驅(qū)動(dòng)操作直接與系統(tǒng)硬件接口。本發(fā)明便于用BIOS236作為系統(tǒng)硬件238和操作232之間的接口。
操作系統(tǒng)230包括與應(yīng)用程序232和服務(wù)程序2234接口的分類驅(qū)動(dòng)程序240以及I/O管理程序242。I/O管理程序242將從應(yīng)用程序232和服務(wù)程序234(經(jīng)分類驅(qū)動(dòng)程序240產(chǎn)生的)到正常定序的調(diào)用中的I/O請求轉(zhuǎn)換為位于核心244中的不同驅(qū)動(dòng)程序。尤其是,當(dāng)I/O管理程序242接收I/O請求時(shí),它用請求的函數(shù)代碼調(diào)用位于核心244中的驅(qū)動(dòng)程序中的若干調(diào)度程序方法其中之一。內(nèi)核244提供與硬件無關(guān)的功能,稱為系統(tǒng)功能,這些功能是通過軟件中斷來訪問的。內(nèi)核244提供的功能包括文件和目錄管理、存儲(chǔ)器管理、字符設(shè)備輸入/輸出和時(shí)間及數(shù)據(jù)支持等。在一個(gè)實(shí)施例中,操作系統(tǒng)是Windows NT操作系統(tǒng)。在另一個(gè)實(shí)施例中,操作系統(tǒng)230包括Solaris或AIX操作系統(tǒng)或基于請求分頁的虛擬存儲(chǔ)器子系統(tǒng)的其他操作系統(tǒng)。
本發(fā)明提供位于核心244中的訪問驅(qū)動(dòng)程序246,它負(fù)責(zé)訪問位于BIOS236中的BIOS數(shù)據(jù)或者經(jīng)BIOS236訪問系統(tǒng)硬件238數(shù)據(jù)。訪問驅(qū)動(dòng)程序246也負(fù)責(zé)訪問BIOS函數(shù)地址的位置和執(zhí)行相關(guān)的BIOS功能。在一個(gè)最佳實(shí)施例中,核心244包括用C語言編寫的源代碼??梢岳斫?,可以用其他匯編語言實(shí)現(xiàn)內(nèi)核244的函數(shù)。BIOS數(shù)據(jù)和地址通常位于物理存儲(chǔ)器250中并經(jīng)BIOS接口248被訪問驅(qū)動(dòng)程序246訪問。在一個(gè)實(shí)施例中,訪問驅(qū)動(dòng)程序246執(zhí)行BIOS陰影空間中的代碼,該空間的物理地址通常為0x000E0000-0x000FFFFF。
通過舉例,如果訪問驅(qū)動(dòng)程序246需要訪問位于地址為0x00000000的物理存儲(chǔ)器中的BIOS函數(shù)。它調(diào)用I/O管理程序242,請求它將物理地址0x00000000到0x00000FFF的存儲(chǔ)空間映射到其虛擬存儲(chǔ)空間上。然后I/O管理程序242將指針返回到訪問驅(qū)動(dòng)程序246的虛擬存儲(chǔ)空間,例如0xfd268000。訪問驅(qū)動(dòng)程序現(xiàn)在可以通過基于或訪問其虛擬地址0xfd268000來訪問物理地址為0x00000000的地址空間。因此,為了訪問位于物理地址0x2400上的函數(shù),所用虛擬地址為0xfd2682400。
在一個(gè)最佳實(shí)施例中,利用訪問驅(qū)動(dòng)程序246的應(yīng)用程序230、服務(wù)232或分類驅(qū)動(dòng)程序240可以使用一組入口點(diǎn)或函數(shù)調(diào)用。訪問驅(qū)動(dòng)程序246通過這些入口點(diǎn)可以被打開、關(guān)閉,并且能接收輸入/輸出(“I/O”)控制代碼(“IOCTLs”)。表1示出了訪問驅(qū)動(dòng)程序246的結(jié)構(gòu)、入口點(diǎn)和應(yīng)用程序。
圖5是顯示根據(jù)本發(fā)明原理所提供的訪問驅(qū)動(dòng)程序246初始化過程的方框圖。通常,當(dāng)初次裝載訪問驅(qū)動(dòng)程序246時(shí),執(zhí)行其DriverEntry函數(shù)(見表1)。盡管在該函數(shù)中出現(xiàn)了大量其他初始化(例如為訪問驅(qū)動(dòng)程序246的正常操作分配不同的資源或?qū)ο?,出現(xiàn)兩個(gè)尤其重要的初始化(a)位于物理存儲(chǔ)器250中的BIOS陰影區(qū)260(包括BIOS服務(wù)目錄62)和(b)也位于物理存儲(chǔ)器250中的BIOS數(shù)據(jù)區(qū)264,兩者都被映射到訪問驅(qū)動(dòng)程序246的虛擬存儲(chǔ)器(包括BIOS服務(wù)目錄272和BIOS數(shù)據(jù)區(qū)74)270中。結(jié)果,應(yīng)用程序232或服務(wù)程序2234可以通過分類驅(qū)動(dòng)程序240利用虛擬地址訪問或執(zhí)行BIOS函數(shù)。應(yīng)注意,BIOS函數(shù)的執(zhí)行必須通過訪問驅(qū)動(dòng)程序246來實(shí)現(xiàn),原因是BIOS236的物理地址空間僅映射到訪問驅(qū)動(dòng)程序246。此外,可以通過附錄A中詳細(xì)描述的32位BIOS電源管理服務(wù)接口的實(shí)現(xiàn)來利用訪問驅(qū)動(dòng)程序246。顯然,本領(lǐng)域的技術(shù)人員知道BIOS電源管理服務(wù)接口也可以用64位、128伴和256位配置來實(shí)現(xiàn)。
尤其是,在初始化過程中,訪問驅(qū)動(dòng)程序246尋址位于物理存儲(chǔ)器250中的BIOS陰影區(qū)260和BIOS數(shù)據(jù)區(qū)264。BIOS陰影區(qū)260和BIOS數(shù)據(jù)區(qū)264被映射到訪問驅(qū)動(dòng)程序246的虛擬地址空間。接著,訪問驅(qū)動(dòng)程序246檢索BIOS服務(wù)目錄272頭部。一旦發(fā)現(xiàn)并確認(rèn)BIOS服務(wù)目錄,訪問驅(qū)動(dòng)程序246獲得BIOS服務(wù)目錄272的虛擬地址,這提供了BIOS服務(wù)目錄272頭部虛擬地址對BIOS陰影區(qū)270的基準(zhǔn)虛擬地址的補(bǔ)償。
在另一個(gè)實(shí)施例中,在初始化過程中,訪問驅(qū)動(dòng)程序?qū)ぶ肺挥谖锢泶鎯?chǔ)器250中的BIOS陰影區(qū)260、BIOS數(shù)據(jù)區(qū)264和BIOS ROM區(qū)。BIOS陰影區(qū)260、BIOS數(shù)據(jù)區(qū)264和BIOS ROM區(qū)被映射到訪問驅(qū)動(dòng)程序246的虛擬地址空間。接著,訪問驅(qū)動(dòng)程序246檢索BIOS服務(wù)目錄272頭部。一旦發(fā)現(xiàn)并確認(rèn)BIOS服務(wù)目錄,訪問驅(qū)動(dòng)程序246獲得BIOS服務(wù)目錄272的虛擬地址。在該實(shí)施例中,訪問驅(qū)動(dòng)程序246的虛擬存儲(chǔ)器空間中BIOS ROM區(qū)的可用性使訪問驅(qū)動(dòng)程序246能在閃存ROM中讀和/或?qū)憯?shù)據(jù)。結(jié)果,BIOS ROM能被二次擴(kuò)容或再寫。此外,與硬件接口的外部應(yīng)用程序能通過軟件機(jī)制訪問BIOS ROM區(qū),軟件機(jī)制例如附錄B中所提供的PhoenixPhlash NT說明書中所描述的。
隨后,調(diào)用訪問驅(qū)動(dòng)程序246中的執(zhí)行函數(shù)將利用BIOS陰影區(qū)270的基準(zhǔn)虛擬地址和補(bǔ)償以激活BIOS本身中的被請求的入口點(diǎn)。應(yīng)注意,應(yīng)用程序232或服務(wù)程序234可以再BIOS的虛擬地址空間中的任何地方執(zhí)行BIOS函數(shù),且不僅僅通過BIOS服務(wù)目錄272。
在一個(gè)實(shí)施例中,被調(diào)用以激活BIOS中被請求的入口點(diǎn)的執(zhí)行函數(shù)是IOCTL-BIOS-EXEC函數(shù),如表1所述。IOCTL-BIOS-EXEC函數(shù)在位于主存儲(chǔ)器或DRAM中的緩沖器(通過調(diào)用應(yīng)用程序232或服務(wù)234)中建立寄存器堆棧。堆棧的內(nèi)容是調(diào)用BIOS函數(shù)時(shí)的寄存器值。訪問驅(qū)動(dòng)程序246通過調(diào)用應(yīng)用程序232或服務(wù)程序234傳遞寄存器堆棧。利用BIOS服務(wù)目錄272中指定的函數(shù)指針完成程序調(diào)用本身。在一個(gè)實(shí)施例中,IOCIL-BIOS-EXEC所調(diào)用的BIOS函數(shù)接受4-字節(jié)簽名作為參數(shù)(argument)并定址與簽名有關(guān)的BIOS函數(shù)。傳送回調(diào)用應(yīng)用程序232或服務(wù)程序234的值包括BIOS功能的基準(zhǔn)虛擬地址,以及對服務(wù)程序入口點(diǎn)的基址的補(bǔ)償。
下面提供了訪問驅(qū)動(dòng)程序246的結(jié)構(gòu)、入口功能和應(yīng)用程序的概述。
表1.訪問驅(qū)動(dòng)程序246函數(shù)
A.訪問驅(qū)動(dòng)程序246函數(shù)的詳細(xì)描述1.“DriverEntry”函數(shù)該入口點(diǎn)使驅(qū)動(dòng)程序初始化其變量,在BIOS陰影和數(shù)據(jù)區(qū)中映射,并為其正常操作分配資源。當(dāng)每個(gè)資源或?qū)ο蠖ㄎ粫r(shí),將其列表形成變量“phResAndFlags”;允許單一函數(shù)(“freeResources”)釋放驅(qū)動(dòng)程序使用的資源,而不論驅(qū)動(dòng)程序被卸載原因。被定位或連接的資源如下a.產(chǎn)生設(shè)備對象-建立系統(tǒng)的設(shè)備對象及名稱。
b.初始化錯(cuò)誤記錄-產(chǎn)生與事件日志服務(wù)的鏈接。
c.建立主函數(shù)入口點(diǎn)。
d.產(chǎn)生符號(hào)連接-服務(wù)程序或應(yīng)用程序?qū)邮褂胑.在BIOS陰影中的映射-使驅(qū)動(dòng)程序可訪問虛擬內(nèi)存上的內(nèi)存空間。
f.在BIOS ROM中的映射-使虛擬內(nèi)存地址空間中的ROM區(qū)可以訪問。
g.在BIOS數(shù)據(jù)中的映射-使驅(qū)動(dòng)程序可訪問虛擬內(nèi)存上的內(nèi)存空間。
h.為該驅(qū)動(dòng)程序使用定位BIOS 232位入口點(diǎn)。
在一個(gè)實(shí)施例中,設(shè)備對象名稱為“Laptop”,需要其服務(wù)微軟OEM適應(yīng)開發(fā)包(OAK)所需的連接函數(shù)。該相應(yīng)符號(hào)連接名稱為“PhoenixAD”。
2.AcessDriverCreateClose當(dāng)應(yīng)用程序232或服務(wù)程序234向系統(tǒng)請求進(jìn)行設(shè)備處理時(shí),或當(dāng)其關(guān)閉已經(jīng)獲得的處理時(shí),利用該函數(shù)通知驅(qū)動(dòng)程序246。該訪問驅(qū)動(dòng)程序246通過成功實(shí)現(xiàn)請求來響應(yīng)調(diào)度入口點(diǎn),但不改變驅(qū)動(dòng)程序246的其他模式變量。
3.AcessDriverUnload當(dāng)需要將驅(qū)動(dòng)程序從系統(tǒng)(從(SCM)關(guān)閉設(shè)備)中移動(dòng)時(shí),由代表服務(wù)控制管理程序(SCM)或其它應(yīng)用程序的核心調(diào)用該調(diào)度入口點(diǎn)。該函數(shù)調(diào)用的結(jié)果是列表于“phResAndFlags”中的所有資源對系統(tǒng)均為空閑并成功完成請求。
4.AccessDriverReg訪問驅(qū)動(dòng)程序246的驅(qū)動(dòng)程序具有對作為部分OEM適應(yīng)開發(fā)包(OAK)的電源控制模式執(zhí)行“連結(jié)處理”的函數(shù)。該函數(shù)與知道并請求使用OAK控制方法的OEM和標(biāo)準(zhǔn)設(shè)備的仿真電源管理為一整體。AccessDriverReg函數(shù)將設(shè)備注冊到鏈接清單中。也可請求可選擇的“再注冊”設(shè)備。當(dāng)執(zhí)行DriverEntry函數(shù)(當(dāng)首次安裝時(shí)),典型的OAK適應(yīng)設(shè)備驅(qū)動(dòng)程序會(huì)調(diào)用注冊。作為DriverEntry函數(shù)的一部分,每個(gè)注冊設(shè)備必須調(diào)用以將其本身從需要電源控制服務(wù)程序的設(shè)備的訪問驅(qū)動(dòng)程序246鏈接清單中移走。
5.LOCTLF函數(shù)在服務(wù)程序或應(yīng)用程序?qū)雍虰IOS之間的每一個(gè)接口都由訪問驅(qū)動(dòng)程序246的驅(qū)動(dòng)程序中的LOCTL函數(shù)來處理。以緩沖區(qū)模式執(zhí)行每個(gè)LOCTL傳送,以使驅(qū)動(dòng)程序的輸入數(shù)據(jù)及其輸出程序通過共用系統(tǒng)緩沖區(qū)來進(jìn)行傳送。在作為Irp>AssociatedIrp.SystemBuffer的輸入/輸出(I/O)請求包中給出該緩沖區(qū)空間的指針。一旦被控制,IOCTL(在驅(qū)動(dòng)程序內(nèi))會(huì)得到系統(tǒng)緩沖區(qū)地址并利用其內(nèi)容來執(zhí)行請求。在輸入給時(shí),IOCTL函數(shù)的執(zhí)行結(jié)果會(huì)在相同的系統(tǒng)緩沖區(qū)內(nèi)被替換。
在訪問驅(qū)動(dòng)程序246的驅(qū)動(dòng)程序中執(zhí)行的每個(gè)IOCTL都有唯一用于IOCTL輸入數(shù)據(jù)和輸出數(shù)據(jù)的數(shù)據(jù)模式。該函數(shù)如下所述,給出其數(shù)據(jù)緩沖區(qū)模式及每個(gè)區(qū)域的說明。緩沖區(qū)補(bǔ)償以字節(jié)給出。建議malloc()大小為給每個(gè)函數(shù)的最小緩沖區(qū)大小供應(yīng)用程序用戶緩沖區(qū)所使用。從用戶緩沖區(qū)中會(huì)自動(dòng)得出系統(tǒng)緩沖區(qū)大小。
6.LOCTL_Locate在驅(qū)動(dòng)程序246初始化后,該LOCTL_Locate函數(shù)是由應(yīng)用程序232或服務(wù)程序234調(diào)用的首次調(diào)度入口點(diǎn)。該函數(shù)返回以可置平模式虛擬地址格式(232位地址)的BIOS232服務(wù)程序接口地址,BIOS陰影的基址以及BIOS數(shù)據(jù)區(qū)的基址。需要注意的是,BIOS服務(wù)程序接口是從驅(qū)動(dòng)程序?qū)踊騼?nèi)核線程(見附錄A)執(zhí)行所有BIOS函數(shù)的唯一入口點(diǎn)。在裝入訪問驅(qū)動(dòng)程序246期間,保證僅該驅(qū)動(dòng)程序可以到達(dá)這些地址空間。
輸入數(shù)據(jù)無,不依靠緩沖區(qū)內(nèi)容輸出數(shù)據(jù)補(bǔ)償0PUCHAR-進(jìn)入陰影的BIOS服務(wù)目錄補(bǔ)償。
補(bǔ)償4PUCHAR-BIOS陰影基本虛擬地址。
補(bǔ)償8PUCHAR-BIOS數(shù)據(jù)區(qū)基本虛擬地址。
補(bǔ)償8PUCHAR-BIOS數(shù)據(jù)區(qū)基本虛擬地址。
補(bǔ)償12PUCHAR-BIOS ROM數(shù)據(jù)區(qū)基本虛擬地址。
最小緩沖區(qū)大小16位7.LOCTL BIOS Read該LOCTL_BIOS Read函數(shù)為BIOS ROM、陰影或數(shù)據(jù)區(qū)的通用閱讀程序。輸入數(shù)據(jù)補(bǔ)償0ULONG-模式標(biāo)志位01=陰影,0=數(shù)據(jù)區(qū)。
位21=ROM區(qū)(超過位0)補(bǔ)償4PUCHAR-進(jìn)入BIOS區(qū)的補(bǔ)償開始讀取補(bǔ)償8ULONG-讀出字節(jié)長度輸出數(shù)據(jù)補(bǔ)償0ULONG-實(shí)際讀出長度補(bǔ)償4UCHAR數(shù)組-實(shí)際數(shù)據(jù)讀出最小緩沖區(qū)大小16位注意如果因?yàn)檫M(jìn)入指定與映射BIOS存儲(chǔ)器的末端相重疊的BIOS區(qū)的補(bǔ)償而發(fā)生“短讀出”時(shí),不返回錯(cuò)誤?!皩?shí)際數(shù)據(jù)讀出”區(qū)域正確指出在系統(tǒng)緩沖區(qū)有多少有效數(shù)據(jù)。
8.LOCTL BIOS Write該LOCTL_BIOS_Write函數(shù)為BIOS ROM、陰影或數(shù)據(jù)區(qū)的通用寫程序。
輸入數(shù)據(jù)補(bǔ)償0ULONG-模式標(biāo)志位01=陰影區(qū),0=數(shù)據(jù)區(qū)。
位21=ROM區(qū)(覆蓋位0)補(bǔ)償4PUCHAR-進(jìn)入BIOS區(qū)的補(bǔ)償開始寫位-移8ULONG-寫字節(jié)長度輸出數(shù)據(jù)補(bǔ)償0ULONG-實(shí)際寫長度(零或請求大小)補(bǔ)償4UCHAR數(shù)組-實(shí)際數(shù)據(jù)讀出最小緩沖區(qū)大小16位注意由于數(shù)據(jù)可能訛誤禁止縮寫。
9.LOCTL BIOS Exec該LOCTL_BIOS_Exec函數(shù)被用來通過BIOS232服務(wù)程序接口執(zhí)行BIOS函數(shù)?;顒?dòng)記錄經(jīng)過系統(tǒng)緩沖區(qū)中的值。一旦調(diào)用BIOS的入口點(diǎn),則AR確定基本體系結(jié)構(gòu)寄存器內(nèi)容。一旦成功完成,AR包含通常已返BIOS調(diào)用程序的基本體系結(jié)構(gòu)內(nèi)容。
輸入數(shù)據(jù)補(bǔ)償0ULONG-函數(shù)入口點(diǎn)虛擬地址。
補(bǔ)償4ULONG-標(biāo)志寄存器補(bǔ)償8ULONG-保留補(bǔ)償12ULONG-保留補(bǔ)償16ULONG-保留補(bǔ)償20ULONG-保留補(bǔ)償24ULONG-保留補(bǔ)償28ULONG-保留補(bǔ)償232ULONG-保留補(bǔ)償236ULONG-保留補(bǔ)償240ULONG-保留補(bǔ)償244ULONG-ECX保留補(bǔ)償48ULONG-EDI保留補(bǔ)償52ULONG-ESI保留補(bǔ)償56ULONG-EDX保留補(bǔ)償260ULONG-ECX保留補(bǔ)償64ULONG-EBX保留補(bǔ)償68ULONG-EAX保留輸出數(shù)據(jù)系統(tǒng)緩沖區(qū)內(nèi)容在結(jié)構(gòu)上相同。寄存器內(nèi)容可能已經(jīng)受到所請求的BIOS函數(shù)的影響。
最小緩沖區(qū)大小80字節(jié)。
100.LOCTL RTC Read該LOCTL_RTC_Read函數(shù)用于讀出CMOS RAM中的RTC寄存器的內(nèi)容。自動(dòng)讀出的數(shù)據(jù)格式與SYSTEMTIME結(jié)構(gòu)相類似并返回到系統(tǒng)緩沖區(qū)的用戶中。
輸入數(shù)據(jù)無,不依靠緩沖區(qū)容量輸出數(shù)據(jù)<如下所示使用SYSTEMTIME模板>
補(bǔ)償0字 當(dāng)前年份補(bǔ)償2字 當(dāng)前月分(一月=1)補(bǔ)償4字 當(dāng)前星期幾(星期日=0)補(bǔ)償6字 當(dāng)前月日(日歷)補(bǔ)償8字 當(dāng)前小時(shí)補(bǔ)償100字 當(dāng)前分鐘補(bǔ)償12字 當(dāng)前秒補(bǔ)償14字 當(dāng)前毫秒最小緩沖區(qū)大小32位。
注意在RTC中的年份區(qū)域?yàn)?位寬度。在RTC中年份區(qū)域的內(nèi)容會(huì)重新計(jì)算到包含當(dāng)前年份、公元的全部值的SYSTEMTIM.Year16位區(qū)域中。例如RTC=00,Year=1980;RTC=23,Year=2003。還要注意LegacyRTC設(shè)備在其寄存器設(shè)備中不能提供毫秒?yún)^(qū)域。因此,在輸出數(shù)據(jù)中該函數(shù)的當(dāng)前毫秒?yún)^(qū)域始終設(shè)定為零。
11.LOCTL VERSIONLOCTL_VERSION函數(shù)將訪問驅(qū)動(dòng)程序246驅(qū)動(dòng)程序的主、次版本返回到調(diào)用程序。另外,由這個(gè)版本驅(qū)動(dòng)程序?qū)崿F(xiàn)的該函數(shù)以位圖計(jì)算。該位圖的目的是使服務(wù)程序或更高級(jí)的驅(qū)動(dòng)程序估計(jì)是否該版本的驅(qū)動(dòng)程序可以實(shí)現(xiàn)其目的(通常在安裝時(shí)間)。
輸入數(shù)據(jù)無,不依賴緩沖區(qū)內(nèi)容輸出數(shù)據(jù)補(bǔ)償0字 大版本(X)補(bǔ)償2字 小版本(.x)補(bǔ)償4ULONG被執(zhí)行函數(shù)的位圖(見下面)位31如果LOCTL_Locate被執(zhí)行位230如果LOCTL_BIOS_Read被執(zhí)行位29如果LOCTL_BIOS_Write被執(zhí)行位28如果LOCTL_BIOS_Exec被執(zhí)行位27保留位26保留位25保留位24如果LOCTL_RTC_Read被執(zhí)行位23保留位22保留給Phlash互鎖位21保留給在線設(shè)置(NVRAM寫程序)位20-0保留給將來擴(kuò)展位2301如果LOCTL_BIOS_Read執(zhí)行最小緩沖區(qū)大小16字節(jié)12.LOCTL PM Suspend該LOCTL_PM_Suspend函數(shù)使IRP_MJ_PNP_POWER、IRP_MN_LTRESUME IR被發(fā)送到使用Access Driver DriverReg入口點(diǎn)注冊本身的每個(gè)設(shè)備。
輸入數(shù)據(jù)無,不依賴緩沖區(qū)內(nèi)容輸出數(shù)據(jù)無,不依賴緩沖區(qū)內(nèi)容B.訪問驅(qū)動(dòng)程序246返回的錯(cuò)誤代碼下表定義了當(dāng)IRP失敗或僅部分完成時(shí)返回的錯(cuò)誤模式。也給出了該函數(shù)終止的條件。因?yàn)樵诓僮飨到y(tǒng)已知的NTSTATUS值和訪問驅(qū)動(dòng)程序246設(shè)備驅(qū)動(dòng)程序之間不需要存在一對一的對應(yīng),因此就需要該表。為了將代碼還原翻譯成應(yīng)用寫程序或最終用戶可用的串,強(qiáng)制僅使用NTSTATUS錯(cuò)誤代碼。
表2.從訪問驅(qū)動(dòng)程序246返回的NTSTATUS代碼
C.BIOS232位入口點(diǎn)說明為使IOCTL_Locate發(fā)現(xiàn)BIOS的入口點(diǎn),使用BIOS232位服務(wù)目錄。在附錄C中描述BIOS232-位服務(wù)目錄。當(dāng)查找和執(zhí)行BIOS函數(shù)時(shí),訪問驅(qū)動(dòng)程序246所使用的簽名為“_32_”。
如果受上述規(guī)定的條件影響未發(fā)現(xiàn)WinntEntry(BIOS232服務(wù)目錄)結(jié)構(gòu),則訪問驅(qū)動(dòng)程序246驅(qū)動(dòng)程序在裝入時(shí)間失敗,DriverEntry顯示不能進(jìn)行如每個(gè)表2中的初始化。
D.實(shí)時(shí)時(shí)鐘硬件訪問為執(zhí)行IOCTL_RTC Read函數(shù),需要定義RTC寄存器和訪問的方法。該RTC寄存器定位于CMOS RAM的I/O地址空間。在表3中僅示出了RTC寄存器。通過將CMOS物理存儲(chǔ)器地址輸出到端口0x70來訪問該寄存器,然后讀取端口0x70上的源(subject)8位寄存器。讀取所有RTC寄存器后,設(shè)定該CMOS物理存儲(chǔ)器地址指向0x0D。
表3RTC寄存器
圖6A是本發(fā)明初始化過程的一個(gè)實(shí)施例的流程圖。從起動(dòng)模式開始,過程600開始進(jìn)行塊610,初始化調(diào)用程序的變量(例如I/O管理程序242)。圖6B和配套的文字描述了該初始化過程6100的細(xì)節(jié)。然后過程600開始進(jìn)行塊620,在620上裝入訪問驅(qū)動(dòng)程序246。然后發(fā)生訪問驅(qū)動(dòng)程序變量的初始化。在初始化過程期間,發(fā)生兩個(gè)特別必要的初始化(a)位于物理存儲(chǔ)器250的BIOS陰影260(包括BIOS服務(wù)目錄)以及(b)同樣位于物理存儲(chǔ)250的BIOS數(shù)據(jù)區(qū)264,均映射到訪問驅(qū)動(dòng)程序246的訪問驅(qū)動(dòng)程序的246虛擬存儲(chǔ)器(如圖5中BIOS陰影270(包括BIOS服務(wù)目錄272)和BIOS數(shù)據(jù)區(qū)274所示)。
然后過程600前進(jìn)到塊 630,在630上發(fā)生指針初始化。圖6C和配套文字描述了塊630的細(xì)節(jié)。然后過程600前進(jìn)到塊640,在640上初始化結(jié)束。然后過程600終止。
圖6B是塊610的細(xì)節(jié)流程圖。從起動(dòng)模式開始,過程610開始進(jìn)行塊612,在612上來自I/O管理程序242的調(diào)用程序?yàn)橄到y(tǒng)緩沖區(qū)上指定的存儲(chǔ)器結(jié)構(gòu)分配存儲(chǔ)器。然后過程610前進(jìn)到過程塊614,在614上來自I/O管理程序242的調(diào)用程序確定許多BIOS函數(shù)的位置、相應(yīng)的入口點(diǎn)、長度和補(bǔ)償。在一個(gè)實(shí)施例中,通過進(jìn)入具有BIOS函數(shù)的虛擬地址的相應(yīng)BIOS函數(shù)的指定存儲(chǔ)器結(jié)構(gòu)的地址區(qū)域,以及通過提供識(shí)別每個(gè)BIOS函數(shù)的4位ASCII串來完成的。然后終止調(diào)用程序的初始化。
圖6C是圖6A的過程塊630的詳細(xì)流程圖。從起動(dòng)模式開始,調(diào)用應(yīng)用程序232或服務(wù)程序234通過分類驅(qū)動(dòng)程序調(diào)用IOCTL_Locate,如塊632所示。相應(yīng)地,訪問驅(qū)動(dòng)程序246執(zhí)行查找BIOS服務(wù)目錄272的頭部,如過程塊634所示。一旦找到并確認(rèn)BIOS服務(wù)目錄272,訪問驅(qū)動(dòng)程序246獲得BIOS服務(wù)目錄272頭部的虛擬地址,其提供從BIOS陰影270的基本虛擬地址的BIOS服務(wù)目錄272頭部虛擬地址的補(bǔ)償。然后過程630將控制返回到調(diào)用應(yīng)用程序232或服務(wù)程序234。
圖7A是本發(fā)明的調(diào)用執(zhí)行過程的流程圖。從起動(dòng)模式開始,過程700開始進(jìn)行過程塊710,在710上調(diào)用程序通過提供給訪問驅(qū)動(dòng)程序246來調(diào)用BIOS函數(shù),它想在BIOS函數(shù)的地址開始執(zhí)行。然后過程700前進(jìn)到過程塊720,在720上訪問驅(qū)動(dòng)程序246通過來自I/O管理程序242的IOCTL命令接收BIOS函數(shù)的調(diào)度調(diào)用(見圖4)。然后過程700前進(jìn)到過程塊730,在730上訪問驅(qū)動(dòng)程序246實(shí)行入口點(diǎn)地址的范圍檢查。特別地,訪問驅(qū)動(dòng)程序246確定入口點(diǎn)地址是否處在映射BIOS陰影地址的范圍內(nèi),不包括服務(wù)目錄頭部。如果不是,則訪問驅(qū)動(dòng)程序246指示開始虛擬地址未處于從物理存儲(chǔ)器映射到虛擬存儲(chǔ)器的的地址范圍內(nèi)??梢酝ㄟ^使用標(biāo)志來進(jìn)行指示。如果范圍檢查成功,則過程700開始進(jìn)行過程塊740,在740上訪問驅(qū)動(dòng)程序246執(zhí)行調(diào)用的BIOS函數(shù)。然后過程700終止。
圖7B是圖7A中過程塊740的細(xì)節(jié)的流程圖。從起動(dòng)模式開始,過程740開始進(jìn)行過程塊742,在742上訪問驅(qū)動(dòng)程序246在先前由I/O管理程序242的程序規(guī)定的系統(tǒng)緩沖區(qū)中產(chǎn)生寄存器堆棧。然后過程730前進(jìn)到過程塊744,在744上訪問驅(qū)動(dòng)程序246提供指向保存將要執(zhí)行的BIOS函數(shù)地址的寄存器堆棧的指針。然后過程740前進(jìn)到過程塊746,在746上來自I/O管理程序242的調(diào)用程序調(diào)用并執(zhí)行該函數(shù),該函數(shù)的開始地址由指針指示,將其物理地址作為虛擬存儲(chǔ)器的映射。然后過程740終止。
現(xiàn)在提供一個(gè)在訪問驅(qū)動(dòng)程序246中使用IOCTL_BIOS_EXEC函數(shù)的示例。最初,應(yīng)用程序232或服務(wù)程序234訪問使用命令I(lǐng)OCTL_Locate訪問驅(qū)動(dòng)程序246。從訪問驅(qū)動(dòng)程序246返回的數(shù)據(jù)包括BIOS陰影基本虛擬地址、從BIOS陰影基本虛擬地址的BIOS服務(wù)目錄補(bǔ)償以及BIOS數(shù)據(jù)區(qū)基本虛擬地址。
然后利用隨后的動(dòng)作確定BIOS服務(wù)程序、其入口點(diǎn)、長度和地址補(bǔ)償?shù)拇嬖凇碜訧/O管理程序242的調(diào)用程序首先為諸如IOC_EXEC1的寄存器結(jié)構(gòu)分配存儲(chǔ)器,然后將IOCTL_Locate給出的虛擬地址填充到該結(jié)構(gòu)的biosFunction區(qū)域。其他寄存器值按如下填充識(shí)別BIOS服務(wù)程序的4位ASCII串被裝入eax寄存器,零被裝入ebx寄存器。
接著,調(diào)用程序調(diào)用具有IOC_EXEC1結(jié)構(gòu)內(nèi)容的訪問驅(qū)動(dòng)程序246的IOCTL_BIOS_Exec函數(shù),該IOCTL_BIOS_Exec函數(shù)被拷貝到系統(tǒng)緩沖區(qū)用于IOCTL調(diào)用。然后執(zhí)行BIOS函數(shù)。訪問驅(qū)動(dòng)程序246的IOCTL_BIOSExec函數(shù)返回每個(gè)都包含來自服務(wù)目錄響應(yīng)的eax、ebx、ecx和edx寄存器值。然后I/O管理程序242的調(diào)用程序得到從服務(wù)目錄返回的信息并在系統(tǒng)緩沖區(qū)產(chǎn)生biosFunction入口點(diǎn)和結(jié)構(gòu)。然后其調(diào)用在訪問驅(qū)動(dòng)程序246中使用IOCTLBIOS_Exec函數(shù)的BIOS函數(shù)。返回的數(shù)據(jù)經(jīng)過相同的IOC_EXEX1結(jié)構(gòu)。
在附錄D1-D3中示出了圖6A、6B和7B所示過程的示例。特別地,附錄D1示出了應(yīng)用程序232、服務(wù)程序234或通過分類驅(qū)動(dòng)程序246在調(diào)用BIOS函數(shù)中使用的分類驅(qū)動(dòng)程序240的示范性源代碼。附錄D2和D3示出了訪問驅(qū)動(dòng)程序246的示范性源代碼。附錄D2示出了在陰影執(zhí)行BIOS函數(shù)的示范性源代碼,而附錄D3示出了產(chǎn)生寄存器堆棧及調(diào)用執(zhí)行BIOS函數(shù)的入口點(diǎn)的示范性源代碼。
通過使用本發(fā)明,提供了用于訪問和執(zhí)行來自虛擬存儲(chǔ)器子系統(tǒng)的物理存儲(chǔ)器內(nèi)容的系統(tǒng)和方法。該系統(tǒng)和方法易于增加存儲(chǔ)器的尋址能力和輸入/輸出操作,也允許在物理存儲(chǔ)空間中執(zhí)行處理器指令。
BIOS服務(wù)程序的安全應(yīng)用本發(fā)明的另一方面包括安全利用基本輸入和輸出系統(tǒng)(BIOS)服務(wù)程序的系統(tǒng)和方法。在下面的細(xì)節(jié)描述中,使用下面的術(shù)語來描述當(dāng)前發(fā)明。
“密鑰”是按照傳統(tǒng)的數(shù)據(jù)加密標(biāo)準(zhǔn)(DES)諸如Rivest、Shamir和Adleman(RSA)、數(shù)據(jù)加密算法(DEA)以及類似的加密算法編碼和/或解碼參數(shù)。
“密鑰對”包括“專用”密鑰和“公用”密鑰?!皩S妹荑€”為關(guān)鍵對的屬主所有并用來產(chǎn)生數(shù)字簽名?!肮谩泵荑€被普遍公布并用來改變數(shù)字簽名。公用密鑰通常以數(shù)字“證書”的形式公布。
“數(shù)字簽名”是使用數(shù)字消息和專用密鑰的數(shù)字量。不知道專用密鑰不能計(jì)算數(shù)字簽名。通過使用數(shù)字消息和與專用密鑰相對應(yīng)的公用密鑰可以改變數(shù)字簽名。成功校驗(yàn)證實(shí)數(shù)字消息的確是被簽名的,且簽名是利用與公用密鑰相對應(yīng)的專用密鑰產(chǎn)生的。
“證書”是至少包括公用密鑰、專用密鑰以及使用專用密鑰的數(shù)字簽名的數(shù)字消息。
圖8是示出了利用本發(fā)明的系統(tǒng)和方法的處理系統(tǒng)1500的結(jié)構(gòu)的全部功能框圖。該處理系統(tǒng)1500包括支持應(yīng)用程序1510和服務(wù)程序1515、基本輸入/輸出系統(tǒng)(BIOS)1520以及系統(tǒng)硬件1525的操作系統(tǒng)1505。BIOS1520是硬件設(shè)備的驅(qū)動(dòng)程序或軟件接口的集合,這些硬件設(shè)備諸如控制臺(tái)(鍵盤和顯示器)、普通打印機(jī)、輔助設(shè)備(串行端口)、計(jì)算機(jī)時(shí)鐘以及引導(dǎo)磁盤設(shè)備。BIOS1520通常嵌入非易失性存儲(chǔ)器中。
操作系統(tǒng)1505包括與應(yīng)用程序1510、服務(wù)程序1515以及I/O管理程序1535相連接的分類驅(qū)動(dòng)程序1530。I/O管理程序1535將應(yīng)用程序1510和服務(wù)程序1515(通過分類驅(qū)動(dòng)程序1530進(jìn)行)中的請求轉(zhuǎn)換成位于核心1540內(nèi)的不同驅(qū)動(dòng)程序的適當(dāng)?shù)男蛄姓{(diào)用。特別地,當(dāng)I/O管理程序1535接收I/O請求時(shí),使用請求的函數(shù)代碼來調(diào)用位于核心1540內(nèi)的驅(qū)動(dòng)程序的幾個(gè)分配程序中的一個(gè)。核心1540提供通過軟件中斷方式來訪問的獨(dú)立的硬件函數(shù)、調(diào)用系統(tǒng)函數(shù)。核心1540所提供的函數(shù)通常包括文件和目錄管理、存儲(chǔ)器管理、字符設(shè)備輸入/輸出及時(shí)間和日期支持等。在一個(gè)實(shí)施例中,操作系統(tǒng)1505為Windows操作系統(tǒng)。在另一個(gè)實(shí)施例中,操作系統(tǒng)1505包括Solaris或AIX操作系統(tǒng)或基于請求分頁的虛擬存儲(chǔ)器子系統(tǒng)的其它操作系統(tǒng)。
本發(fā)明提供位于核心1540內(nèi)的訪問驅(qū)動(dòng)程序1545,訪問驅(qū)動(dòng)程序1545負(fù)責(zé)與ROM應(yīng)用程序接口(RAPI)1550相接連以訪問或升級(jí)位于BIOS1520的數(shù)據(jù)或通過BIOS訪問系統(tǒng)硬件數(shù)據(jù)。RAPI1550通常提供安全利用BIOS服務(wù)程序或函數(shù)的接口。下面對RAPI進(jìn)行更詳細(xì)地描述。
在最佳實(shí)施例中,訪問驅(qū)動(dòng)程序1545包括用C語言編寫的源代碼。我們知道利用其它的匯編語言也可以實(shí)現(xiàn)訪問驅(qū)動(dòng)程序1545的功能。在最佳實(shí)施例中,利用訪問驅(qū)動(dòng)程序1545的應(yīng)用程序1510、服務(wù)程序1515或分類驅(qū)動(dòng)程序1530都可能得到一組入口點(diǎn)或函數(shù)調(diào)用。訪問驅(qū)動(dòng)程序1545可以通過這些入口點(diǎn)打開、關(guān)閉并能夠接收輸入/輸入/輸出(“I/O”)控制代碼(“IOCTLs”)。
圖9所示為根據(jù)本發(fā)明的一個(gè)實(shí)施例的訪問驅(qū)動(dòng)程序1545和RAPI1550之間的交互序列的序列說明。在現(xiàn)有系統(tǒng)中,在訪問驅(qū)動(dòng)程序1545可能將一個(gè)或多個(gè)服務(wù)請求發(fā)送到RAPI1550以利用BIOS服務(wù)程序之前,必須要在訪問驅(qū)動(dòng)程序1545和RAPI1550之間建立工作會(huì)話。為建立與RAPI1550的工作會(huì)話,訪問驅(qū)動(dòng)程序1545產(chǎn)生工作會(huì)話(塊1605)并將請求發(fā)送到RAPI1550(塊1610)。
圖12所示為會(huì)話請求900的一個(gè)實(shí)施例的格式。每個(gè)會(huì)話請求900包括會(huì)話操作代碼905、參數(shù)910清單以及會(huì)話簽名915。會(huì)話操作代碼905是表示會(huì)話操作一個(gè)類型的數(shù)值。在一個(gè)實(shí)施例中的會(huì)話操作的說明性示例可以包括開始或建立會(huì)話的操作以及結(jié)束或終止會(huì)話的操作。每種會(huì)話操作類型都可以請求一個(gè)或更多外參數(shù)910清單。在一個(gè)實(shí)施例中,該參數(shù)910清單可以是駐留參數(shù)的存儲(chǔ)器位置的指針。每個(gè)會(huì)話請求900也包括會(huì)話請求簽名915以防止諸如計(jì)算機(jī)病毒的外來代碼段,從而捕捉和應(yīng)答該請求并中斷BIOS。
圖10概述了會(huì)話請求的產(chǎn)生。在塊1705和1710中,會(huì)話操作代碼表示所需會(huì)話操作及所需會(huì)話操作插入到會(huì)話請求中的所需參數(shù)清單。塊1715、1720和1725顯示了會(huì)話請求簽名的產(chǎn)生。在現(xiàn)在密碼技術(shù)中,消息的數(shù)字簽名的產(chǎn)生動(dòng)作稱為“簽名”消息。要注意的是,對消息進(jìn)行簽名消息或產(chǎn)生數(shù)字簽名的算法在現(xiàn)有技術(shù)中是公知的。還要注意的是,為產(chǎn)生數(shù)字簽名的現(xiàn)有算法通常包括計(jì)算將要被簽名消息的散列值和加密使用專用密鑰的散列值,如塊1715、1720和1725所示。
設(shè)想全國科學(xué)技術(shù)學(xué)會(huì)提出的數(shù)字簽名加密(“DSA”)可被使用。也可以設(shè)想使用Rivest,Shamir和Adleman(“RSA”)算法。然而,需要注意的是,產(chǎn)生數(shù)字簽名的其它算法也可以在本發(fā)明中使用。
如圖10中塊1715所示,形成會(huì)話消息以使其包括會(huì)話操作代碼和參數(shù)清單。在塊1720中,計(jì)算會(huì)話消息的散列值。要注意的是,計(jì)算散列值的算法在現(xiàn)有技術(shù)中是公知的。本領(lǐng)域技術(shù)人員會(huì)認(rèn)識(shí)到適合于本發(fā)明實(shí)施例的散列函數(shù)是一個(gè)可以單向計(jì)算并無沖突散列值的函數(shù)。在塊1725中,通過將計(jì)算出的使用存儲(chǔ)在當(dāng)前權(quán)限證書中的專用密鑰的會(huì)話消息的散列值加密來產(chǎn)生會(huì)話請求簽名。
權(quán)限證書通常包含使諸如訪問驅(qū)動(dòng)程序1545和RAPI1550(圖9所示)的系統(tǒng)部件產(chǎn)生安全會(huì)話或服務(wù)請示并改變那些請求完整性的足夠的信息。圖11所示為根據(jù)本發(fā)明的一個(gè)實(shí)施例的權(quán)限證書800的格式。示范性權(quán)限證書至少包括下列范圍共用密鑰805、專用密鑰810和證書簽名815。如后面所述,存儲(chǔ)在權(quán)限證書中的信息也用來實(shí)施會(huì)話和服務(wù)請求的安全限制。
返回到圖9中的塊1615,RAPI1550建立如塊1610中訪問驅(qū)動(dòng)程序1545發(fā)送的會(huì)話請求所規(guī)定的會(huì)話。圖14概述了所需動(dòng)作建立會(huì)話。在塊1105中,消息根據(jù)會(huì)話操作代碼以及在從訪問驅(qū)動(dòng)程序接收到的有效會(huì)話請求清單而建立。計(jì)算所建立消息的散列值(塊110)。會(huì)話請求簽名從會(huì)話請求中抽取并利用包括在當(dāng)前權(quán)限證書的RAPI的拷貝中的共用密鑰來解密(塊1115)。如后面所示,RAPI負(fù)責(zé)產(chǎn)生和支持訪問驅(qū)動(dòng)程序的權(quán)限證書。然而,RAPI也保留了為其自己使用的大多數(shù)當(dāng)前權(quán)限證書的拷貝。在塊1120中,解密的會(huì)話簽名與計(jì)算出的所構(gòu)建消息的散列值相比較。如果被計(jì)算的散列值等于解密會(huì)話請求簽名,則RAPI開始著手起動(dòng)會(huì)話(塊1125)。
返回到圖9,建立會(huì)話后,RAPI1550產(chǎn)生新的權(quán)限證書(塊1620)。如上所述,RAPI1550保留了為其自己使用的新的權(quán)限證書的拷貝。RAPI1550用新的權(quán)限證書代替現(xiàn)有的權(quán)限證書。替換后新的證書變成當(dāng)前的證書。
圖18所示為產(chǎn)生權(quán)限證書的過程。為產(chǎn)生權(quán)限證書,從加密引擎獲得新的密鑰對。如上所述,新密鑰對包括共用密鑰和專用密鑰。新密鑰被插入到新權(quán)限證書中(塊2510和2515)。形成證書消息以使其既包括新共用密鑰又包括專用密鑰(塊2520)。計(jì)算證書消息的散列值(塊2525)。使用證書消息和新的專用密鑰產(chǎn)生散列值證書簽名(塊2530)。然后將證書簽名插入到新的權(quán)限證書中(塊2535)。
返回到圖9,RAPI1550將新的權(quán)限證書發(fā)送回訪問驅(qū)動(dòng)程序1545(塊1625)。一旦接收到新的權(quán)限證書,訪問驅(qū)動(dòng)程序1545用新證書中的信息將當(dāng)前權(quán)限證書更新(塊1630)。因此,在新權(quán)限證書中的信息被用來產(chǎn)生后續(xù)的服務(wù)請求。在塊1635中,訪問驅(qū)動(dòng)程序1545產(chǎn)生服務(wù)請求以調(diào)用RAPI1550的函數(shù)。
圖13顯示了根據(jù)當(dāng)前發(fā)明的一個(gè)實(shí)施例的服務(wù)請求100的格式。每個(gè)服務(wù)請求包括服務(wù)操作代碼1005、參數(shù)1010的清單以及服務(wù)請求簽名1015。服務(wù)操作代碼1005是表示服務(wù)操作類型的數(shù)值。在一個(gè)實(shí)施例中的服務(wù)操作的說明性示例可以包括讀或?qū)懘鎯?chǔ)在非易失性存儲(chǔ)器中的數(shù)據(jù)的操作。每種服務(wù)操作的類型可能需要一個(gè)或多個(gè)包括在參數(shù)清單中的參數(shù)。在一個(gè)實(shí)施例中,參數(shù)清單可以是指向參數(shù)束駐留的存儲(chǔ)器位置的指針。每個(gè)服務(wù)請求1000還包括服務(wù)請求簽名1015以防止諸如計(jì)算機(jī)病毒的外來代碼段,從而捕捉和應(yīng)答該服務(wù)請求使得不能對系統(tǒng)造成嚴(yán)重?fù)p壞。
圖15概述了按照當(dāng)前發(fā)明的一個(gè)實(shí)施例產(chǎn)生服務(wù)請求。在塊1205和1210中,在服務(wù)請求中插入服務(wù)操作代碼,該服務(wù)操作代碼表示將要執(zhí)行的所需服務(wù)操作和所需操作所需的參數(shù)清單。塊1215、1220和1225示出了服務(wù)請求簽名的產(chǎn)生。一旦產(chǎn)生,就在服務(wù)請求中插入服務(wù)請求簽名(塊1230)。
返回到圖9,訪問驅(qū)動(dòng)程序1545將塊1635中產(chǎn)生的服務(wù)請求發(fā)送到RAPI1550中(塊1640)。一旦接收到服務(wù)請求,則RAPI1550處理該請求(塊1645)。圖16示出了根據(jù)當(dāng)前發(fā)明的一個(gè)實(shí)施例在處理服務(wù)請求中所需的動(dòng)作。在塊1305中,從服務(wù)操作代碼和從訪問驅(qū)動(dòng)程序中接收的服務(wù)請求中可得到的參數(shù)清單中構(gòu)建出消息。計(jì)算構(gòu)建消息的散列值(塊1310)。服務(wù)請求簽名從會(huì)話請求中抽取并利用包括在當(dāng)前權(quán)限證書的RAPI的拷貝中的共用密鑰來解密(塊1315)。在塊1320中,解密的會(huì)話簽名與被計(jì)算的構(gòu)建消息的散列值相比較。如果被計(jì)算的散列值等于解密會(huì)話請求簽名,則RAPI執(zhí)行服務(wù)請求中指定的服務(wù)(塊1325)。否則,不能執(zhí)行指定的服務(wù)。
返回到圖9,處理服務(wù)請求后,RAPI1550產(chǎn)生新的權(quán)限證書(塊1650)。如上所述,圖15所示為產(chǎn)生權(quán)限證書的過程。RAPI1550保留了為其自己使用的新的權(quán)限證書的拷貝。RAPI1550也交新的權(quán)限證書的拷貝發(fā)送回訪問驅(qū)動(dòng)程序1545。
一旦接收到新的權(quán)限證書,訪問驅(qū)動(dòng)程序1545用新證書中的信息更新當(dāng)前授僅證書(塊1630)。因此,在新權(quán)限證書中的信息會(huì)用來產(chǎn)生后續(xù)的服務(wù)請求。在塊1635中,訪問驅(qū)動(dòng)程序1545產(chǎn)生會(huì)話請求以請求RAPI1550結(jié)束當(dāng)前會(huì)話。如上所述,圖10概述了包括產(chǎn)生會(huì)話請求的動(dòng)作。隨著會(huì)話請求的產(chǎn)生,訪問驅(qū)動(dòng)程序1545將請求發(fā)送到RAPI1550。
一旦收到結(jié)束或終止會(huì)話的會(huì)話請求,RAPI1550就結(jié)束會(huì)話(塊1680)。圖17所示為包括結(jié)束當(dāng)前會(huì)話的動(dòng)作。在塊1405中,從會(huì)話操作代碼和從訪問驅(qū)動(dòng)程序中接收的會(huì)話請求中可得到的參數(shù)清單中構(gòu)建出消息。計(jì)算構(gòu)建消息的散列值(塊1410)。會(huì)話請求簽名從會(huì)話請求中抽取并利用包括在當(dāng)前權(quán)限證書的RAPI的拷貝中的共用密鑰來解密(塊1415)。在塊1420中,解密的會(huì)話簽名與被計(jì)算的構(gòu)建消息的散列值相比較。如果被計(jì)算的散列值等于解密會(huì)話請求簽名,則RAPI開始進(jìn)行結(jié)束當(dāng)前會(huì)話(塊1425)。
返回到圖9,結(jié)束會(huì)話后,RAPI1550產(chǎn)生新的權(quán)限證書(塊1685)。如上所述,圖15所示為產(chǎn)生權(quán)限證書的過程。然后RAPI1550將新的權(quán)限證書發(fā)送回訪問驅(qū)動(dòng)程序1545(塊1690)。一旦接收新的權(quán)限證書,訪問驅(qū)動(dòng)程序1545用新證書中的信息更新當(dāng)前權(quán)限證書(塊1695)。因此,在新的權(quán)限證書中的信息可用來在后續(xù)會(huì)話中產(chǎn)生請求。
圖9顯示在工作會(huì)話中訪問驅(qū)動(dòng)程序僅產(chǎn)生一個(gè)服務(wù)請求。實(shí)際上,在每個(gè)工作會(huì)話中間可產(chǎn)生多個(gè)服務(wù)請求并發(fā)送到RAPI1550。
總之,本發(fā)明在會(huì)話和服務(wù)請求中需要包括數(shù)字簽名來作為安全措施防止系統(tǒng)外來組件(例如病毒)調(diào)用BIOS函數(shù)或服務(wù)程序。而且,每個(gè)連續(xù)會(huì)話或服務(wù)請求包括利用新的專用密鑰產(chǎn)生數(shù)字簽名以防止外來組件捕捉和應(yīng)答會(huì)話和/或服務(wù)請求和對系統(tǒng)造成不利影響。因此,本發(fā)明中采用的安全措施保證安全、可靠地利用BIOS函數(shù)。
雖然本發(fā)明的優(yōu)選實(shí)施例已經(jīng)進(jìn)行了表示和說明,但是,應(yīng)當(dāng)知道,本領(lǐng)域的技術(shù)人員可以在不背離本發(fā)明的精神的條件下進(jìn)行變化和變型,本發(fā)明的范圍由權(quán)利要求書限定。
附錄A
用于視窗NT4.0的BIOS電源管理服務(wù)簡介本文件提供32位BIOS電源管理服務(wù)接口(BPMSI)的接口。該接口用于視窗NT電源管理內(nèi)核驅(qū)動(dòng)程序?yàn)橹繟PM的程序提供電源管理服務(wù)。
術(shù)語APM BIOS系統(tǒng)BIOS,提供附加于APM標(biāo)準(zhǔn)(當(dāng)前為再版1.2)的電源管理功能。
內(nèi)核模式一種NT系統(tǒng)代碼運(yùn)行的專用處理器模式。內(nèi)核模式線程訪問所有的I/O和系統(tǒng)存儲(chǔ)器。
電源管理內(nèi)核驅(qū)動(dòng)程序(PM驅(qū)動(dòng)程序)為服務(wù)提供對BIOS ROM,BIOS數(shù)據(jù)和32位服務(wù)的訪問。
電源管理服務(wù)(PM服務(wù))為應(yīng)用程序和其他驅(qū)動(dòng)程序提供電源管理服務(wù)。使用電源管理內(nèi)核驅(qū)動(dòng)程序(PM驅(qū)動(dòng)程序)提供的接口將它們的請求翻譯成對BIOS電源管理服務(wù)接口的查詢。
PowerPAL鳳凰公司APM BIOS擴(kuò)展,提供系統(tǒng)和設(shè)備電源管理功能的應(yīng)用程序級(jí)訪問。
系統(tǒng)空閑PM服務(wù)檢測到的在應(yīng)用程序級(jí)最小處理的狀態(tài)。在這個(gè)狀態(tài)下,只有在空閑優(yōu)先級(jí)下運(yùn)行的線程才被執(zhí)行并且它們被任何在更高優(yōu)先級(jí)類運(yùn)行的線程所搶占。
用戶模式一種應(yīng)用程序代碼運(yùn)行的非專用處理器模式。用戶模式線程不能訪問I/O和系統(tǒng)存儲(chǔ)器。
結(jié)構(gòu)概述支撐視窗NT電源管理的BIOS擴(kuò)展分為兩部分(a)BIOS32服務(wù)目錄的修改。增加了一個(gè)入口,它允許PM驅(qū)動(dòng)程序找到BIOS電源管理服務(wù)接口的入口點(diǎn)。
(b)新的32位BIOS電源管理服務(wù),它模仿APM32位接口而稍有不同,以下將說明。新的接口提供0:32位調(diào)用方法,它們更安全和對視窗NT更友好。
當(dāng)PM內(nèi)核希望使用BIOS服務(wù)時(shí),它必須進(jìn)行以下步驟1.找到BIOS32服務(wù)目錄頭部。
2.調(diào)用BIOS32服務(wù)目錄調(diào)用接口,它指定32位BIOS電源管理服務(wù)接口入口點(diǎn)。
3.調(diào)用BIOS32位BIOS電源管理服務(wù)接口入口點(diǎn),請求APM連接。
BIOS32服務(wù)目錄修改32位BIOS服務(wù)目錄是鳳凰BIOS中已有的結(jié)構(gòu),它允許32位保護(hù)模式應(yīng)用程序或操作系統(tǒng)找到特定的32位服務(wù)的入口點(diǎn)。該標(biāo)準(zhǔn)定義了新的標(biāo)準(zhǔn)32位BIOS服務(wù)。
BIOS32服務(wù)目錄包括一個(gè)可以被PM驅(qū)動(dòng)程序檢測的固定結(jié)構(gòu)和返回特定服務(wù)地址的單個(gè)函數(shù)。
BIOS32服務(wù)目錄頭部實(shí)現(xiàn)BIOS32服務(wù)目錄的BIOS必須在物理地址0E000h-0FFFFFh的范圍內(nèi)的某處嵌入一個(gè)特定的連續(xù)16字節(jié)結(jié)構(gòu)。該結(jié)構(gòu)必須是分段對準(zhǔn)的(即,它必須在16字節(jié)邊界開始)。該結(jié)構(gòu)已知為BIOS32服務(wù)目錄頭部。
該頭部由六個(gè)獨(dú)立的字段組成。以下是每個(gè)字段的描述。
BIOS32服務(wù)目錄的客戶應(yīng)首先通過定位頭部而確定它的存在。這是通過掃描段增量中0E0000h至0FFFF0h和在每個(gè)段的首4字節(jié)中查找簽名匹配(“_32_”)而確定。當(dāng),和如果,檢測到簽名,客戶應(yīng)進(jìn)行頭部所有字節(jié)的校驗(yàn)求和。(段中頭部長度在偏移9h中找到。)頭部的所有字節(jié)相加到一起應(yīng)為0h。如果校驗(yàn)求和有效則32位入口點(diǎn)字段可以用作BIOS服務(wù)目錄調(diào)用接口的地址。如果頭部未找到,則BIOS32服務(wù)目錄在平臺(tái)中不存在。
BIOS32服務(wù)目錄入口點(diǎn)它的相關(guān)代碼和數(shù)據(jù)可能定位在4GB物理地址空間內(nèi)的任何地方。然而,它必須保證為物理連續(xù)的(即,它將分配在ROM或閃存空間)并容納在兩頁中(即,它不跨過3頁)。
BIOS服務(wù)目錄為了找到BIOS32位電源管理服務(wù)接口的入口點(diǎn),PM驅(qū)動(dòng)程序必須帶以下參數(shù)調(diào)用BIOS服務(wù)目錄INEAX “NTPM”0X4e54504DEBX0x00000000OUTAL錯(cuò)誤代碼0x00=空,0x81=服務(wù)不存在EBX 32位電源管理服務(wù)代碼基地址ECX 32位電源管理服務(wù)代碼入口點(diǎn)長度(從EBX)EDX 32位電源管理服務(wù)代碼入口點(diǎn)偏移(從EBX)32位電源管理服務(wù)代碼入口點(diǎn)是FAR(即,需要段和偏移兩者壓入堆棧)CS基地址必須小于或等于包含入口點(diǎn)的頁的(4KB)頁地址。例如,如果入口點(diǎn)是0FFF81234H,則基地址必須小于或等于0FFF81000h。該范圍必須使基地址加該范圍生成一個(gè)地址大于或等于包含入口點(diǎn)的頁之后的(4kB)頁的最后地址。例如,如果入口點(diǎn)是0FFF81234H則基地址加范圍必須大于或等于0FFF82FFFH。簡而言之,基地址和范圍必須“包圍”包含入口點(diǎn)的頁和隨后頁。
段類型必須是100b(代碼,只能可執(zhí)行)或101b(代碼,可執(zhí)行/讀)。但是,服務(wù)目錄的實(shí)現(xiàn)不能假設(shè)CS代碼段的讀訪問。系統(tǒng)位必須是1(非系統(tǒng)段)。推薦描述符專用級(jí)(DPL)為0。(CS描述符DPL成為當(dāng)前專用級(jí),或CPL)。如果CPL是非0,則OS必須提供環(huán)0專用指令(例如訪問CRx的那些指令)的捕獲和虛擬服務(wù)。還請注意位于EFLAGS中的IOPL字段上的該字段的依賴性(見段0)。
缺省大小位必須為1(32位)。
DS基地址必須等于CS基地址。范圍必須大于或等于CS范圍。
段類型必須是000b(數(shù)據(jù),只讀)或001(數(shù)據(jù),讀/寫)。但是,服務(wù)目錄的實(shí)現(xiàn)不能假設(shè)DS數(shù)據(jù)段的寫訪問。系統(tǒng)位必須為1(非系統(tǒng)段)。描述符專用級(jí)(DPL)必須大于或等于CPL(見段0DPL字段)。SS段類型必須是011b(數(shù)據(jù),讀/寫,向下擴(kuò)展)或001b數(shù)據(jù),讀/寫,向上擴(kuò)展)。系統(tǒng)位必須為1(非系統(tǒng)段)。描述符專用級(jí)(DPL)必須等于CPL(見段0中的DPL字段)。缺省大小位必須是1(32位)。
間隔位必須是1(4KB)。
注意以上設(shè)置保證至少4kB的堆棧大小。調(diào)用者有責(zé)任保證有至少1kB的可用的沒被使用的堆棧PagingPaging可以或不使能。如果paging使能,由CS和DS選擇器描述的地址空間必須是線性連續(xù)。即,在ROM或FLASH中找到的調(diào)用接口的原始物理連續(xù)性必須保持。(調(diào)用接口代碼和數(shù)據(jù)被寫成與位置無關(guān)和EIP相關(guān))。
IOPL為使調(diào)用接口執(zhí)行I/O指令,EFLAGS中的I/O專用級(jí)(IOPL)字段必須大于或等于CPL(見段0中DPL字段)。
OtherBIOS數(shù)據(jù)區(qū),擴(kuò)展BIOS數(shù)據(jù)區(qū)和固定位置ROM數(shù)據(jù)表不能假設(shè)因?yàn)閜aging可用于執(zhí)行代碼。BDA可使用由調(diào)用者提供的指針而被訪問。
32位BIOS電源管理服務(wù)接口總的來說,32位BIOS電源管理接口提供32位APM入口點(diǎn)相同的功能。有兩個(gè)區(qū)別的地方調(diào)用參數(shù)傳遞的方式和支持某些APM連接函數(shù)的方式。
調(diào)用參數(shù)APM32位接口傳遞CPU寄存器中所有的參數(shù)。BIOS電源管理服務(wù)接口傳遞參數(shù)至堆棧。等效C形式聲明可以是
typedef struct{ULONGreserved0;/*00*/ULONGpBDA; /*04*/ULONGregFlags; /*08*/ULONGreserved1;/*0C*/ULONGreserved2;/*10*/ULONGreserved3;/*14*/ULONGreserved4;/*18*/ULONGreserved5;/*1C*/ULONGreserved6;/*20*/ULONGreserved7;/*24*/ULONGreserved8;/*28*/ULONGreserved9;/*2C*/ULONGregEBP; /*30*/ULONGregEDI; /*34*/ULONGregESI; /*38*/ULONGregEDX; /*3C*/ULONGregECX; /*40*/ULONGregEBX; /*44*/ULONGregEAX; /*48*/}regStruct;unsigned char BPMSI(regStruct* parameters);活動(dòng)APM函數(shù)和它的動(dòng)作由寫入相應(yīng)的寄存器字段中的值決定。PDBA字段是指向內(nèi)核驅(qū)動(dòng)程序映射BIOS數(shù)據(jù)區(qū)使它可被服務(wù)入口訪問的虛擬地址的指針。
如果發(fā)生錯(cuò)誤,regFlags的位0將是1和錯(cuò)誤碼將是regEAX的位8-15,否則它將是0和regEAX的位8-15將為0。錯(cuò)誤碼與APM1.2標(biāo)準(zhǔn)中的相同。
軟件要求開發(fā)軟件要求建立PM服務(wù)要求的以下軟件開發(fā)工具M(jìn)ASM 6.11C匯編器,微軟公司鳳凰PhDebug,用于跟蹤代碼軟件要求PM服務(wù)要求在以下環(huán)境運(yùn)行視窗NT4.0鳳凰NoteBIOS系統(tǒng),支持至PowerPAL的NT BIOS接口系統(tǒng)中安裝的PM驅(qū)動(dòng)程序端口變化以下部分描述在Core,Miser和芯片組代碼中修改的文件。它還描述為正常BIOS接口至包含NT支持所需的變化。
附錄B
PhoneixPhlash NT視窗NT的閃存ROM編程工具附錄B中的PhoenixAD驅(qū)動(dòng)程序是指訪問驅(qū)動(dòng)程序46。
1.0PhoenixPhlash閃存工具將用于將BIOS映象編程入AT兼容系統(tǒng)的閃存ROM中。該工具包括以下文件PHLASHNT.EXE 用于對閃存ROM編程PLATFORM.DLL 用于執(zhí)行平臺(tái)無關(guān)的函數(shù)BIOS.ROM 被編程入閃存ROM的實(shí)際BIOS映象這份說明提供了PHLASHNT.EXE程序功能的詳細(xì)說明。因?yàn)镻LATFORM.DLL和BIOS.ROM是與平臺(tái)有關(guān)的,在這份文件中只覆蓋了這兩個(gè)文件的一般格式。
PhoenixPhlash將作為Win32控制臺(tái)應(yīng)用程序執(zhí)行。
這個(gè)設(shè)計(jì)工程的靈活性,適應(yīng)性和支持性是非常優(yōu)先的。在PLATFORM.DLL文件中盡可能放入更多的定制功能使得可以不修改PHLASHNT.EXE而支持許多不同的平臺(tái)和配置。PhoenixPhlash將支持有單一閃存ROM部件的平臺(tái)以及帶多個(gè)閃存ROM的平臺(tái)。1Mb-4Mb的閃存ROM可以容納包括引導(dǎo)塊設(shè)備和有多個(gè)可擦區(qū)的任何配置的設(shè)備。
對于每個(gè)支持的部分,指定給特定閃存ROM部分的所有代碼(例如,英特爾28Fxxxx)將是PHLASHNT.EXE模塊的一部分。與平臺(tái)有關(guān)的所有代碼和參數(shù)(例如,擦除使能代碼和閃存ROM地址區(qū))將是PLATFORM.DLL模塊的一部分。
PHLASHNT.EXE,Phoenixhlash工具的主要模塊,將包含與平臺(tái)無關(guān)的所有代碼。它將包含用戶界面代碼,加載和確認(rèn)PLATFORM.DLL文件的代碼和與平臺(tái)無關(guān)代碼以對閃存設(shè)備編程。
PHLASHNT.EXE將是一個(gè)Win32可執(zhí)行文件,用微軟C+ +V4。2或其后版本生成。
使用Cdriver訪問硬件PHLASHNT.EXE使用Cdriver C++類,它與PhoenixAD驅(qū)動(dòng)程序一起使視窗NT用戶模式應(yīng)用程序能夠訪問I/O端口,訪問BIOS設(shè)計(jì)和代碼區(qū);和執(zhí)行BIOS32服務(wù)。Cdriver類提供一個(gè)簡單和靈活的在應(yīng)用程序和PhoenixAD驅(qū)動(dòng)程序之間的接口。
Cdriver與PhoenixAD驅(qū)動(dòng)程序一起為用戶模式應(yīng)用程序提供以下功能訪問I/O端口執(zhí)行BIOS32服務(wù)訪問BIOS映象訪問BIOS數(shù)據(jù)區(qū)讀取相同實(shí)時(shí)時(shí)鐘Cdriver類作為視窗NT應(yīng)用程序和PhoenixAD驅(qū)動(dòng)程序之間的一個(gè)薄包裝接口。它封裝了驅(qū)動(dòng)程序的接口和提供應(yīng)用程序和內(nèi)核驅(qū)動(dòng)程序設(shè)計(jì)兩者的靈活性。
為保證將來的兼容性,PHLASHNT.EXE不直接調(diào)用PhoenixAD驅(qū)動(dòng)程序;相反,它調(diào)用Cdriver類中的方法。
2.0運(yùn)行模式2.1Win32控制臺(tái)PHLASHNT.EXE在一個(gè)視窗NT中的窗口中開始,之后是可選的命令行標(biāo)志(如果有)。
命令行標(biāo)志將包括(大小寫都可接受)/AAUTODETECT OFF-不從該部分讀取ID。缺省的,程序確認(rèn)制造者ID和和從部件中讀取的部件ID,比較PLATFORM.DLL文件中指定的ID和當(dāng)兩個(gè)ID不同時(shí),使用從部件讀取的ID。這使得多個(gè)不同部件采用相同的PLATFORM.DLL和BIOS.ROM而不需要修改這兩個(gè)文件。當(dāng)該標(biāo)記不被設(shè)置時(shí),假設(shè)ID是從部件“可讀”的。當(dāng)該標(biāo)記被設(shè)置,來自部件的ID不被使用,相反使用PLATFORM.DLL中指定的值。
/B=文件名BINARY FILE-覆蓋缺省平臺(tái)特定二進(jìn)制文件。當(dāng)需要全路徑指定時(shí)和/或二進(jìn)制文件有一個(gè)不是PLATEFORM.DLL的文件名時(shí),這個(gè)選項(xiàng)是必須的。
/BU=filenameBACKUP-在被刪除之前將BIOS映象的以前版本存入文件filename。Filename是可選的;如果未指定,以前的映象存入BIOS.BAK。因?yàn)锽IOS的多個(gè)版本使用與平臺(tái)有關(guān)的特性,如陰影存儲(chǔ)器和解壓縮,所以經(jīng)常需要使用PLATFORM.DLL中與平臺(tái)有關(guān)的代碼而在它被寫入文件前取回BIOS映象。
/CCMOS UPDATE-在閃存被更新后清除CMOS校驗(yàn)求和。如果AUTO_UPDATE特性安裝在新的BIOS映象中,在下一次引導(dǎo)時(shí)BIOS自動(dòng)設(shè)置所有的CMOS字段至它們的缺省值。如果AUTO_UPDATE特征未加載,BIOS在下一次引導(dǎo)顯示CMOS校驗(yàn)求和錯(cuò)誤信息并提示用戶按F2鍵以執(zhí)行Setup和手工重配置機(jī)器。
/CSCHECKSUM BIOS ROM-在BIOS ROM映象上計(jì)算校驗(yàn)求和。如果校驗(yàn)求和不為0,或如果可選的PLATFORM.DLL函數(shù)CheckSum失敗,程序帶有錯(cuò)誤信息終止。
/HUSAGE-顯示程序名,版本,版權(quán)和幫助屏。/?也可用于這個(gè)選項(xiàng)。
/IIMAGE SIZE VERIFICATION-只有ROM映象的文件大小與閃存部分大小相同時(shí)才運(yùn)行。
/MODE=nOPERATION-為PHLASHNT選擇一個(gè)運(yùn)行模式。當(dāng)前支持以下模式0只更新BIOS映象(正常運(yùn)行模式)。在該模式下,PHLASHNT用新的映象代替當(dāng)前BIOS映象。系統(tǒng)BIOS中的DMI信息被保持。這是缺省模式和如果沒有/MODE命令行標(biāo)記或如果沒有指定運(yùn)行模式,這是缺省模式。
1只更新DMI信息。在這個(gè)模式中,PHLASHNT將通過DMI命令行指定的字符串寫入閃存。系統(tǒng)BIOS中的DMI信息被保持除非命令行中指定了新的DMI串。
2更新BIOS和DMI信息兩者(保存系統(tǒng)DMI串)。在該模式下,PHLASHNT替換BIOS映象和將DMI命令行標(biāo)志指定的串寫入閃存。系統(tǒng)BIOS中的DMI信息被保持除非命令行中指定了新的DMI串。
3更新BIOS和DMI信息兩者(復(fù)位系統(tǒng)DMI串)。在該模式下,PHLASHNT替換當(dāng)前BIOS映象和將DMI命令行標(biāo)志指定的串寫入閃存。系統(tǒng)BIOS中的DMI信息被新的BIOSROM映象的DMI串和/或命令行指定的DMI串替換。
為了安全起見這些選項(xiàng)不由幫助選項(xiàng)(/H)顯示。
/NNEW(不同)-只為BIOSROM的不同版本進(jìn)行。如果BCPSYS的數(shù)據(jù)結(jié)構(gòu),包括BIOS版本和生成日期和時(shí)間,與BIOS.ROM文件中的相應(yīng)的結(jié)構(gòu)相同,則程序不閃(flashing)而終止。
/OOVERRIDE PLATFORM.DLL OPTIONS-禁止PLATFORM.DLL中設(shè)置的所有標(biāo)志。沒有這個(gè)開關(guān),PLATFORM.DLL中設(shè)置的選項(xiàng)與命令行中指定的選項(xiàng)組合。當(dāng)這個(gè)開關(guān)被使用,只使用命令行選項(xiàng)。
/PPRODUCTION-閃的最大速度。所有的用戶反饋被減到最小(沒有聲音,屏幕更新)。這用于減少在生產(chǎn)環(huán)境中閃一個(gè)部分所需的時(shí)間。只報(bào)告最后的成功/失敗。
/PNBIOS PART NUMBER CHECK-只有BIOS.ROM中的BIOS部件號(hào)與當(dāng)前BIOS部件號(hào)相同時(shí)才進(jìn)行。
/PF=“l(fā)ist of options”被傳遞到與平臺(tái)有關(guān)模塊PLATFORM.DLL的命令行選項(xiàng)。在一些平臺(tái)中,它希望傳遞命令行選項(xiàng)至平臺(tái)有關(guān)過程。這是通過CmdLine()函數(shù)實(shí)現(xiàn)。當(dāng)CmdLine()地址是非零和這個(gè)命令行選項(xiàng)出現(xiàn),緊接著等號(hào)的串被傳遞至PLATFORM.DLL(如果串中包含空格,包括雙引號(hào)中的串)。
/RnRETRY-如果閃塊失敗,重試n次而不終止。
/Rn選項(xiàng)通過在PLATFORM.CPP中設(shè)置psiRetryCount為希望的重試次數(shù)而被用于緊急模式。
/SSILENT-無聲運(yùn)行而沒有聲音反饋。
/VVERIFY-每個(gè)塊被編程后,閃部件地址空間中的數(shù)據(jù)與BIOS.ROM文件中的數(shù)據(jù)進(jìn)行比較。任何差別被報(bào)告和程序被相同塊重試編程或系統(tǒng)暫停(根據(jù)對提示的響應(yīng))。因?yàn)闄z查是在閃存被擦除后進(jìn)行的,系統(tǒng)將非常不穩(wěn)定和不可能正確提示用戶和恢復(fù)。
/ZZERO BLOCKS-在擦除前零閃塊。
filenameBIOS ROM映象文件名。前面沒有反斜杠的任何命令行選項(xiàng)被解釋為BIOSROM映象文件的文件名。只有當(dāng)需要指定ROM BIOS映象和/或ROM BIOS映象文件不同于BIOS.ROM時(shí)才需要文件名。
@filename響應(yīng)文件。上述任何命令行選項(xiàng)可以置于響應(yīng)文件中。PHLASHNT將讀取這個(gè)文件并作為輸入的命令行進(jìn)行處理。選項(xiàng)可以置于一行或不同行。
每行最多1024個(gè)字符。
以下命令行標(biāo)志用于寫信息至閃存以便其后通過鳳凰桌面管理接口(DMI)取回。DMI命令行標(biāo)志被忽略,如果目標(biāo)BIOS映象不支持DMI接口(沒有安裝DMI BCP結(jié)構(gòu))或PHLASHNT運(yùn)行模式只是BIOS(見以上)。
所有標(biāo)志都有格式/DxxString,其中xx是識(shí)別指定DMI串的(見以下)一或兩個(gè)字符。DMI命令行標(biāo)志是可選的;即,如果一個(gè)給定的DMI命令行標(biāo)志不被指定,相應(yīng)的DMI串緩沖的以前的內(nèi)容不被修改,除非在PLATFORM.DLL中指定了缺省串。這種情況下,PHLASHNT總是寫入缺省串至相應(yīng)的DMI串緩沖。如果DMI命令標(biāo)志被指定而沒有String字段,相應(yīng)的DMI串緩沖被清空(置為空串)。String只能包含可打印ASCII字符。String如果含有空格,則必須包含在引號(hào)中。每個(gè)DMI串的最大長度是與平臺(tái)有關(guān)的;PHLASHNT返回有關(guān)錯(cuò)誤信息,如果傳遞的串長過相應(yīng)的目標(biāo)緩沖。當(dāng)前支持以下的DMI字段。這些選項(xiàng)為了安全理由不能由幫助(/H)選項(xiàng)顯示。
/DSSString指定系統(tǒng)序列號(hào)串/DMSString指定系統(tǒng)制造商名串/DPSString指定系統(tǒng)產(chǎn)品(模塊)識(shí)別串/DVSString指定系統(tǒng)版本串/DSMString指定母板序列號(hào)串/DMMString指定母板制造商名串/DPMString指定母板產(chǎn)品(模塊)識(shí)別串/DVMString指定母板版本串
/DSCString指定機(jī)箱序列號(hào)串/DMCString指定機(jī)箱制造商名串/DPCString指定機(jī)箱產(chǎn)品(模塊)識(shí)別串/DVCString指定機(jī)箱版本串/DO1String指定OEM串1…/DOnString指定OEM串n系統(tǒng)和機(jī)箱開關(guān)只用于DMI版本2.0命令行的舊形式,見以下,原用于DMI1.2并保持兼容。它們分別相當(dāng)于/DSM,/DPM和/DVM。
/DSString指定母板序列號(hào)串/DMString指定母板制造商名串/DPString指定母板產(chǎn)品(模塊)識(shí)別串/DVString指定母板版本串接下來,閃存程序?qū)⒓虞dPLATFORM.DLL文件和調(diào)用PLATFORM.DLL中的與平臺(tái)有關(guān)函數(shù)EnableFlash()為閃準(zhǔn)備平臺(tái)。PLATFORM.DLL指示BIOSROM將在存儲(chǔ)器中加載的存儲(chǔ)器區(qū)域和指示哪個(gè)存儲(chǔ)器區(qū)域被用于閃設(shè)備。存儲(chǔ)器區(qū)域可以在傳統(tǒng)存儲(chǔ)器中或在擴(kuò)展存儲(chǔ)器中。在ROM映象被加載至存儲(chǔ)器后,設(shè)備編程開始。
對于被編程的每個(gè)閃存ROM塊1.BeginFlash()在PLATFORM.DLL中被調(diào)用2.PHLASHNT.EXE中的正確算法被執(zhí)行。
3.EndFlash()在PLATFORM.DLL中被調(diào)用該過程在每個(gè)PLATFORM.DLL中指定的閃存塊重復(fù)。這用于單個(gè)平臺(tái)中的多個(gè)設(shè)備,一個(gè)設(shè)備中的多個(gè)塊和每個(gè)塊的塊相關(guān)初始化/終止代碼。
這還用于存儲(chǔ)器區(qū)域的自動(dòng)保存和恢復(fù),例如引導(dǎo)塊。
在閃期間,過程信息被顯示給用戶1.如果生產(chǎn)模式未被選擇,一個(gè)適合的消息窗口被顯示在屏幕上,其中包括時(shí)間,氣體表形式的進(jìn)度指示和狀態(tài)行消息。
2.大約一秒一次短蜂鳴。
3.在每步的開始和結(jié)束,一個(gè)適合的代碼被發(fā)送這跟蹤端口。
視頻至少被一秒更新一次。聲音大約每秒生產(chǎn)一次。注意生產(chǎn)環(huán)境過程更新可以被禁止。
在閃完成之后,DisableFlash()被從PLATFORM.DLL文件中執(zhí)行。兩個(gè)不同的聲音之一被生產(chǎn)以指示閃過程的成功或失敗。如果有視頻,適合的消息窗口被顯示。在短暫的暫停后系統(tǒng)重引導(dǎo)。
2.3完成代碼雖然程序通過許多步驟進(jìn)行和能夠報(bào)告給用戶每個(gè)步驟的狀態(tài),只有三個(gè)主要階段被聲音和鍵盤LED代碼識(shí)別。三個(gè)主要階段是1.讀和確認(rèn)PLATFORM.DLL文件2.進(jìn)行平臺(tái)有關(guān)的初始化3.部件編程如果程序不能完成任何閃過程的三個(gè)主要階段,程序?qū)⑹褂脜^(qū)別的聲音序列和鍵盤LED以通知用戶在哪個(gè)階段失敗。在程序的開始,鍵盤的CAPS_LOCK,NUM_LOCK和SCROLL_LOCK LED打開。三個(gè)階段的每一個(gè)的失敗指示如下聲音 鍵盤LED開描述低蜂鳴+3短音 CAPS,NUM,SCROLL1.開始讀platform.dll前低蜂鳴+2短音 CAPS,NUM, 2.初始平臺(tái)前低蜂鳴+1短音 NUM 3.初始平臺(tái)后一個(gè)長音 無 成功完成階段1-失敗發(fā)生在定位PLATFORM.DLL之前。最可能是因?yàn)镻LATFORM.DLL文件格式錯(cuò)誤。系統(tǒng)處于穩(wěn)定模式,BIOS沒有發(fā)生改變,不需要重引導(dǎo)。
階段2-在平臺(tái)有關(guān)初始時(shí)失敗。。系統(tǒng)不穩(wěn)定和需要重引導(dǎo)。BIOS未發(fā)生改變。
階段3-在對閃存編程時(shí)發(fā)生失敗。系統(tǒng)不穩(wěn)定和BIOS閃存被破壞。系統(tǒng)必須用急救軟盤重新開始。
該程序還在每個(gè)步驟進(jìn)行錯(cuò)誤檢測。除非通過PRODUCTION選項(xiàng)明確禁止,在程序進(jìn)行時(shí),在屏幕和跟蹤端口報(bào)告當(dāng)前進(jìn)行的步驟的步驟號(hào),或錯(cuò)誤代碼。錯(cuò)誤的代碼號(hào)和程序在附件B2中被進(jìn)一步定義。
當(dāng)在對閃存部件作出任何改變之前檢測到錯(cuò)誤,程序?qū)⒃噲D通知用戶和帶有正確的錯(cuò)誤消息而退出PHLASHNT。一旦閃存被修改,錯(cuò)誤將使程序停止。
2.4設(shè)備相關(guān)模塊對于支持的每種閃存類型,將有一個(gè)部件指定模塊進(jìn)行以下1.識(shí)別部件和返回制造商ID和部件ID2.清零閃存范圍(設(shè)置所有位為0)3.擦除閃存范圍(設(shè)置所有位為1)4.編程閃存范圍2.4.1自動(dòng)檢測這個(gè)模塊是從閃存部件中讀取制造商ID和部件ID所需的代碼。如果不能確定這些ID,返回零。當(dāng)在PLATFORM.DLL文件中提供AutoSense()函數(shù);內(nèi)置自動(dòng)檢測模塊不被采用;而采用提供的AutoSense()函數(shù)。
2.4.2零有一些類型要求在被編程前閃存被置為零。這個(gè)模塊中是設(shè)置存儲(chǔ)器范圍為零所需的代碼。
2.4.3擦除大多數(shù)閃存部件要求在部件被編程前置為1。這些部件經(jīng)常允許用一個(gè)寫操作擦除閃存的整個(gè)塊。在該模塊中是將存儲(chǔ)器范圍置為1必須的代碼。
當(dāng)塊描述符在PLATFORM.DLL文件中被定義時(shí),必須建立描述符使閃存中每個(gè)“可擦除”塊有至少一個(gè)描述符。例如在英特爾28F004閃存中,有一個(gè)16K字節(jié)BOOT塊,兩個(gè)8K字節(jié)PARAMETER塊,一個(gè)96K字節(jié)MAI N塊和三個(gè)128K字節(jié)EXTENDED塊。七個(gè)塊中的每一個(gè)能用一個(gè)寫擦除和七個(gè)塊的每一個(gè)必須有至少一個(gè)描述符。
2.4.4程序在這個(gè)模塊中是從BIOS ROM映象中讀取數(shù)據(jù)字節(jié)和將它們編程進(jìn)閃存部件所需的代碼。
2.5支持的設(shè)備由PHLASHNT.EXE支持的閃存設(shè)備的初始設(shè)置包括下表列出的部件。對于每個(gè)部件類型,列出了制造商和部件ID和部件描述。當(dāng)有新的部件時(shí),需要增加新的模塊至PHLASHNT.EXE使得可以提供閃算法的新類型(新的AutoDetect(),Zero(),Erase(),Program()函數(shù))。如果新的部件可能使用已有的算法而只是制造商和部件ID改變了,可以在PLATFORM.DLL文件中指出并不需要修改PHLASHNT.EXE(詳情見PartTypes部分)。
類型 Mfg ID Part ID描述2 0x010xA1 AMD28F2562 0x010x25 AMD28F5121 0x010xA7 AMD28F0101 0x010xA2 AMD28F010A2 0x010x2A AMD28F0202 0x010x29 AMD28F020A2 0x010x20 AMD29F0102 0x010xA4 AMD29F0402 0x010x51 AMD29F200T1 00x00xB0 AMD29F002T1 00x00x34 AMD29F002B1 0x010xDC AMD29F002BXT1 0x010x5D AMD29F002BXB3 0x1F0xD5 ATMEL 29C0108 0x1F0xDA ATMEL 29C0203 0x1F0x35 ATMEL 29LV0101 0x1C0xD0 Mitsubishi 28F1011 0x890xB9 Intel 28F2561 0x890xB8 Intel 28F5121 0x890xB4 Intel 28F0101 0x890xBD Intel 28F0204 0x890x94 Intel 28F001 BX-T4 0x890x95 Intel 28F001 BX-B4 0x890x7C Intel 28F002 BX-T4 0x890x7D Intel 28F002 BX-B4 0x890x74 Intel 28F200 BX-T4 0x890x75 Intel 28F200 BX-B4 0x890x78 Intel 28F004 BX-T4 0x890x79 Intel 28F004 BX-B4 0x890x70 Intel 28F400 BX-T4 0x890x71 Intel 28F400 BX-B5 0xBF0x07 SST 29EE010/29LE01012 0xBF0x10 SST 29EE0205 0xBF0x5D SST 29EE5126 0xBF0x04 SST 28SF0401 0x200x07 ST M28F1017 0xC20x11 MX 28F100011 0xC2 0x2A MX 28F2000
3.0PLATFORM.DLL詳情該模塊包含所有與平臺(tái)有關(guān)的代碼和在特定平臺(tái)上對閃存編程所需的參數(shù)。
3.1文件格式PLATFORM.DLL是視窗DLL,由PLATFORM.CPP編譯生成(使用微軟VisualC++ 4.2或其后版本)。它包含特定的平臺(tái)數(shù)據(jù)和可執(zhí)行代碼。
PLATFORM.CPP文件的一個(gè)例子包含在附件B3中。
PLATFORM.DLL的文件版本將從版本“NT 1.00”開始。版本是由包含在PLATFORM.DLL中包含的szVersion變量指定。
3.2文件頭部格式PLATFORM.DLL文件有以下描述的格式//----------------------------------------------//全局變量聲明//---------------------------------------------DWORD dwFileSize//ROM映象文件大小BYTE bManufactID //閃存制造商BYTE bPartID //閃存設(shè)備部件IDDWORD dwFlags //選項(xiàng)標(biāo)志DWORD dwImageBuf//映象文件的線性地址DWORD dwMfgIDAddr //制造商ID的線性地址DWORD dwPartIDAddr //部件ID的線性地址BYTE bRetryCount ///Rn選項(xiàng)計(jì)數(shù)(缺省=0)char szVersion[] //PLATFORM.DLL版本char szROMFileName[] //BIOS映象文件名DWORD dwDLLFuncDefine //指示哪個(gè)函數(shù)被定義BYTE BBLOCKtABLEsIZE //blockTable中塊的個(gè)數(shù)BLOCK_DESCRIPTOR blockTable[]BYTE bpartTypesSize//增加的閃存部件數(shù)DEVICETABLE partTypes[]dwFileSizeBIOS.ROM文件中字節(jié)數(shù)bManufactID 制造商ID
bPartID部件IDdwFlags選項(xiàng)標(biāo)志。必須是以下值的組合FLAG_AUTOSENSEOFF不從部件讀取IDFLAG_BACKUP 備份系統(tǒng)BIOS ROMFLAG_NEWBIOSONLY 如果在F000:0的64K相同,則不閃FLAG_PRODUCTION 最大速度(聲音和視頻關(guān))FLAG_SILENT 不產(chǎn)生任何聲音FLAG_VERIFY 在閃后確認(rèn)每個(gè)塊FLAG_PLATFORMCMD PLATFORM選項(xiàng)串存在FLAG_BIOSPARTNUM 閃相同的BIOS部件號(hào)FLAG_CHECKSUM校驗(yàn)求和BIOS.ROMFLAG_CMOS清CMOS校驗(yàn)求和FLAG_IMAGESIZE 確認(rèn)映象大小與閃存部件匹配DwImageBuf BIOS.ROM映象在擴(kuò)展存儲(chǔ)器中緩沖的地址。該字段確定映象被讀入的緩沖區(qū)線性地址。
該區(qū)域還在SAVE線性被指定時(shí)使用。被存儲(chǔ)的任何塊將使用dwImageBuffer+dwFileSize開始的地址范圍。
dwMfgIDAddrdwPartIDAddr這兩個(gè)可選字段包含閃存ID字節(jié)的線性地址。當(dāng)這些字段是零時(shí),使用缺省地址E0000h和E0001h。
BRetryCount 如果閃失敗重試的次數(shù)。
SzVersion PLATFORM.DLL的版本SzROMFileName 保留給串“BIOS.ROM”。該字段用于識(shí)別和確認(rèn)PLATFORM.DLL文件的格式。
DwDLLFuncDefine 指出在PLATFORM.DLL中定義了哪些與平臺(tái)有關(guān)的函數(shù)。
BblockTableSize 在blockTable中描述的塊的個(gè)數(shù)。
DwBlockTable 閃存部件一次被編程一個(gè)連續(xù)塊。被編程的每塊必須有相應(yīng)的描述符。
BpartTypesSize 增加的閃存部件個(gè)數(shù)DwPartTyes 支持的閃存部件的選項(xiàng)表。表的每項(xiàng)有以下格式
Typedef struct{BYTE CmFGid; //制造商IDBYTE cPartID;//部件IDWORD wFlashType //閃算法類型Char szPartName[28] //可選描述}DEVICETABLE;設(shè)備表由描述符終止,cMfgID,cPartID,wFlashType被置為0。許多平臺(tái)允許多個(gè)不同的部件采用相同的BIOS.ROM映象。當(dāng)有新的部件時(shí),部件不在PHLASHNT.EXE當(dāng)前支持的部件中時(shí)和該部件采用與支持的部件中的一個(gè)所用的閃算法相同時(shí),采用該表。
ProcEnable 使能閃過程ProcDisable 禁止閃過程ProcBegin 閃過程開始ProcEnd 結(jié)束閃過程ProcGetBlock為備份過程取得下一個(gè)BIOS塊ProcCmdLine 處理定制命令行選項(xiàng)過程ProcSense 定制autosense過程ProcIsflashable 定制OEM過程以確定是否可以進(jìn)行ProcReboot 定制重引導(dǎo)過程ProcCheckSum如果BIOS ROM映象的校驗(yàn)求和不為零,定制采用的校驗(yàn)求和過程在附件B3中示出PLATFORM.DLL的示例性源代碼。
3.3塊表格式塊表包含塊描述符的列表。表中的每個(gè)塊描述符由以下結(jié)構(gòu)定義typedef struct{DWORD dwBlockSize; //塊中的字節(jié)數(shù)DWORD dwFileOffset; //BIOS.ROM文件中的偏移DWORD dwLinearAddress; //閃存ROM的線性32位地址BYTE cMfgID //制造商ID或0
BYTE cPartID //部件ID或0WORD wBlockAttr//塊屬性}BLOCK_DESCRIPTOR;塊表由描述符終止,所有入口置為0。
DwBlockSize 塊的字節(jié)大小。塊必須連續(xù)DwFileOffset BIOS.ROM文件中該塊的偏移DwLinearAddress 該塊在32位地址空間中的起始地址CmfgID 制造商ID或?yàn)?自動(dòng)檢測CpartID 部件ID或?yàn)?自動(dòng)檢測WBlockAttr 確定對該塊進(jìn)行的動(dòng)作。必須是以下標(biāo)志的組合ATTR_ZERO在被編程前塊必須被置為0ATTR_ERASE 在被編程前塊必須被擦除ATTR_SAVE在被編程前保存該塊內(nèi)容ATTR_PROG編程該塊ATTR_RESTORE 在編程后恢復(fù)該塊內(nèi)容一次只能使用ATTR_SAVE,ATTR_PROG,ATTR_RESTORE中的一個(gè)。如果未指定屬性,PHLASHNT.EXE不改變塊。但是,即使所有這些被省略,還調(diào)用BeginFlash()和EndFlash()。BeginFlash()和EndFlash()當(dāng)兩塊在不同的閃存設(shè)備上時(shí)使用,或引導(dǎo)塊要求附加函數(shù)以使能塊寫入或在下一個(gè)編程前禁止它時(shí)使用。BeginFlash()還被用于條件塊處理。如果BeginFlash()返回非零,當(dāng)前塊不處理。
每個(gè)ATTR_SAVE塊在另一個(gè)ATTR_SAVE塊被使用前,其后必須是ATTR_RESTORE塊。
注意對于給定閃存存儲(chǔ)器范圍,可以有多個(gè)描述符。例如對于64K可擦除閃存中保留的16K閃存引導(dǎo)塊,可以使用3個(gè)塊描述符。第一個(gè)描述符保存16K引導(dǎo)塊,第二個(gè)擦除和編程64K和第三個(gè)恢復(fù)引導(dǎo)塊。
為減少閃所需的時(shí)間,推薦不使用ATTR_ZERO標(biāo)志,因?yàn)檫@將避免清零步驟和減少一半閃時(shí)間。只有很少舊的閃存類型建議在重編程前進(jìn)行部件清零。大多數(shù)部件不要求這個(gè)操作。
3.3.3多閃存塊使用塊表以支持多設(shè)備閃和每個(gè)設(shè)備多塊。對于這種平臺(tái),ROM映象文件必須包含被編程的所有閃存部件的映象和塊表必須包含被閃的數(shù)據(jù)的每個(gè)塊的正確偏移和長度。
為了在每個(gè)閃存塊之前和之后正確配置平臺(tái),PHLASHNT.EXE將調(diào)用函數(shù)BeginFlash(Block_Index)以允許PLATFORM.DLL進(jìn)行任何這種設(shè)置。BeginFlash()和EndFlash()函數(shù)的任務(wù)是按照需要進(jìn)行塊間的任何初始化和終止。
3.3.4處理引導(dǎo)塊和ESCD存儲(chǔ)為了在一個(gè)閃存中編程一個(gè)存儲(chǔ)器區(qū)域,可能對相同的存儲(chǔ)器區(qū)域不得不有多個(gè)不同的塊描述符。這可能需要保護(hù)在單個(gè)“擦寫”存儲(chǔ)器區(qū)域中的引導(dǎo)塊或ESCD存儲(chǔ)器許多閃存部件有少量的寫操作作擦寫,每個(gè)存儲(chǔ)器塊一個(gè)(例如英特爾28F400閃存有7個(gè)塊(一個(gè)16K引導(dǎo)塊,兩個(gè)8K參數(shù)塊,一個(gè)64K主塊和3個(gè)128K擴(kuò)展塊)。這些部分只能用7個(gè)寫操作擦除。)對于其他部件,擦除功能可以一次擦除64K閃存,不論該范圍被分為引導(dǎo)和參數(shù)塊。在這種情況下,重要的是存儲(chǔ)器的每個(gè)64K塊有3個(gè)塊描述符。表中的第一個(gè)塊描述符用于保存引導(dǎo)塊,第二個(gè)塊描述符擦除和編程參數(shù)塊和第三個(gè)描述符在該范圍恢復(fù)引導(dǎo)塊。
一些部件要求在引導(dǎo)塊被編程前進(jìn)行附加的平臺(tái)相關(guān)動(dòng)作。例如英特爾部件要求VHH電壓,及VPP電壓被正確設(shè)置。在這種情況下,塊描述符必須在BeginFlash()和EndFlash()過程中有這種函數(shù)(在每個(gè)塊之前和之后調(diào)用)。
3.3.5塊表實(shí)例以下是PLATFORM.CPP的“blockTable”部分中的代碼。
擦除FC000處的4KB塊DD4*1024 ;4KBDD0 ;文件偏移DD000FC000h ;該塊的線性地址DB0 ;制造商ID(0=缺省)DB0 ;部件ID(0=缺省)DWATTR_ERASE ;動(dòng)作標(biāo)志清零,之后在指定部件在E000處編程128KB塊DD128*1024;128KBDD0 ;文件偏移
DD000FC000h;該塊的線性地址DB0;制造商ID(0=缺省)DB0;部件ID(0=缺省)DWATTR_ERASE ;動(dòng)作標(biāo)志3.4PLATFORM.DLL函數(shù)當(dāng)前支持的函數(shù)是包含在PLATFORM.DLL中的以下函數(shù)被PHLASHNT.EXE訪問以實(shí)現(xiàn)平臺(tái)相關(guān)功能EnableFlashDisableFlashBeginFlashEndFlashGetBlockCmdLineAutoSenseIsFlashableRebootCheckSum以下函數(shù)允許PHLASHNT.EXE訪問包含在PLATFORM.DLL中的全局變量和數(shù)據(jù)結(jié)構(gòu)GetBIOSFileSizeGetManufactIDGetPartIDGetFlagsGetImageBufGetMfgIDAddrGetPartIDAddrGetRetryCountGetblockTableSizeGetpartTyupesSize
GetBlockTableGetpartTypesGetDLLVersionGetROMFileNameGetDLLFuncDefine3.4.1函數(shù)EnableFlash()入口無返回錯(cuò)誤代碼(或零)該函數(shù)必須出現(xiàn)在PLATFORM.DLL中。在任何試圖訪問閃存前調(diào)用它。這個(gè)函數(shù)進(jìn)行的動(dòng)作包括映射閃存至存儲(chǔ)器禁止高速緩存,陰影和電源管理刷新高速緩存禁止PCI橋使能ROM以寫(VPP開)大多數(shù)平臺(tái)要求在部件被使能閃前改變一個(gè)跳接器。EnableFlash()過程必須確認(rèn)這個(gè)跳接器已被去除并返回一個(gè)錯(cuò)誤代碼,如果它確定該跳接器設(shè)置錯(cuò)誤。錯(cuò)誤代碼見附件B。
3.4.2函數(shù)DisableFlash()入口無返回錯(cuò)誤代碼(或0)該可選函數(shù)在最后一個(gè)塊被編程(或檢測到錯(cuò)誤)后被調(diào)用。在PHLASHNT.EXE退出前被立即調(diào)用(一般作為重引導(dǎo)前的最后一個(gè)函數(shù))。該函數(shù)一般進(jìn)行的動(dòng)作包括禁止ROM寫入(VPP關(guān))3.4.3函數(shù)BeginFlash(DWORD Block_Index)入口將被編程的塊的索引(或如果不使用表為0)退出無返回錯(cuò)誤代碼(或0)這個(gè)可選函數(shù)被PHLASHNT.EXE在該閃存塊被處理前立即被調(diào)用。它為(在塊表中找到的)每個(gè)塊調(diào)用。
該函數(shù)一般進(jìn)行的動(dòng)作包括在它被擦除前保存引導(dǎo)塊從一個(gè)設(shè)備轉(zhuǎn)換到另一個(gè)(在有多個(gè)設(shè)備的平臺(tái)上)使能VHH使引導(dǎo)塊重編程確定是否當(dāng)前塊被處理如果BeginFlash()返回非零,當(dāng)前塊不被處理。
3.4.4函數(shù)EndFlash(DWORD Block_Index)入口剛被編程的塊的索引(如果不使用表為零)返回錯(cuò)誤代碼(或零)這個(gè)可選函數(shù)被PHLASHNT.EXE在該閃存塊被處理后立即被調(diào)用。它為(在塊表中找到的)每個(gè)塊調(diào)用。
該函數(shù)一般進(jìn)行的動(dòng)作包括恢復(fù)由BeginFlash()函數(shù)保存的引導(dǎo)塊在編程兩個(gè)不同設(shè)備之間去除禁止VHH,如果引導(dǎo)塊剛剛被編程3.4.5函數(shù)GetBlock(DWORD Index,DWORD Buffer_Address)入口被拷貝塊的索引和64K緩沖區(qū)線性地址退出用現(xiàn)有的BIOS ROM映象的下一個(gè)塊填寫緩沖區(qū)返回負(fù)錯(cuò)誤代碼,零,或正塊索引當(dāng)/BACKUP標(biāo)志被指定時(shí),PHLASHNT.EXE調(diào)用可選函數(shù)。GetBlock()用于在閃存被改變之前保存閃存已有內(nèi)容。因?yàn)樵S多的BIOS映象被解壓縮至陰影RAM,PHLASHNT.EXE不是總可以訪問所有的BIOSROM映象而沒有平臺(tái)相關(guān)相同設(shè)置。函數(shù)GetBlock()需要允許平臺(tái)相關(guān)訪問已有的BIOS ROM映象。BIOS ROM映象被PHLASHNT.EXE保存,使用以下步驟1.調(diào)用GetBlock(Index,Buffer)而Index置為0和64K緩沖區(qū),由參數(shù)緩沖區(qū)指向,填入預(yù)定義方式。如果緩沖區(qū)的方式未被改變,程序帶錯(cuò)誤退出。如果方式被改變,方式被作為第一個(gè)64K塊存入BIOS.BAK文件。之后程序進(jìn)行到下一步。
2.調(diào)用GetBlock(Index,Buffer),Index置為前一個(gè)GetBlock()調(diào)用的返回值,保存64K緩沖區(qū)至BIOS.BAK和重復(fù)直至GetBlock()的返回值是非正數(shù)。
3.如果GetBlock()返回的最后一個(gè)值是零,則進(jìn)行存儲(chǔ)器閃。如果最后返回值是負(fù)錯(cuò)誤代碼,報(bào)告錯(cuò)誤,刪除BIOS.BAK并退出。
GetBlock()實(shí)現(xiàn)的任務(wù)是保證平臺(tái)處于正確狀態(tài)以允許GetBlock()拷貝BIOS ROM映象至緩沖區(qū)和在GetBlock()返回控制至PHLASHNT.EXE前平臺(tái)恢復(fù)至原來模式。特別是,GetBlock()在調(diào)用EnableFlash()前被調(diào)用。傳遞給GetBlock()的緩沖區(qū)指針總是在64K以下的真實(shí)存儲(chǔ)器范圍,允許直接傳遞至磁盤。
3.4.6函數(shù)CmdLine(char *szOptions)入口有平臺(tái)指定命令行選項(xiàng)的串指針返回錯(cuò)誤代碼(或0)該選項(xiàng)函數(shù)由PHLASHNT.EXE在PLATFORM.DLL被讀入后立即調(diào)用。包含所有的平臺(tái)指定命令行參數(shù)的字符串的地址被傳入(在等號(hào)后被指定/PLATFORM=”命令行選項(xiàng)”)。如果有的話字符串包括包括前和后雙引號(hào)。
3.4.7函數(shù)AutoSense()入口由PLATFORM。INI頭部取回的制造商和設(shè)備ID返回從閃存部件取回的新的ID(或0)這個(gè)函數(shù)被PHLASHNT.EXE在在PLATFORM.DLL中的EnableFlash()函數(shù)被調(diào)用后立即被調(diào)用。當(dāng)“非標(biāo)準(zhǔn)”存儲(chǔ)器組織被用于閃存時(shí),AutoSense()函數(shù)使能自動(dòng)檢測閃存部件。例如,當(dāng)兩個(gè)分開的部件被用于偶和奇BIOS地址(在這種情況下,傳統(tǒng)自動(dòng)檢測將失敗),該函數(shù)被用于獲得和確認(rèn)每個(gè)部件的ID。
ID是一字節(jié)長和被放入一個(gè)DWORD,制造商ID放入BYTE 0而設(shè)備ID放入BYTE 1。
3.4.8函數(shù)IsFlashable(char far *szErrorMsg)入口包含返回的錯(cuò)誤信息字符串的指針退出szErrorMsg包含錯(cuò)誤信息串返回錯(cuò)誤代碼(或0)該可選函數(shù)在EnableFlash()前調(diào)用確定是否可以進(jìn)行處理前被調(diào)用。
如果函數(shù)返回非零錯(cuò)誤代碼,字符串szErrorMsg被顯示并且程序終止。最多254加一個(gè)空終止符可以在szErrorMsg中返回。
如何使用它的一個(gè)例子是對于相同平臺(tái),OEM出售帶或不帶即插即用功能的系統(tǒng)。IsFlashable()函數(shù)能夠確定系統(tǒng)當(dāng)前是否是即插即用和在沒有它的系統(tǒng)中不閃即插即用BIOS。
3.4.8函數(shù)Reboot()入口無返回?zé)o這個(gè)可選函數(shù)在編程結(jié)束后被調(diào)用以復(fù)位系統(tǒng)。如果被提供,它被調(diào)用而代替PHLASHNT自己的重引導(dǎo)代碼。
3.4.10函數(shù)CheckSum()入口無返回錯(cuò)誤代碼(或0)在編程前調(diào)用這個(gè)可選函數(shù)確定BIOSROM允許的校驗(yàn)求和是否正確。一般,NuBIOS映象的BIOS ROM映象校驗(yàn)求和是零。當(dāng)已知ROM映象校驗(yàn)求和將不是零時(shí),這個(gè)例程可以用于提供另一種校驗(yàn)求和確認(rèn)方法。如果這個(gè)函數(shù)返回非零,PHLASHNT將終止。
3.4.11函數(shù)GetBIOSFileSize()入口無返回BIOS映象的大小該函數(shù)從PLATFORM.DLL中返回全局變量dwFileSize的內(nèi)容。
3.4.12函數(shù)GetManufactID()入口無返回制造商ID該函數(shù)從PLATFORM.DLL中返回全局變量bManufactID的內(nèi)容。
3.4.13函數(shù)GetPartID()入口無返回部件ID該函數(shù)從PLATFORM.DLL中返回全局變量bPartID的內(nèi)容。
3.4.14函數(shù)GetFlags()入口無返回選項(xiàng)標(biāo)志該函數(shù)從PLATFORM.DLL中返回全局變量dwFlags的內(nèi)容。
3.4.15函數(shù)GetImageBuf()入口無返回映象緩沖區(qū)的位置該函數(shù)從PLATFORM.DLL中返回全局變量dwImageBuf的內(nèi)容。
3.4.16函數(shù)GetMfgIDAddr()入口無返回制造商ID的地址該函數(shù)從PLATFORM.DLL中返回全局變量dwMfgIDAddr的內(nèi)容。
3.4.17函數(shù)GetPartIDAddr()入口無返回部件ID的地址該函數(shù)從PLATFORM.DLL中返回全局變量dwPartIDAddr的內(nèi)容。
3.4.18函數(shù)GetRetryCount()入口無返回閃失敗后重試的次數(shù)該函數(shù)從PLATFORM.DLL中返回全局變量bRetryCount的內(nèi)容。
3.4.19函數(shù)GetblockTableSize()入口無返回blockTable中塊的個(gè)數(shù)該函數(shù)從PLATFORM.DLL中返回全局變量bblockTableSize的內(nèi)容。
3.4.20函數(shù)GetpartTypesSize()入口無返回PLATFORM.DLL將描述的附加閃存部件的個(gè)數(shù)該函數(shù)從PLATFORM.DLL中返回全局變量bpartTypesSize的內(nèi)容。
3.4.21函數(shù)GetBlockTable()入口無返回blockTable的地址該函數(shù)從PLATFORM.DLL中返回全局結(jié)構(gòu)blockTable的地址。
3.4.22函數(shù)Getpar tTypes()入口無返回partTypes的地址該函數(shù)從PLATFORM.DLL中返回全局結(jié)構(gòu)partTypes的地址。
3.4.23函數(shù)GetDLLVersion()入口無返回PLATFORM.DLL的版本該函數(shù)從PLATFORM.DLL中返回全局變量szVersion的內(nèi)容。
3.4.24函數(shù)GetROMFileName()入口無返回BIOS ROM文件名該函數(shù)從PLATFORM.DLL中返回全局變量szROMFileName的內(nèi)容。
3.4.25函數(shù)GetDLLFuncDefine()入口無返回在PLATFORM.DLL中定義哪些平臺(tái)有關(guān)的函數(shù)該函數(shù)從PLATFORM.DLL中返回全局變量dwDLLFuncDefine的內(nèi)容。
4.0BIOS.ROM詳情ROM映象文件大小必須足夠大以容納被編程的閃存設(shè)備中的所有塊。任何BIOS映象所需的后處理,例如引導(dǎo)塊交換或數(shù)據(jù)壓縮,必須已包含在ROM映象文件中。
5.0一般實(shí)現(xiàn)指導(dǎo)使用微軟Visual C++ V4.2和其后版本開發(fā)。
因?yàn)檫@個(gè)程序是新的設(shè)備可用和代碼大小不是很重要,編碼的風(fēng)格應(yīng)使代碼可讀和清晰的重要程度高于可執(zhí)行代碼的的小型化。
但是,因?yàn)槌绦蛞灿糜诋a(chǎn)品環(huán)境,它應(yīng)當(dāng)使部件閃操作的時(shí)間最短。特別是,它應(yīng)當(dāng)盡可能使非關(guān)鍵性用戶界面提示可以被禁止;有可能的話,閃函數(shù)花費(fèi)的時(shí)間用匯編語言優(yōu)化。
附件B1-進(jìn)一步增強(qiáng)帶有鍵盤LED的完成代碼如果程序不能完成閃過程的三個(gè)主要階段的任一個(gè),程序?qū)⑹褂面I盤LED以通知用戶程序的哪個(gè)階段程序失敗。在程序開始時(shí)鍵盤上的CAPS_LOCK,NUM_LOCK和SCROLL_LOCK LED打開。三個(gè)階段的每個(gè)階段的失敗由以下指示鍵盤LED開 描述CAPS,NUM,SCROLL 在讀platform.dll前CAPS,NUM 在platform初始前NUM 在platform初始后無成功完成附件B2-PHLASHNT.H完成和錯(cuò)誤代碼FFh BIOS.BAK緩沖區(qū)存儲(chǔ)器分配失敗FEh BIOS.BAK已存在(重命名或刪除)FDh BIOS.BAK文件建立失敗FCh BIOS.BAK文件寫入失敗FBh BIOS.BAK文件關(guān)閉失敗FAh PLATFORM.DLL不支持BIOS備份F9h PLATFORM.DLL文件打開失敗F8h PLATFORM.DLL文件讀取失敗F7h PLATFORM.DLL文件關(guān)閉失敗F6h 不能在PLATFORM.DLL中定位字節(jié)位置F5h 不支持的PLATFORM.DLL文件版本F2h PLATFORM.DLL中的設(shè)備表有過多的項(xiàng)F1h PLATFORM.DLL中的設(shè)備表有不支持的閃存類型F0h 在PLATFORM.DLL中組合保存和恢復(fù)屬性EFh 保存塊而不匹配PLATFORM.DLL中的恢復(fù)塊ECh 在支持的部件表中未找到部件IDEBh PLATFORM.DLL在命令行參數(shù)中找到錯(cuò)誤Eah BIOS ROM映象分配錯(cuò)誤E9h 打開BIOS ROM映象文件錯(cuò)誤E8h 讀取BIOS ROM映象文件錯(cuò)誤E6h BIOS.ROM文件關(guān)閉錯(cuò)誤E4h 試圖讀閃存ID失敗E3h PLATFORM.DLL不能返回閃存IDE2h 在BIOS ROM文件映象中不能找到BCPSYS塊E1h 文件不包含相同的BIOS部件號(hào)E0h 文件不包含BIOS ROM映象的不同版本DFh 寫入閃存的數(shù)據(jù)與BIOSROM映象不匹配Deh 寫入閃存失敗DDh 擦除閃存塊失敗DCh VPP不在希望的范圍DBh 擦除序列失敗
Dah 新的DMI串過大D9h BIOS ROM文件可能不用于這個(gè)系統(tǒng)D8h 分配DMI OEM串失敗D7h 在BIOS ROM中沒有DMI OEM串的空間D6h DMI OEM串不支持(要求BCPDMI 0.1+)D5h 在BIOSROM文件映象中不能找到BCPDMI塊D3h BIOS ROM文件可能被破壞(校驗(yàn)求和不為零)D2h BIOS ROM文件大小與閃存部件大小不匹配D1h DMI系統(tǒng)和機(jī)箱串要求BCPDMI 2.1+
附件B3-PLATFORM.DLL示例源代碼PLATFORM.CPP/***題目PLATFORM.CPP-32位DLL用于PHLASHNT.EXE*的與平臺(tái)相關(guān)函數(shù)*版權(quán)所有 鳳凰技術(shù)公司 1997(C)*****************************************文件名PLATFORM.CPP*工程PLATFORM.EXE*功能塊*注釋變量dwDLLFuncDefine在PHLASHNT中用于確定*PLATFORM.DLL中確定了哪些與平臺(tái)有關(guān)函數(shù)。
*以下列出的是dwDLLFuncDefine可能的值和它們在模塊中定義*的函數(shù)* DLL_ENABLEFLASH EnableFlash* DLL_DISABLEFLASH DisableFlash* DLL_BEGINFLASHBeginFlash* DLL_ENDFLASH EndFlash* DLL_GETBLOCK GetBlock* DLL_CMDLINE CmdLine* DLL_AUTOSENSE AutoSense* DLL_ISFLASHABLE IsFlashable* DLL_REBOOTReboot* DLL_CHECKSUM ChectSum*內(nèi)容*****************************************版本控制信息* $Logk/nb/archive/nuttols/phlash.nt/stage2/drivers/platform.cpv$
* Rev 1.0*最初再版****************************************#include ″stdfx.h″#include<afxdllx.h>
#include<stdio.h>
#include″d\nutools\phlash.nt\stage2\phlashnt.h″#define PLATFORM_CPP//------------------//全局變量聲明//-----------------DWORD dwFileSize=0x00040000; //ROM映象文件大小BYTE bManufactID=0x89 //閃存設(shè)備制造商BYTE bPartID=0xBD //閃存設(shè)備部件IDDWORDdwFlags=FLAG_BIOSPARTNUM|FLAG_CHECKSUM|FLAG_IMAGESIZEDWORD dwImageBuf=0x00200000//映象緩沖區(qū)的線性地址DWORD dwMfgIDAddr=0xFFFE0000 //制造商ID的線性地址DWORD dwPartIDAddr=0xFFFE0001 //部件ID的線性地址BYTEbRetryCount=0 ///Rn選項(xiàng)的計(jì)數(shù)(缺省為零)CharszVersion[]=″NT 1.00″ //platform.d11版本CharszROMFileName[]=″BIOS.ROM″//BIOS映象文件名//指示PLATFORM.DLL中定義了哪些函數(shù)DWORD dwDLLFuncDefine=DLL_ENABLEFLASH |DLL_DISABLEFLASH |DLL_BEG INFLASH |DLL_ENDFLASH |DLL_GETBLOCK |DLL_CMDLINE |DLL_AUTOSENSE |DLL_ISFLASHABLE |
DLL_REBOOT |DLL_CHECKSUM//---------------------//定義blockTable//----------------------BYTE bblockTableSize=5 //blockTable中塊的個(gè)數(shù)BLOCK_DESCRIPTOR blockTable[]={{128*1024,//128KB(低)0,//文件偏移0xFFFE0000,//閃存ROM的線性地址0,//MfgID(與缺省相同)0,//PartID(與缺省相同)ATTR_ZERO},{128*1024,//128KB(高)0x00020000,//文件偏移0xFFFE0000,//閃存ROM的線性地址0,//MfgID(與缺省相同)0,//PartID(與缺省相同)ATTR_ZERO},{128*1024,//128KB(低)0,//文件偏移0xFFFE0000,//閃存ROM的線性地址0,//MfgID(與缺省相同)0,//PartID(與缺省相同)ATTR_ERASE
},{128*1024,//128KB(低)0,//文件偏移0xFFFE0000,//閃存ROM的線性地址0,//MfgID(與缺省相同)0,//Part ID(與缺省相同)ATTR_PROG},{128*1024,//128KB(高)0x00020000,//文件偏移0xFFFE0000,//閃存ROM的線性地址0, //MfgID(與缺省相同)0, //PartID(與缺省相同)ATTR_PROG},{ //將塊置為0以終止blockTable需要0,0,0,0,0,0},};//-------------------//定義partTypes//--------------------BYTE bpar tTypesSize=1 //平臺(tái)中閃存部件的個(gè)數(shù)//如果不使用partTypes則置為0DEVICETABLE partTypes[]=
{{0x89, //閃存設(shè)備制造商ID0Xbd//閃存設(shè)備設(shè)備ID1, //閃操作算法類型0, //忽略wPartSizeIntel 28F0202″//閃存設(shè)備名},{ //將塊置為0以終止parTypes需要0,0,0,0,″″},};HINSTANCEhKernel 32=0;//注意不要改變這行代碼。
/**************************函數(shù)********************************/*********************************函數(shù)名DllMain**描述*參數(shù)*返回**注意不要修改這個(gè)函數(shù)**********************
extern″C″int APIENTRYDllMain(HINSTANCE hInstance,DWORD dwReason,LPVOID lpReserved){if(dwReason==DLL_PROCESS_ATTACH){TRACE0(″PLATFORM.DLL Begin|\n″);HKernel 32=LoadLibrary(″Kernel32.d11″);//取得Kernel 32.d11的句柄}else if(dwReason==DLL_PROCESS_DETACH){TRACE0(″PLATFORM.DLL Terminating|\n″);If(HKernel 32)FreeLibrary(hKernel 32);;}return 1;//ok}//DllMain()/****************************函數(shù)名EnableFlash**描述*參數(shù)*返回**注意**********************DLL_FUNC_TYPE void EnableFlash(){printf(″EnableFlash\n″); //(s tub)}
/****************************函數(shù)名DisableFlash**描述*參數(shù)*返回**注意**********************DLL_FUNC_TYPE void DisableFlash(){printf(″DisableFlash\n″);//(stub)}/****************************函數(shù)名BeginFlash**描述*參數(shù)*返回**注意**********************DLL_FUNC_TYPE short BeginFlash(USHORT blockNumber){return 0;//(stub)}/****************************函數(shù)名EndFlash*
*描述*參數(shù)*返回**注意**********************DLL_FUNC_TYPE short EndFlash(USHORT blockNumber){return 0;//(stub)}/****************************函數(shù)名GetBlock**描述*參數(shù)*返回**注意**********************DLL_FUNC_TYPE SHORT GetBlock(ULONG dwIndex,F(xiàn)ULONG dwDst){printf(″GetBlock;dwIndex,dwDst passd in=%d,%d\n″,dwIndex,dwDst);//(stub)}/****************************函數(shù)名CmdLine**描述*參數(shù)*返回
**注意**********************DLL_FUNC_TYPE USHORT CmdLine(char *PlatformString){printf(″CmdLine\n″);//(stub)return(0);//(stub)}/****************************函數(shù)名AutoSense**描述*參數(shù)*返回**注意制造商ID在BYTE 0,設(shè)備ID在BYTE 1**********************DLL_FUNC_TYPE DWORD AutoSense(DWORD PartID){return (0x0000);//(stud)}/****************************函數(shù)名IsFlashable**描述*參數(shù)*返回**注意**********************
DLL_FUNC_TYPE USHORT IsFlashable(){printf(″IsFlashable\n″);//(stub)return 0;}/****************************函數(shù)名Reboot**描述*參數(shù)*返回**注意**********************DLL_FUNC_TYPE void Reboot(){printf(″Reboot\n″);//(stub)}/****************************函數(shù)名CheckSum**描述*參數(shù)*返回**注意**********************DLL_FUNC_TYPE void CheckSum(){printf(″CheckSum\n″);//(stub)
}//--------------------------//注意不要修改以下函數(shù)//----------------------------DLL_FUNC_TYPE DWORD GetBIOSFileSize(void){return(dwFileSize);}DLL_FUNC_TYPE BYTE GetManufactID(void){return(bManufactID);}DLL_FUNC_TYPE BYTE GetPartID(void){return(bPartID);}DLL_FUNC_TYPE DWORD GetFlags(void){return(dwFlags);}DLL_FUNC_TYPE DWORD GetImageBuf(void){return(dwImageBuf);}DLL_FUNC_TYPE DWORD GetMfgIDAddr(void){return(dwMfgIDAddr);}DLL_FUNC_TYPE DWORD GetPartIDAddr(void){return(dwPartIDAddr);}DLL_FUNC_TYPE BYTE GetRetryCount(void){return(bRetryCount);}DLL_FUNC_TYPE BYTE GetblockTableSize(void){return(bblockTableSize);}DLL_FUNC_TYPE BYTE GetpartTypesSize(void){return(bpartTable
);}DLL_FUNC_TYPE BLOCK_DESCRIPTOR *GetBlockTable(void){return(&blockTable[0”;}DLL_FUNC_TYPE DEVICETABLE*GetpartTable(void){return(&partTable
);}DLL_FUNC_TYPE char*GetDLLVersion(void){return(szVers ion);}DLL_FUNC_TYPE char*GetROMFileName(void){return(szROMFileName);}DLL_FUNC_TYPE DWORD GetDLLFuncDefine(void){return(dwDLLFuncDefine);}
附件C摘要本文件用于新的BIOS服務(wù),稱為BIOS32服務(wù)目錄。新的服務(wù)將提供有關(guān)BIOS服務(wù)的信息,它們用于在32位代碼段中運(yùn)行的調(diào)用者。
(BIOS32服務(wù)目錄自己是有關(guān)32位BIOS服務(wù))該服務(wù)的客戶是32位操作系統(tǒng)和32位設(shè)備驅(qū)動(dòng)程序。該服務(wù)的提供者是實(shí)現(xiàn)一個(gè)或多個(gè)32位BIOS服務(wù)的BIOS供應(yīng)商。
介紹BIOS32服務(wù)目錄建議是在為外圍部件互聯(lián)(PCI)標(biāo)準(zhǔn)建立32位代碼接口時(shí)出現(xiàn)的。要解決的主要問題是32位調(diào)用者如何確定32位BIOS服務(wù)的存在?功能接口的缺點(diǎn)(即,控制被轉(zhuǎn)移至的入口點(diǎn))在功能接口不存在的情況下是清楚的??苫謴?fù)方法似乎需要查找證明功能接口存在的簽名。實(shí)際上,第一BIOS32位服務(wù)之一,EISA,使用0F000h處的固定位置的現(xiàn)有簽名。但是,需要愈來愈多的BIOS服務(wù)和有愈來愈多的BIOS服務(wù),顯然給每個(gè)服務(wù)提供一個(gè)簽名(以及任何相關(guān)信息,例如每個(gè)的入口點(diǎn),段需求)對于緊張的存儲(chǔ)器資源是一個(gè)消耗。因此,BIOS32服務(wù)目錄后的思路是使用單一的簽名標(biāo)識(shí)一般32位服務(wù),它返回所有指定32位服務(wù)的信息。
實(shí)現(xiàn)一般方案的進(jìn)一步調(diào)整相對于繼續(xù)逐個(gè)解決問題的優(yōu)點(diǎn)是為工業(yè)提供標(biāo)準(zhǔn)。新的32位BIOS接口的代碼重用性,模塊化(“可插入”)實(shí)現(xiàn)等,通過調(diào)用環(huán)境需求標(biāo)準(zhǔn),是可以想象到的優(yōu)點(diǎn)。
BIOS32服務(wù)目錄有兩個(gè)部分頭部和調(diào)用接口。頭部是包含簽名和位于已知存儲(chǔ)器區(qū)域的靜態(tài)數(shù)據(jù)結(jié)構(gòu)。有效頭部的存在表示調(diào)用接口的存在和實(shí)際上,描述它的入口點(diǎn)。調(diào)用接口是代碼體和在由頭部和任何特定32位BIOS服務(wù)分開的分立存儲(chǔ)器空間中存在的數(shù)據(jù)。它提供了功能性接口,提供它調(diào)用者接收特定32位BIOS服務(wù)的信息。(部分0描述頭部的假設(shè)存儲(chǔ)器映象,調(diào)用接口,和32位BIOS服務(wù)的“XYZ”)。調(diào)用接口設(shè)計(jì)可以在二維擴(kuò)展。第一,它是基于函數(shù)的接口,進(jìn)一步更新服務(wù)可以加入新的功能,如果需要的話。第二,特定32位BIOS服務(wù)由4字節(jié)部件ID表示。這使OS調(diào)用者和BIOS32服務(wù)目錄實(shí)現(xiàn)器兩者相似從而在有新的32位BIOS服務(wù)時(shí)容易增加。
BIOS32服務(wù)目錄接口,和示例綜述2BIOS 32服務(wù)目錄頭部實(shí)現(xiàn)BIOS32服務(wù)目錄的BIOS必須嵌入物理存儲(chǔ)器范圍0E0000h-0FFFFFh中某處特定的連續(xù)16字節(jié)方式。該方式必須分段對準(zhǔn)(即,它必須從16字節(jié)邊界開始)。該方式已知為在BIOS32服務(wù)目錄頭部中。
頭部包括6個(gè)分立的字段。下表描述每個(gè)字段。
表1BIOS 32服務(wù)目錄頭部BIOS32服務(wù)目錄的客戶必須首先通過定位頭部而確定它的存在。這是通過以段為增量掃描0E0000h至0FFF0h在每段的前4個(gè)字節(jié)查找簽名匹配(“_32_”)而實(shí)現(xiàn)。當(dāng),和如果,檢測到簽名,客戶應(yīng)進(jìn)行頭部所有字節(jié)的校驗(yàn)求和。(段中頭部長度在偏移9h中找到。)頭部的所有字節(jié)相加到一起應(yīng)為0h。如果校驗(yàn)求和有效,則32位入口點(diǎn)字段可以用作BIOS服務(wù)目錄調(diào)用接口的地址。如果頭部未找到,則BIOS32服務(wù)目錄在平臺(tái)中不存在。
3 BIOS 32服務(wù)目錄調(diào)用接口如果已經(jīng)確定BIOS32服務(wù)目錄存在(通過以上的頭部檢測),則在頭部中找到的32位物理地址作為調(diào)用接口的入口點(diǎn)??蛻魬?yīng)CALL FAR至該地址??蛻舻恼{(diào)用環(huán)境有以下要求3.1代碼段
CS代碼段選擇器必須設(shè)置為有以下值的段描述符*基地址必須小于或等于包含入口點(diǎn)的頁的(4KB)頁地址。例如,如果入口點(diǎn)是0FFF81234H,則基地址必須小于或等于0FFF81000h。
*該范圍必須使基地址加該范圍生成一個(gè)地址大于或等于包含入口點(diǎn)的頁之后的頁的最后地址。例如,如果入口點(diǎn)是0FFF81234H則基地址加范圍必須大于或等于0FFF82FFFH。
*簡而言之,基地址和范圍必須“包圍”包含入口點(diǎn)的頁和隨后頁。
*段類型必須是100b(代碼,只能可執(zhí)行)或101b(代碼,可執(zhí)行/讀)。
但是,服務(wù)目錄的實(shí)現(xiàn)不能假設(shè)CS代碼段的讀訪問。
*系統(tǒng)位必須是1(非系統(tǒng)段)。
*推薦描述符專用級(jí)(DPL)為0。(CS描述符DPL成為當(dāng)前專用級(jí),或CPL)。如果CPL是非0,則OS必須提供環(huán)0專用指令(例如訪問CRx)的捕獲和虛擬服務(wù)。還請注意該字段的依賴于EFLAGS中IOPL字段(見段0)。
*缺省大小位必須為1(32位)。
BIOS 32服務(wù)目錄入口點(diǎn)和它相關(guān)的代碼和數(shù)據(jù)可位于4GB物理地址空間的任何位置。但是,必須保證物理連續(xù)(即,它被送入ROM或閃存空間)和可以放入兩頁(即,它不跨越3頁)。
3.2數(shù)據(jù)段DS數(shù)據(jù)段選擇器必須設(shè)置有以下值的段描述符*基地址必須等于CS基地址。
*范圍必須大于或等于CS范圍。
*段類型必須是000b(數(shù)據(jù),只讀)或001(數(shù)據(jù),讀/寫)。但是,服務(wù)目錄的實(shí)現(xiàn)不能假設(shè)DS數(shù)據(jù)段的寫訪問。
*系統(tǒng)位必須為1(非系統(tǒng)段)。
*描述符專用級(jí)(DPL)必須大于或等于CPL(見段0 DPL字段)。
對于ES,F(xiàn)S和GS數(shù)據(jù)段選擇器沒有要求。
3.3堆棧段SS堆棧段選擇器必須設(shè)置有以下值的段描述符*段類型必須是011b(數(shù)據(jù),讀/寫,向下擴(kuò)展)或001b數(shù)據(jù),讀/寫,向上擴(kuò)展)。
*系統(tǒng)位必須為1(非系統(tǒng)段)。
*描述符專用級(jí)(DPL)等于CPL(見段0 DPL字段)。
*缺省大小位必須是1(32位)。
*間隔位必須是1(4KB)。
注意以上設(shè)置保證堆棧大小至少4kb。保證至少有1kb未使用堆棧是調(diào)用者的責(zé)任。
3.4分頁分頁可以或不使能。如果paging使能,由CS和DS選擇器描述的地址空間必須是線性連續(xù)。即,在ROM或FLASH中找到的調(diào)用接口的原始物理連續(xù)性必須保持。(調(diào)用接口代碼和數(shù)據(jù)被與位置無關(guān)和EIP相關(guān)寫入)。
3.5IOPL為使調(diào)用接口執(zhí)行I/O指令,EFLAGS中的I/O專用級(jí)(IOPL)字段必須大于或等于CPL(見段0中DPL字段)。
BIOS32服務(wù)目錄調(diào)用接口是基于函數(shù)的和所有參數(shù)在寄存器中被傳遞。如果寄存器未被指定作為函數(shù)的輸出參數(shù),則它被保留。所有的標(biāo)志被保留。函數(shù)值在寄存器BL中作為輸入?yún)?shù)被傳遞。返回狀態(tài)被傳遞回寄存器AL。返回狀態(tài)00h表示函數(shù)成功。返回狀態(tài)80h表示不支持所要求的函數(shù)(在BL)。其它AL返回值有單個(gè)函數(shù)定義。當(dāng)前定義了一個(gè)BIOS32服務(wù)目錄函數(shù)。它在以下說明。
3.6部件存在函數(shù)(BL=0h)部件存在函數(shù)返回指定的32位BIOS范圍存在的信息和,如果存在,占據(jù)了哪個(gè)存儲(chǔ)器空間。
輸入BL,0hEAX,部件ID部件ID是4字節(jié)ASCII串,唯一標(biāo)識(shí)32位BIOS范圍。特定的BIOS范圍標(biāo)準(zhǔn)定義自己的部件ID。(這些標(biāo)準(zhǔn)定義部件ID是左至右或右至左打包是很重要的。)EBX,保留,置為0h輸出如果被請求的32位服務(wù)不存在AL=81h
如果被請求的32位服務(wù)存在AL=0hEBX=32位BIOS服務(wù)基地址ECX=32位BIOS服務(wù)長度EDX=32位BIOS服務(wù)入口點(diǎn)偏移(從EBX)EBX,ECX和EDX寄存器的含義與特定的32位BIOS服務(wù)標(biāo)準(zhǔn)有關(guān)。即,它們表示建立段選擇器的精確值,最小“包圍”值等。
3.7將來的函數(shù)將來的BIOS服務(wù)目錄函數(shù)可以在本文件以后的再版中定義。函數(shù)參數(shù)接口不限于寄存器傳遞和可以采用堆棧上的輸入/輸出參數(shù)。由于堆棧的靜態(tài)定義,使它很靈活(見部分0)。
4總結(jié)本文件描述了BIOS32服務(wù)目錄。它識(shí)別兩個(gè)不同的存儲(chǔ)器部件頭部和調(diào)用接口。頭部是一個(gè)簽名數(shù)據(jù)段,位于存儲(chǔ)器范圍0E0000h-0FFFFFh。調(diào)用接口是4GB地址空間中任何位置的物理連續(xù)段的代碼體,并且長度小于兩頁(8kb)。頭部包含指向調(diào)用接口存儲(chǔ)器區(qū)域的指針。BIOS32服務(wù)目錄調(diào)用接口函數(shù)描述附加的存儲(chǔ)器區(qū)域,包含特定32位BIOS范圍的代碼和數(shù)據(jù)。后面是假定頭部的存儲(chǔ)器映象,調(diào)用接口和“XYZ”32位BIOS范圍。
- 4Gb3----------------------------------------------------------------------------------------33 BIOS32 Servies Directary 3ffffffff ·3Calling Interface 3 ·3Code/Data 3<fffff> ·3----------------------------------------------------------------------------------------3 ··33 ··.. ··.. ··.. ··33 ··33 ··33 1Mb ··33 ··3----------------------------------------------------------------------------------------3 ··3 BIOS32 Service Directory 3 fffff% ·3 Leader 3 ·3----------------------------------------------------------------------------------------3 ·33 ·3----------------------------------------------------------------------------------------3 ·3 ″XYZ″32-bit BIOS Service 3 ·3 Code/Data 3<ffffffff>%3----------------------------------------------------------------------------------------333 E0000h33..
..
..
33 0000h本文件提供了訪問32位BIOS服務(wù)的標(biāo)準(zhǔn)方法。由于32位BIOS服務(wù)被認(rèn)可和實(shí)現(xiàn),可以方便地使用BIOS32服務(wù)目錄調(diào)用接口來提高標(biāo)準(zhǔn)方法。
#ifdef TESTEXEC//測試bios執(zhí)行函數(shù)printf(″phadtest-test bios execution breakpoint\n″) ;ioExec=(PIOC_EXEC1) systemBuffer;ioExec->biosFunction=biosShadowAreaBaseVA+biosServiceDirectoryVA;strncpy((PUCHAR)(&ioExec->regEAX),BIOS_PM_SIGNATURE,,4);ioExec->regEBX=OL;if(DeviceIoControl(hDriver,IOCTL_BIOS_EXEC,bufferPtr,256,bufferPtr,256,&actualXfr,NULL)) {printf(″IOCTL 2052-BIOS Execute(%s)-success\n″,BIOS_PM_SIGNATURE);printf(″#bytes returned%Ld\n″,actuaLXfr);printf(″Register contents\n″);printf(″AL=%X\n″,(ioExec->regEAX )&0xff);printf(″EBX=%LX\n″,ioExec->regEBX);printf(″ECX=%LX\n″,ioExec->regECX);printf(″EDX=%LX\n″,ioExec->regEDX);}else{ioCode=GetLastError();printf(″IOCTL 2050 failed on %LX\n″,ioCode);}#endif附件D1
//--------------------------------------------------------------------------case IOCTL_BIOS_EXEC#ifdef DEBUGMZMzIokdPrint(4);#endif//函數(shù)4=代碼2052是′BIOS執(zhí)行′//該函數(shù)執(zhí)行陰影區(qū)中的代碼ioExecbios=(PIOC_EXEC1)(Irp->AssceiscedIrp.SystemBuffer);if(foundBios32==FALSE)·(//如果bios32未在其中找到ioExecBios->runStat=FALSE; //不運(yùn)行return (IoCtlFinish(Irp,STATUS_SUCCESS,sizeof(IOC_EXEC1)));}//check the range of the requested function.
actualXfrd=rangecheck(ioExecBios->biosFunction,//函數(shù)地址1L, //只在e.p.中查找MODI_SHADOW, //讀/執(zhí)行模式BIOSlenBiosRom //ROM空間的長度};//范圍檢查失敗if(actualxfrd==0) (return(IoCtlFinish(Irp,STATUS_ACCESS_DENIED,sizeof(Ioc_EXECI)));}//現(xiàn)在執(zhí)行函數(shù)if((ioExecBios->biosFunction)==((ULCNG)bios32ServiceEntryPoint+(ULONG)romMapPtr)connectBios(ioExecBios,ioExecBios->biosFunction);elseexecBios(ioExecBios,ioExecBios->biosFunction);ioExecBios->runStat=1;return(IoCtlFinish(Irp,STATUS_SUCCESS,sizeof(IOC_EXEC1)));//不要忘記返回執(zhí)行結(jié)構(gòu)//-------------------------------------------------------------------附件D2
//這個(gè)函數(shù)建立寄存器文本和調(diào)用入口點(diǎn)voidexecBios{PIOC_EXEC1 systembuffer,ULCNG entrypoint}{#ifdef BIOS_FAR_CALLvoid(far″address32)(PIOC_EXEC1);#elsevoid(″address32)(PIOC_EXEC1);#endif″address32=(void (*) (PIOC_EXEC1)) entrypoint;_asm{mov eax,(systembuffar)//systembuffer的指針pusheaxpushes //用FAR調(diào)用call(address32)//調(diào)用服務(wù)目錄}//(″address32)(systembuffer),//這是服務(wù)接口}附件D權(quán)利要求
1.一種安全利用基本輸入輸出系統(tǒng)(BIOS)服務(wù)的系統(tǒng),包括訪問驅(qū)動(dòng)程序,產(chǎn)生利用BIOS服務(wù)的服務(wù)請求,服務(wù)請求包括利用密鑰對中的專用密鑰建立的服務(wù)請求簽名;以及接口,利用密鑰對中共用密鑰校驗(yàn)服務(wù)請求簽名以保證服務(wù)請求完整性。
2.根據(jù)權(quán)利要求1的系統(tǒng),其中訪問驅(qū)動(dòng)程序產(chǎn)生會(huì)話請求以與接口建立會(huì)話;以及會(huì)話請求包括利用密鑰對中專用密鑰建立的會(huì)話請求簽名。
3.根據(jù)權(quán)利要求1的系統(tǒng),其中訪問驅(qū)動(dòng)程序產(chǎn)生會(huì)話請求以結(jié)束與接口的會(huì)話;以及會(huì)話請求包括利用密鑰對中專用密鑰建立的會(huì)話請求簽名。
4.根據(jù)權(quán)利要求1的系統(tǒng),其中接口產(chǎn)生權(quán)限證書并在接收會(huì)話請求之后將權(quán)限證書發(fā)送到訪問驅(qū)動(dòng)程序;以及訪問驅(qū)動(dòng)程序利用包括在權(quán)限證書中的信息產(chǎn)生后續(xù)會(huì)話請求。
5.根據(jù)權(quán)利要求4的系統(tǒng),其中權(quán)限證書包括新的共用密鑰。
6.根據(jù)權(quán)利要求4的系統(tǒng),其中權(quán)限證書包括新的專用密鑰。
7.根據(jù)權(quán)利要求4的系統(tǒng),其中權(quán)限證書包括證書簽名。
8.根據(jù)權(quán)利要求1的系統(tǒng),其中接口產(chǎn)生權(quán)限證書并在接收服務(wù)請求之后將權(quán)限證書發(fā)送到訪問驅(qū)動(dòng)程序;以及訪問驅(qū)動(dòng)程序利用權(quán)限證書中的信息產(chǎn)生后續(xù)服務(wù)請求。
9.一種安全調(diào)用基本輸入輸出系統(tǒng)(BIOS)服務(wù)的方法,包括產(chǎn)生調(diào)用BIOS服務(wù)的服務(wù)請求;利用密鑰對中的專用密鑰產(chǎn)生的服務(wù)請求簽名簽署服務(wù)請求;以及利用密鑰對中共用密鑰校驗(yàn)服務(wù)請求簽名以保證服務(wù)請求完整性。
10.根據(jù)權(quán)利要求9的方法,還包括在處理服務(wù)請求之后產(chǎn)生包括新的專用密鑰和新的共用密鑰的權(quán)限證書;以利用新的專用密鑰產(chǎn)生的服務(wù)請求簽名簽署后續(xù)服務(wù)請求;以及用新的共用密鑰校驗(yàn)后續(xù)服務(wù)請求的服務(wù)請求簽名。
11.根據(jù)權(quán)利要求9的方法,還包括執(zhí)行由包含在服務(wù)請求中的服務(wù)操作碼表示的BIOS服務(wù)程序。
12.根據(jù)權(quán)利要求9的方法,還包括產(chǎn)生會(huì)話請求以建立與ROM應(yīng)用程序接口(RAPI)的會(huì)話;以利用密鑰對中專用密鑰產(chǎn)生的會(huì)話請求簽名簽署會(huì)話請求;以及用密鑰對中的共用密鑰校驗(yàn)會(huì)話請求簽名以保證會(huì)話請求的完整性。
13.根據(jù)權(quán)利要求12的方法,還包括在處理會(huì)話請求之后產(chǎn)生包括新的專用密鑰和新的共用密鑰的權(quán)限證書;以利用新的專用密鑰產(chǎn)生的會(huì)話請求簽名簽署后續(xù)會(huì)話請求;以及用新的共用密鑰校驗(yàn)后續(xù)會(huì)話請求的會(huì)話請求簽名。
14.根據(jù)權(quán)利要求9的方法,還包括產(chǎn)生會(huì)話請求以結(jié)束與ROM應(yīng)用程序接口(RAPI)的會(huì)話;以利用密鑰對中專用密鑰產(chǎn)生的會(huì)話請求簽名簽署會(huì)話請求;以及用密鑰對中的共用密鑰校驗(yàn)會(huì)話請求簽名以保證會(huì)話請求的完整性。
15.一種包含在計(jì)算機(jī)可讀介質(zhì)上以安全利用基本輸入輸出系統(tǒng)(BIOS)服務(wù)的計(jì)算機(jī)程序,包括訪問驅(qū)動(dòng)程序,產(chǎn)生利用BIOS服務(wù)的服務(wù)請求,服務(wù)請求包括利用密鑰對中專用密鑰建立的服務(wù)請求簽名;以及接口,利用密鑰對中共用密鑰校驗(yàn)服務(wù)請求簽名以保證服務(wù)請求完整性。
16.一種包含在數(shù)據(jù)流中的計(jì)算機(jī)數(shù)據(jù)信號(hào),包括訪問驅(qū)動(dòng)程序,產(chǎn)生利用BIOS服務(wù)的服務(wù)請求,服務(wù)請求包括利用密鑰對中專用密鑰建立的服務(wù)請求簽名;以及接口,利用密鑰對中共用密鑰校驗(yàn)服務(wù)請求簽名以保證服務(wù)請求完整性。
全文摘要
本發(fā)明的系統(tǒng)包括存儲(chǔ)器,存儲(chǔ)處理基于處理器的系統(tǒng)的指令序列,存儲(chǔ)器包括物理存儲(chǔ)器和虛擬存儲(chǔ)器。系統(tǒng)還包括執(zhí)行所存儲(chǔ)的指令序列的處理器。所存儲(chǔ)的指令序列包括以下處理步驟使處理器將多個(gè)預(yù)定指令序列從物理存儲(chǔ)器映射到虛擬存儲(chǔ)器;在虛擬存儲(chǔ)器中確定對所述多個(gè)預(yù)定指令序列其中之一的補(bǔ)償;接收指令以執(zhí)行所述多個(gè)預(yù)定指令序列其中之一;傳送控制至所述多個(gè)指令序列其中之一傳送控制;以及從虛擬存儲(chǔ)器處理所述多個(gè)指令序列其中之一。
文檔編號(hào)G06F12/14GK1690911SQ200510064880
公開日2005年11月2日 申請日期2000年6月18日 優(yōu)先權(quán)日1999年6月18日
發(fā)明者L·J·加拉索, M·E·茲爾默, Q·范 申請人:鳳凰技術(shù)有限公司