專利名稱::安全使用基本輸入輸出系統(tǒng)服務(wù)的系統(tǒng)和方法本申請是申請日為1997年10月9日的美國專利申請No.08/947,990的系列申請。本發(fā)明涉及安全使用基本輸入輸出系統(tǒng)(BIOS)服務(wù)的系統(tǒng)和方法。在虛擬存儲器子系統(tǒng)中,采用“虛擬”存儲器尋址方法,在該方法中,軟件程序中利用的存儲器地址間接映射到物理存儲器的存儲單元上。翻譯成物理地址一般由處理器完成,這種物理地址不能訪問用戶模式軟件和基本輸入/輸出系統(tǒng)(BIOS)。這種虛擬存儲器子系統(tǒng)的一個例子是由WindowsNT使用、由微軟公司生產(chǎn)和銷售的子系統(tǒng)。尤其是,WindowsNT包含了請求分頁式虛擬存儲器子系統(tǒng)。為在WindowsNT操作系統(tǒng)上運(yùn)行的程序所提供的存儲器地址空間被保護(hù)以防止其他用戶模式程序,正如其他程序也受到保護(hù)一樣。這保證了用戶模式服務(wù)程序和應(yīng)用程序不覆蓋彼此的存儲器或者執(zhí)行彼此的指令。核心模式服務(wù)程序和應(yīng)用程序以類似的方式受到保護(hù)。如果出現(xiàn)試圖訪問程序指定的虛擬空間之外的存儲器的情況,則終止程序并通知用戶。虛擬存儲器子系統(tǒng)還防止以用戶模式軟件直接訪問物理存儲器地址和作為計算機(jī)一部分的輸入/輸出設(shè)備。目前的趨勢日益朝著使用能用虛擬存儲器子系統(tǒng)執(zhí)行操作系統(tǒng)的計算機(jī)系統(tǒng)上的輸入/輸出設(shè)備方向發(fā)展。在這些系統(tǒng)中,沒有訪問程序虛擬存儲空間之外的存儲器的裝置,例如BIOS功能。解決這種問題的一個方法是為設(shè)備安裝讀包含指令的文件的設(shè)備驅(qū)動程序。驅(qū)動程序讀出文件并將這些指令寫(或下載)到設(shè)備存儲器中。但是,這種類型的設(shè)備驅(qū)動程序僅具有存儲器和輸入/輸出操作的有限尋址能力。此外,它不允許執(zhí)行物理存儲空間中的系統(tǒng)處理器指令。因此,在技術(shù)上需要一種通過虛擬存儲器子系統(tǒng)訪問和執(zhí)行物理存儲器內(nèi)容的系統(tǒng)和方法,以便于提高存儲器和輸入/輸出操作的尋址能力和允許直接通過物理存儲器執(zhí)行處理器指令。而且,能更新或配置存儲在計算機(jī)系統(tǒng)或平臺上的數(shù)據(jù)。在特定情況下,數(shù)據(jù)是十分敏感的??膳渲玫拿舾袛?shù)據(jù)(sensitivedata)的一個好例子是計算機(jī)系統(tǒng)的基本輸入輸出系統(tǒng)(BIOS)。通常存儲在某種非易失性存儲器中,BIOS是機(jī)器代碼,通常是操作系統(tǒng)(OS)的一部分,它使中央處理單元(CPU)能完成各種任務(wù),例如初始化、診斷、從大容量存儲器裝載操作系統(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ā)明提供了一種安全利用基本輸入輸出系統(tǒng)(BIOS)服務(wù)的系統(tǒng)和方法。根據(jù)本發(fā)明的一個方面,系統(tǒng)包括存儲指令序列的存儲器,通過指令序列處理基于處理器的系統(tǒng),其中存儲器包括物理存儲器和虛擬存儲器。系統(tǒng)還包括執(zhí)行所存儲的指令序列的處理器。存儲的指令序列包括的過程使處理器將多個預(yù)定指令從物理存儲器映射到虛擬存儲器中,確定對虛擬存儲器中多個預(yù)定指令序列之一的補(bǔ)償,接收指令執(zhí)行多個預(yù)定指令序列其中之一,將控制傳送到多個預(yù)定指令序列其中之一,以及處理來自虛擬存儲器的多個預(yù)定指令序列其中之一。系統(tǒng)的另一個方面包括訪問驅(qū)動程序產(chǎn)生使用BIOS服務(wù)的服務(wù)請求,使得服務(wù)請求包含用密鑰對中的密鑰建立的服務(wù)請求簽名。系統(tǒng)還包括校驗(yàn)使用密鑰對中的公開密鑰的服務(wù)請求簽名的接口以保證服務(wù)請求的安全性。圖1是信息分配系統(tǒng)的一個實(shí)施例的系統(tǒng)方框圖,其中使用了本發(fā)明的方法。圖2示出了實(shí)現(xiàn)本發(fā)明實(shí)施例的一個示范性處理器系統(tǒng)或用戶計算機(jī)系統(tǒng)。圖3示出了圖2計算機(jī)系統(tǒng)的一個實(shí)施例圖,其中使用了本發(fā)明的系統(tǒng)和方法。圖4示出了利用本發(fā)明系統(tǒng)和方法的操作系統(tǒng)結(jié)構(gòu)的全功能框圖。圖5是方框圖,示出了根據(jù)本發(fā)明原理提供的訪問驅(qū)動程序46初始化過程。圖6A示出了本發(fā)明初始化過程的一個實(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)的另一個全功能框圖。圖9示出了根據(jù)本發(fā)明一個實(shí)施例的兩個系統(tǒng)組件之間的交互序列的序列。圖10略述了根據(jù)本發(fā)明一個實(shí)施例的會話請求的產(chǎn)生。圖11示出了根據(jù)本發(fā)明一個實(shí)施例的權(quán)限證明。圖12示出了根據(jù)本發(fā)明一個實(shí)施例的會話請求。圖13示出了根據(jù)本發(fā)明一個實(shí)施例的服務(wù)請求。圖14略述了根據(jù)本發(fā)明一個實(shí)施例請求建立工作會話的條款(acts)。圖15略述了根據(jù)本發(fā)明一個實(shí)施例的服務(wù)請求的產(chǎn)生。圖16示出了根據(jù)本發(fā)明一個實(shí)施例處理服務(wù)請求中所需的條款。圖17示出了根據(jù)本發(fā)明個實(shí)施例涉及終止當(dāng)前工作會話的條款。圖18示出了根據(jù)本發(fā)明實(shí)施例產(chǎn)生權(quán)限證明的過程。定義正如本文所討論的,“計算機(jī)系統(tǒng)”是一個包括能處理數(shù)據(jù)的電路的產(chǎn)品。計算機(jī)系統(tǒng)可以包括但不限于以下產(chǎn)品通用計算機(jī)系統(tǒng)(例如服務(wù)器、便攜式電腦、臺式電腦、掌上電腦、個人電子設(shè)備等)、個人計算機(jī)(PC)、硬拷貝設(shè)備(例如打印機(jī)、繪圖儀、傳真機(jī)等)、銀行設(shè)備(例如自動取款機(jī))以及類似產(chǎn)品。信息介質(zhì)是提供代表貨物和服務(wù)的生產(chǎn)商信息的WEB站點(diǎn),為供應(yīng)者和其他商業(yè)所提供的產(chǎn)品和/或服務(wù)交易提供相應(yīng)的信息。內(nèi)容指應(yīng)用程序、驅(qū)動程序、實(shí)用程序、文件、有效負(fù)載等以及其中一些的組合,也指圖形、信息材料(文章、股票報價(stockquotes)等)以及類似物,既可以是單一的也可以是任何一種組合。另外,“通信鏈接”指通信的媒體或通道。通信鏈接可以包括、但不限于電話線、調(diào)制解調(diào)器連接、Internet連接、綜合業(yè)務(wù)數(shù)字網(wǎng)(ISDN)連接、異步轉(zhuǎn)移模式(ATM)連接、幀中斷連接、以太網(wǎng)連接、同軸連接、光纖連接、衛(wèi)星連接(例如數(shù)字衛(wèi)星服務(wù)等)、無線連接、無線電頻率(RF)鏈接、電動鏈接、雙向傳呼連接等,以及這些連接的組合。加電自檢(POST)指在裝入OS前執(zhí)行配置和檢測系統(tǒng)硬件的指令。系統(tǒng)綜述下面描述的是對結(jié)合本發(fā)明實(shí)施例的示例性系統(tǒng)的說明。圖1示出了信息分配系統(tǒng)10的一個實(shí)施例的系統(tǒng)方框圖,其中使用了本發(fā)明的設(shè)備和方法。系統(tǒng)10涉及提供信息介質(zhì)。它包括安全的構(gòu)建和維護(hù)、Internet用戶的私人知識庫以及系統(tǒng)性狀,主要通過保證書服務(wù)注冊、Internet服務(wù)注冊,系統(tǒng)性狀以及用戶選擇來收集。最初,該信息被用來由所購硬件和軟件產(chǎn)品的制造商、以及在線或其它服務(wù)的提供者對用戶進(jìn)行注冊。隨著時間的推移,利用用戶數(shù)據(jù)建立用戶性狀或通知用戶有關(guān)軟件的更新和升級,從而鼓勵在線購買相關(guān)產(chǎn)品以及使一對一交易和其它服務(wù)成為可能。在一個實(shí)施例中,使用兩個軟件模塊實(shí)現(xiàn)本發(fā)明的不同實(shí)施例。一個常駐用戶系統(tǒng),用來訪問預(yù)定WEB站點(diǎn)。例如,在一個實(shí)施例中,操作系統(tǒng)及基本輸入輸出系統(tǒng)(BIOS)預(yù)裝在計算機(jī)系統(tǒng)內(nèi),當(dāng)計算機(jī)系統(tǒng)隨后被首次加電時,為便于討論,將應(yīng)用程序稱為第一軟件模塊(在一個實(shí)施例中,第一軟件模塊為初始啟動應(yīng)用程序(ISUA),這將在以下加以討論),該應(yīng)用程序允許在預(yù)引導(dǎo)環(huán)境下啟動一個或多個可執(zhí)行程序。在一個實(shí)施例中,第一軟件模塊便于在OS裝入、引導(dǎo)、執(zhí)行和/或運(yùn)行之前啟動一個或多個可執(zhí)行程序。在一個實(shí)施例中,鼓勵用戶選擇使用這樣的程序(例如使用第一軟件模塊),在另一個實(shí)施例中,自動啟動該程序。包含在第一軟件模塊中的程序可作為在適當(dāng)時間運(yùn)行的工具和效用,通過正確的用戶授權(quán),也允許用戶通過連接到PC上的Internet下載包括驅(qū)動程序、應(yīng)用程序以及附加文件或有效負(fù)載的第二軟件模塊。如果OS不能成功啟動,這些程序也可用來提供系統(tǒng)的遙控管理。一旦第二軟件模塊被發(fā)送,它就變成存儲駐留,并不能傳送第一軟件模塊的拷貝。在第二軟件模塊不能運(yùn)行并變得不可靠或被刪除前,一旦最初的第一軟件模塊如上所述被再次傳送,仍駐留在系統(tǒng)非易失性存儲器中的第一軟件模塊的原始拷貝保持空閑。第二軟件模塊可包括將用戶連接到Internet上的特殊服務(wù)器的應(yīng)用程序,以及指導(dǎo)用戶至預(yù)定WEB站點(diǎn)查找授權(quán)以下載更多的預(yù)約材料。第二軟件模塊也可以包括與第一軟件模塊內(nèi)容相同或機(jī)似的內(nèi)容。在一個實(shí)施例中,系統(tǒng)也可以包括存儲在只讀存儲器BIOS(ROMBIOS)中的初始有效負(fù)載。在一個實(shí)施例中,初始有效負(fù)載是第一軟件模塊(例如ISUA)的一部分。在另一個實(shí)施例中,初始有效負(fù)載作為模塊存儲在ROMBIOS中,且與第一軟件模塊分開。在一個實(shí)施例中,在加電自檢(POST)之后但在引導(dǎo)、裝入和/或執(zhí)行OS之前,從ROMBIOS啟動初始有效負(fù)載并在屏幕上顯示出來。這可以發(fā)生在預(yù)定時間內(nèi),例如當(dāng)建立、裝配和檢測系統(tǒng)時,或當(dāng)最終用戶首次激活系統(tǒng)時。在另一個實(shí)施例中,該初始有效負(fù)載在預(yù)定時間內(nèi)被復(fù)制至預(yù)定位置(例如系統(tǒng)的硬盤上),例如當(dāng)建立、裝配和檢測系統(tǒng)時,或當(dāng)最終用戶首次激活系統(tǒng)時。一旦被復(fù)制,在POST后但OS運(yùn)行前執(zhí)行有效負(fù)載,并在屏幕上顯示圖形、廣告、動畫、聯(lián)合照相專家組(IPEG)/活動圖像專家組(MPEG)格式的材料。當(dāng)發(fā)送附加程序和/或有效負(fù)載時(通過Internet或其它的外部連接),在OS引導(dǎo)前以及引導(dǎo)期間可用顯示屏幕以消息或圖形的形式來提供可定制屏幕。此外,可利用在第一軟件模塊中發(fā)送的可執(zhí)行程序以及從Web站點(diǎn)下載的后續(xù)程序(例如第二軟件模塊)來測量PC以確定安裝的不同類型的設(shè)備、驅(qū)動程序及應(yīng)用程序。在一個實(shí)施例中,本文結(jié)合題為“用于計算機(jī)上自動安裝及配置軟件的方法及設(shè)備”的未決的申請序列號為____的美國專利進(jìn)行描述,利用第一軟件模塊識別及為用戶自動產(chǎn)生快捷方式和/或書簽。從Web站點(diǎn)下載的程序可包括收集和維護(hù)基于用戶選擇的用戶性狀的軟件。這些信息可提供給信息介質(zhì),隨后將部分信息和/或基于該信息的已編譯數(shù)據(jù)給供應(yīng)者和其它商業(yè)以獲得供應(yīng)者和其它商業(yè)所提供的信息升級或修訂。參考圖1,信息分配系統(tǒng)10包括將一個或多個通信鏈接301-30N連接到一個或多個用戶計算機(jī)系統(tǒng)401-40N(“40”)的服務(wù)中心20。該服務(wù)中心20包括個或多個服務(wù)器22、一個或多個數(shù)據(jù)庫24以及一個或多個計算機(jī)261-26M。多個用戶計算機(jī)系統(tǒng)401-40N能同時訪問一個或多個計算機(jī)261-26M。如果使用多個計算機(jī),則可通過局域網(wǎng)(LAN)或其它類似的連接技術(shù)連接計算機(jī)261-26M。然而,服務(wù)中心20也可能有其他配置。例如,具有許多運(yùn)行在大型計算機(jī)上的內(nèi)部程序或過程的更少量的大型計算機(jī)(即少數(shù)大型機(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提供更多種類的可存儲在服務(wù)中心20上的計算機(jī)軟件、內(nèi)容等。可使用連接到服務(wù)中心計算機(jī)(例如計算機(jī)26)上的一個或多個數(shù)據(jù)庫24將由計算機(jī)軟件組成的數(shù)據(jù)庫入口存儲在計算機(jī)26上。在一個實(shí)施例中,每個用戶計算機(jī)系統(tǒng)401-40N具有使其他計算機(jī)無法訪問的自身的安全數(shù)據(jù)庫(未示出)。通信鏈接301-30N允許一個或多個用戶計算機(jī)系統(tǒng)401-40N同時與計算機(jī)261-26M相連接。該連接由服務(wù)器22控制。在用戶計算機(jī)系統(tǒng)40與信息服務(wù)計算機(jī)26建立雙向通信后,以下文所述的方式將內(nèi)容發(fā)送到用戶計算機(jī)系統(tǒng)40中。下載的內(nèi)容包括測量用戶和/或用戶計算機(jī)系統(tǒng)的硬件和/或軟件以開發(fā)用戶性狀及用戶系統(tǒng)性狀的應(yīng)用程序。隨后將從用戶和/或用戶計算機(jī)系統(tǒng)中收集的信息提供給服務(wù)中心20,服務(wù)中心20將附加內(nèi)容提供給基于用戶及系統(tǒng)性狀的用戶計算機(jī)40。從連接到服務(wù)計算機(jī)26上的數(shù)據(jù)庫的數(shù)據(jù)庫入口包含關(guān)于計算機(jī)軟件、硬件以及用戶可用的第三方服務(wù)及產(chǎn)品的信息?;谟脩艉停蛳到y(tǒng)性狀,該內(nèi)容進(jìn)一步被發(fā)送至用戶計算機(jī)上顯示。該內(nèi)容也可以包括諸如對現(xiàn)有計算機(jī)軟件、現(xiàn)有計算機(jī)軟件的新版本、商標(biāo)新的計算機(jī)軟件、新的幫助文件等修訂和糾錯的信息摘要。該內(nèi)容還可包括有關(guān)用戶感興趣的硬件及第三方產(chǎn)器和服務(wù)的信息。然后用戶能夠從可得到的產(chǎn)品和服務(wù)的摘要中進(jìn)行一個或多個選擇,并請求將產(chǎn)品從服務(wù)計算機(jī)26上傳送到用戶計算機(jī)上。用戶也可以選擇從可得到的產(chǎn)品和服務(wù)的摘要中購買所需的產(chǎn)品或服務(wù)。圖2示出了實(shí)現(xiàn)本發(fā)明實(shí)施例的示例性計算機(jī)系統(tǒng)100。盡管其它的實(shí)施例可能易于使用,但該計算機(jī)系統(tǒng)100示出了用戶計算機(jī)系統(tǒng)401-40N和/或計算機(jī)261-26M的一個實(shí)施例(圖1)。參考圖2,計算機(jī)系統(tǒng)100包括處理器或中央處理器(CPU)104。示出的CPU104包括用于執(zhí)行計算算術(shù)邏輯部件(ALU)、收集用于暫時存儲數(shù)據(jù)和指令的寄存器以及控制系統(tǒng)100運(yùn)行的控制器。在一個實(shí)施例中,CPU104包括由IntelTM公司銷售的任何一種X86、PentiumTM、PentiumⅡTM以及PentiumProTM微處理器,由AMDTM公司銷售的K-6微處理器或CyrixTM公司銷售的6X86MX微處理器。其他還包括由數(shù)字設(shè)備公司TM銷售的AlphaTM處理器、MotorolaTM銷售的680X0處理器或IBMTM銷售的PowerpCTM處理器。此外,還包括任何一種其它的處理器,包括那些來自于Microsystems、MIPS、IBM、Motorola、NEC、Cyrix、AMD、Nexgen及其它公司的可執(zhí)行CPU104的處理器。CPU104不限于微處理器,還可以是諸如微控制器、數(shù)字信號處理器、精簡指令集計算機(jī)(RISC)、應(yīng)用專用集成電路及類似的形式。盡管示出的只有一個CPU104,但計算機(jī)系統(tǒng)100可以有多個處理裝置。CPU104通過CPU總線108與總路控制器112相連??偩€控制器112包括集成在其中的存儲控制器116,而存儲控制器116在總線控制器112的外部。存儲控制器116設(shè)有CPU104或其它設(shè)備通過存儲器總線120訪問系統(tǒng)存儲器124的接口。在一個實(shí)施例中,系統(tǒng)存儲器124包括同步動態(tài)隨機(jī)存取存儲器(SDRAM)。系統(tǒng)存儲器124可隨意包括任何附加或可選擇的高速存儲設(shè)備或存儲電路??偩€控制器112與系統(tǒng)總線128相連,該系統(tǒng)總線可以是外圍部件互連(PCI)總線、工業(yè)標(biāo)準(zhǔn)結(jié)構(gòu)(ISA)總線等。與系統(tǒng)總線128相連的是圖形控制器、圖形引擎或視頻控制器132、大容量存儲器152、通信接口設(shè)備156、一個或多個輸入/輸出(I/O)設(shè)備1681-168N以及擴(kuò)展總線控制器172。視頻控制器132與視頻存儲器136(例如8兆字節(jié))和視頻BIOS140相連,所有這些都可以集成到一塊卡或設(shè)備上,如數(shù)字144所示。視頻存儲器136用于包含在顯示屏幕148上顯示信息的顯示數(shù)據(jù),視頻BIOS140包括控制視頻控制器132的編碼和視頻服務(wù)。在另一個實(shí)施例中,視頻控制器132通過加速圖形端口(AGP)總線連接到CPU104上。大容量存儲器152包括(但不限于)硬盤、軟盤、CD-ROM、DVD-ROM、磁帶、高密度軟盤、大容量可移動介質(zhì)、低容量可移動介質(zhì)、固態(tài)存儲設(shè)備等,及其組合。大容量存儲器152可以包括任何其他大容量存儲介質(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ū)動器,例如光盤驅(qū)動器、數(shù)字磁盤驅(qū)動器、磁帶驅(qū)動器、zip驅(qū)動器、jazz驅(qū)動器、大容量可移動介質(zhì)驅(qū)動器、低容量介質(zhì)設(shè)備,和/或它們的任意組合。擴(kuò)展總線控制器172與非易失性存儲器175連接,非易失性存儲器175包括系統(tǒng)固件176。系統(tǒng)固件176包括系統(tǒng)BIOS82,用于控制在其他物品中計算機(jī)系統(tǒng)100中的硬件設(shè)備。系統(tǒng)固件176還包括ROM180和快速(或EEPROM)184。擴(kuò)展總線控制器172還與具有RAM、ROM和/或快速存儲器(未示出)的擴(kuò)展存儲器188a連接。此外系統(tǒng)100可以包括與總線控制器112連接的存儲器模塊190。在一個實(shí)施例中,存儲器模塊190包括ROM192和快速(或EEPROM)194。正如本領(lǐng)域技術(shù)人員所熟悉的,計算機(jī)系統(tǒng)100還包括操作系統(tǒng)(OS)和至少一個應(yīng)用程序,在一個實(shí)施例中,在POST之后從大容量存儲器152將所述操作系統(tǒng)和應(yīng)用程序裝入系統(tǒng)存儲器124中并啟動它們。OS可以包括任可類型的OS,包括但不限制于或局限于DOS、WindowTM(例如Window95TM,Window98TM,WindowNTTM),Unix、Linux、OS/2、OS/9、Xenix等。操作系統(tǒng)是一組控制計算機(jī)系統(tǒng)操作和資源分配的一個或多個程序。應(yīng)用程序是一組執(zhí)行用戶所期望的任務(wù)的一個或多個軟件程序。根據(jù)計算機(jī)編程領(lǐng)域技術(shù)人員的實(shí)踐,下面參考用符號表示的操作來描述本發(fā)明,除非特別指出,否則這些操作都是由計算機(jī)系統(tǒng)100執(zhí)行的。這種操作有時稱為計算機(jī)執(zhí)行的操作。應(yīng)當(dāng)理解,用符號表示的這些操作包括通過CPU104操作表示數(shù)據(jù)位的電信號的和將數(shù)據(jù)位保持在系統(tǒng)存儲器124中的存儲單元中,其他信號的處理也一樣。保持?jǐn)?shù)據(jù)位的存儲單元是物理單元,這些物理單元具有與數(shù)據(jù)位相對應(yīng)的特殊的電、磁、光或有機(jī)特性。當(dāng)以軟件實(shí)現(xiàn)時,本發(fā)明的部件實(shí)質(zhì)上是執(zhí)行所需任務(wù)的代碼段。程序或代碼段可以存儲在處理器可讀介質(zhì)中或通過傳輸媒介或通信鏈路由包含在載波中的計算機(jī)數(shù)據(jù)信號傳輸?!疤幚砥骺勺x介質(zhì)”可以包括能存儲或傳送信息的任何介質(zhì)。處理器可讀介質(zhì)的例子包括電子電路、半導(dǎo)體存儲器設(shè)備、ROM、快速存儲器、可擦除ROM(EROM)、軟盤、CD-ROM、光盤、硬盤、光纖介質(zhì)、射頻(RF)鏈路等。計算機(jī)數(shù)據(jù)信號可以包括能通過傳輸媒介傳播的任何信號,傳輸媒介例如電子網(wǎng)絡(luò)信道、光纖、空氣、電磁、RF鏈路等。代碼段可以通過計算機(jī)網(wǎng)絡(luò)例如Internet、Intranet等下載。圖3示出了計算機(jī)系統(tǒng)100的邏輯框圖。參考圖2和3,系統(tǒng)固件176包括在POST期間裝入系統(tǒng)存儲器124并隨后由處理器104執(zhí)行的軟件模塊和數(shù)據(jù)。在一個實(shí)施例中,系統(tǒng)固件176包括具有系統(tǒng)BIOS處理程序、硬件例行程序等的系統(tǒng)BIOS模塊,ROM應(yīng)用程序接口(RAPI)模塊84,初始啟動應(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ī)系統(tǒng)100之前存儲在系統(tǒng)固件176中。在一個實(shí)施例中,RAPI84,ISUA86和初始有效負(fù)載88a中每一個都包括Phoenix技術(shù)有限公司開發(fā)的專用軟件。RAPI84通常在ROM應(yīng)用程序和系統(tǒng)BIOS82之間提供安全接口。RAPI84的一個實(shí)施例在以下圖8-18中有所描述并伴有文字說明。ISUA86的一個實(shí)施例在申請序列號為____、題目為“在計算機(jī)上自動安裝和配置軟件的方法和設(shè)備”、申請日為1999年6月18日、轉(zhuǎn)讓給Phoenix技術(shù)有限公司的未決美國專利申請中做了描述,本文在此通過參考結(jié)合該專利申請的內(nèi)容。從虛擬存儲器訪問和執(zhí)行物理存儲器的內(nèi)容參考圖2所示的安裝在處理系統(tǒng)100上的操作系統(tǒng)描述本發(fā)明的一個方面。圖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ū)動程序或軟件接口的集合,硬件設(shè)備如控制臺(鍵盤和顯示器),打印機(jī)類、輔助設(shè)備(串口)、計算機(jī)時鐘和引導(dǎo)磁盤設(shè)備。BIOS236通常嵌入可編程的只讀存儲器(ROM)中。通常,BIOS函數(shù)本身實(shí)際上是利用訪問物理存儲器更快的優(yōu)點(diǎn)從ROM拷貝到物理存儲器中。這就是所知道的“陰影”BIOS236,因?yàn)锽IOS236的兩個副本導(dǎo)致一個在ROM(不再被使用)中,而另一個在物理存儲器中。存儲BIOS236的物理存儲器部分稱為BIOS陰影空間。WindowsNT這樣的操作系統(tǒng)在操作系統(tǒng)已經(jīng)被引導(dǎo)并正在運(yùn)行之后不使用BIOS236。WindowsNT操作系統(tǒng)中的核心級驅(qū)動操作直接與系統(tǒng)硬件接口。本發(fā)明便于用BIOS236作為系統(tǒng)硬件238和操作232之間的接口。操作系統(tǒng)230包括與應(yīng)用程序232和服務(wù)程序2234接口的分類驅(qū)動程序240以及I/O管理程序242。I/O管理程序242將從應(yīng)用程序232和服務(wù)程序234(經(jīng)分類驅(qū)動程序240產(chǎn)生的)到正常定序的調(diào)用中的I/O請求轉(zhuǎn)換為位于核心244中的不同驅(qū)動程序。尤其是,當(dāng)I/O管理程序242接收I/O請求時,它用請求的函數(shù)代碼調(diào)用位于核心244中的驅(qū)動程序中的若干調(diào)度程序方法其中之一。內(nèi)核244提供與硬件無關(guān)的功能,稱為系統(tǒng)功能,這些功能是通過軟件中斷來訪問的。內(nèi)核244提供的功能包括文件和目錄管理、存儲器管理、字符設(shè)備輸入/輸出和時間及數(shù)據(jù)支持等。在一個實(shí)施例中,操作系統(tǒng)是WindowsNT操作系統(tǒng)。在另一個實(shí)施例中,操作系統(tǒng)230包括Solaris或AIX操作系統(tǒng)或基于請求分頁的虛擬存儲器子系統(tǒng)的其他操作系統(tǒng)。本發(fā)明提供位于核心244中的訪問驅(qū)動程序246,它負(fù)責(zé)訪問位于BIOS236中的BIOS數(shù)據(jù)或者經(jīng)BIOS236訪問系統(tǒng)硬件238數(shù)據(jù)。訪問驅(qū)動程序246也負(fù)責(zé)訪問BIOS函數(shù)地址的位置和執(zhí)行相關(guān)的BIOS功能。在一個最佳實(shí)施例中,核心244包括用C語言編寫的源代碼??梢岳斫?,可以用其他匯編語言實(shí)現(xiàn)內(nèi)核244的函數(shù)。BIOS數(shù)據(jù)和地址通常位于物理存儲器250中并經(jīng)BIOS接口248被訪問驅(qū)動程序246訪問。在一個實(shí)施例中,訪問驅(qū)動程序246執(zhí)行BIOS陰影空間中的代碼,該空間的物理地址通常為0x000E0000。0x000FFFFF。通過舉例,如果訪問驅(qū)動程序246需要訪問位于地址為0x00000000的物理存儲器中的BIOS函數(shù)。它調(diào)用I/O管理程序242,請求它將物理地址0x00000000到0x00000FFF的存儲空間映射到其虛擬存儲空間上。然后I/O管理程序242將指針返回到訪問驅(qū)動程序246的虛擬存儲空間,例如0xfd268000。訪問驅(qū)動程序現(xiàn)在可以通過基于或訪問其虛擬地址0xfd268000來訪問物理地址為0x00000000的地址空間。因此,為了訪問位于物理地址0x2400上的函數(shù),所用虛擬地址為0xfd2682400。在一個最佳實(shí)施例中,利用訪問驅(qū)動程序246的應(yīng)用程序230、服務(wù)232或分類驅(qū)動程序240可以使用一組入口點(diǎn)或函數(shù)調(diào)用。訪問驅(qū)動程序246通過這些入口點(diǎn)可以被打開、關(guān)閉,并且能接收輸入/輸出(“I/O”)控制代碼(“IOCTLs”)。表1示出了訪問驅(qū)動程序246的結(jié)構(gòu)、入口點(diǎn)和應(yīng)用程序。圖5是顯示根據(jù)本發(fā)明原理所提供的訪問驅(qū)動程序246初始化過程的方框圖。通常,當(dāng)初次裝載訪問驅(qū)動程序246時,執(zhí)行其DriverEntry函數(shù)(見表1)。盡管在該函數(shù)中出現(xiàn)了大量其他初始化(例如為訪問驅(qū)動程序246的正常操作分配不同的資源或?qū)ο?,出現(xiàn)兩個尤其重要的初始化(a)位于物理存儲器250中的BIOS陰影區(qū)260(包括BIOS服務(wù)目錄62)和(b)也位于物理存儲器250中的BIOS數(shù)據(jù)區(qū)264,兩者都被映射到訪問驅(qū)動程序246的虛擬存儲器(包括BIOS服務(wù)目錄272和BIOS數(shù)據(jù)區(qū)74)270中。結(jié)果,應(yīng)用程序232或服務(wù)程序2234可以通過分類驅(qū)動程序240利用虛擬地址訪問或執(zhí)行BIOS函數(shù)。應(yīng)注意,BIOS函數(shù)的執(zhí)行必須通過訪問驅(qū)動程序246來實(shí)現(xiàn),原因是BIOS236的物理地址空間僅映射到訪問驅(qū)動程序246。此外,可以通過附錄A中詳細(xì)描述的32位BIOS電源管理服務(wù)接口的實(shí)現(xiàn)來利用訪問驅(qū)動程序246。顯然,本領(lǐng)域的技術(shù)人員知道BIOS電源管理服務(wù)接口也可以用64位、128伴和256位配置來實(shí)現(xiàn)。尤其是,在初始化過程中,訪問驅(qū)動程序246尋址位于物理存儲器250中的BIOS陰影區(qū)260和BIOS數(shù)據(jù)區(qū)264。BIOS陰影區(qū)260和BIOS數(shù)據(jù)區(qū)264被映射到訪問驅(qū)動程序246的虛擬地址空間。接著,訪問驅(qū)動程序246檢索BIOS服務(wù)目錄272頭部。一旦發(fā)現(xiàn)并確認(rèn)BIOS服務(wù)目錄,訪問驅(qū)動程序246獲得BIOS服務(wù)目錄272的虛擬地址,這提供了BIOS服務(wù)目錄272頭部虛擬地址對BIOS陰影區(qū)270的基準(zhǔn)虛擬地址的補(bǔ)償。在另一個實(shí)施例中,在初始化過程中,訪問驅(qū)動程序?qū)ぶ肺挥谖锢泶鎯ζ?50中的BIOS陰影區(qū)260、BIOS數(shù)據(jù)區(qū)264和BIOSROM區(qū)。BIOS陰影區(qū)260、BIOS數(shù)據(jù)區(qū)264和BIOSROM區(qū)被映射到訪問驅(qū)動程序246的虛擬地址空間。接著,訪問驅(qū)動程序246檢索BIOS服務(wù)目錄272頭部。一旦發(fā)現(xiàn)并確認(rèn)BIOS服務(wù)目錄,訪問驅(qū)動程序246獲得BIOS服務(wù)目錄272的虛擬電址。在該實(shí)施例中,訪問驅(qū)動程序246的虛擬存儲器空間中BIOSROM區(qū)的可用性使訪問驅(qū)動程序246能在閃存ROM中讀和/或?qū)憯?shù)據(jù)。結(jié)果,BIOSROM能被二次擴(kuò)容或再寫。此外,與硬件接口的外部應(yīng)用程序能通過軟件機(jī)制訪問BIOSROM區(qū),軟件機(jī)制例如附錄B中所提供的PhoenixPNashNT說明書中所描述的。隨后,調(diào)用訪問驅(qū)動程序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。在一個實(shí)施例中,被調(diào)用以激活BIOS中被請求的入口點(diǎn)的執(zhí)行函數(shù)是IOCTL-BIOS-EXEC函數(shù),如表1所述。IOCTL-BIOS-EXEC函數(shù)在位于主存儲器或DRAM中的緩沖器(通過調(diào)用應(yīng)用程序232或服務(wù)234)中建立寄存器堆棧。堆棧的內(nèi)容是調(diào)用BIOS函數(shù)時的寄存器值。訪問驅(qū)動程序246通過調(diào)用應(yīng)用程序232或服務(wù)程序234傳遞寄存器堆棧。利用BIOS服務(wù)目錄272中指定的函數(shù)指針完成程序調(diào)用本身。在一個實(shí)施例中,IOCTL-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ū)動程序246的結(jié)構(gòu)、入口功能和應(yīng)用程序的概述。表1.訪問驅(qū)動程序246函數(shù)A.訪問驅(qū)動程序246函數(shù)的詳細(xì)描述1.“DriverEntry”函數(shù)該入口點(diǎn)使驅(qū)動程序初始化其變量,在BIOS陰影和數(shù)據(jù)區(qū)中映射,并為其正常操作分配資源。當(dāng)每個資源或?qū)ο蠖ㄎ粫r,將其列表形成變量“phResAndFlags”;允許單一函數(shù)(“freeResources”)釋放驅(qū)動程序使用的資源,而不論驅(qū)動程序被卸載原因。被定位或連接的資源如下a.產(chǎn)生設(shè)備對象-建立系統(tǒng)的設(shè)備對象及名稱。b.初始化錯誤記錄-產(chǎn)生與事件日志服務(wù)的鏈接。c.建立主函數(shù)入口點(diǎn)。d.產(chǎn)生符號連接-服務(wù)程序或應(yīng)用程序?qū)邮褂胑.在BIOS陰影中的映射-使驅(qū)動程序可訪問虛擬內(nèi)存上的內(nèi)存空間。f.在BIOSROM中的映射-使虛擬內(nèi)存地址空間中的ROM區(qū)可以訪問。g.在BIOS數(shù)據(jù)中的映射-使驅(qū)動程序可訪問虛擬內(nèi)存上的內(nèi)存空間。h.為該驅(qū)動程序使用定位BIOS232位入口點(diǎn)。在一個實(shí)施例中,設(shè)備對象名稱為“Laptop”,需要其服務(wù)微軟OEM適應(yīng)開發(fā)包(OAK)所需的連接函數(shù)。該相應(yīng)符號連接名稱為“PhoenixAD”。2.AcessDriverCreateClose當(dāng)應(yīng)用程序232或服務(wù)程序234向系統(tǒng)請求進(jìn)行設(shè)備處理時,或當(dāng)其關(guān)閉已經(jīng)獲得的處理時,利用該函數(shù)通知驅(qū)動程序246。該訪問驅(qū)動程序246通過成功實(shí)現(xiàn)請求來響應(yīng)調(diào)度入口點(diǎn),但不改變驅(qū)動程序246的其他模式變量。3.AcessDriverUnload當(dāng)需要將驅(qū)動程序從系統(tǒng)(從(SCM)關(guān)閉設(shè)備)中移動時,由代表服務(wù)控制管理程序(SCM)或其它應(yīng)用程序的核心調(diào)用該調(diào)度入口點(diǎn)。該函數(shù)調(diào)用的結(jié)果是列表于“phResAndFlags”中的所有資源對系統(tǒng)均為空閑并成功完成請求。4.AccessDriverReg訪問驅(qū)動程序246的驅(qū)動程序具有對作為部分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)首次安裝時),典型的OAK適應(yīng)設(shè)備驅(qū)動程序會調(diào)用注冊。作為DriverEntry函數(shù)的一部分,每個注冊設(shè)備必須調(diào)用以將其本身從需要電源控制服務(wù)程序的設(shè)備的訪問驅(qū)動程序246鏈接清單中移走。5.LOCTLF函數(shù)在服務(wù)程序或應(yīng)用程序?qū)雍虰IOS之間的每一個接口都由訪問驅(qū)動程序246的驅(qū)動程序中的LOCTL函數(shù)來處理。以緩沖區(qū)模式執(zhí)行每個LOCTL傳送,以使驅(qū)動程序的輸入數(shù)據(jù)及其輸出程序通過共用系統(tǒng)緩沖區(qū)來進(jìn)行傳送。在作為Irp>AssociatedIrp.SystemBuffer的輸入/輸出(I/O)請求包中給出該緩沖區(qū)空間的指針。一旦被控制,IOCTL(在驅(qū)動程序內(nèi))會得到系統(tǒng)緩沖區(qū)地址并利用其內(nèi)容來執(zhí)行請求。在輸入給時,IOCTL函數(shù)的執(zhí)行結(jié)果會在相同的系統(tǒng)緩沖區(qū)內(nèi)被替換。在訪問驅(qū)動程序246的驅(qū)動程序中執(zhí)行的每個IOCTL都有唯一用于IOCTL輸入數(shù)據(jù)和輸出數(shù)據(jù)的數(shù)據(jù)模式。該函數(shù)如下所述,給出其數(shù)據(jù)緩沖區(qū)模式及每個區(qū)域的說明。緩沖區(qū)補(bǔ)償以字節(jié)給出。建議malloc()大小為給每個函數(shù)的最小緩沖區(qū)大小供應(yīng)用程序用戶緩沖區(qū)所使用。從用戶緩沖區(qū)中會自動得出系統(tǒng)緩沖區(qū)大小。6.LOCTLLocate在驅(qū)動程序246初始化后,該LOCTLLocate函數(shù)是由應(yīng)用程序232或服務(wù)程序234調(diào)用的首次調(diào)度入口點(diǎn)。該函數(shù)返回以可置平模式虛擬地址格式(232位地址)的BIOS232服務(wù)程序接口地址,BIOS陰影的基址以及BIOS數(shù)據(jù)區(qū)的基址。需要注意的是,BIOS服務(wù)程序接口是從驅(qū)動程序?qū)踊騼?nèi)核線程(見附錄A)執(zhí)行所有BIOS函數(shù)的唯一入口點(diǎn)。在裝入訪問驅(qū)動程序246期間,保證僅該驅(qū)動程序可以到達(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-BIOSROM數(shù)據(jù)區(qū)基本虛擬地址。最小緩沖區(qū)大小16位7.LOCTLBIOSRead該LOCTL_BIOSRead函數(shù)為BIOSROM、陰影或數(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存儲器的末端相重疊的BIOS區(qū)的補(bǔ)償而發(fā)生“短讀出”時,不返回錯誤。“實(shí)際數(shù)據(jù)讀出”區(qū)域正確指出在系統(tǒng)緩沖區(qū)有多少有效數(shù)據(jù)。8.LOCTLBIOSWrite該LOCTL_BIOS_Write函數(shù)為BIOSROM、陰影或數(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.LOCTLBIOSExec該LOCTL_BIOS_Exec函數(shù)被用來通過BIOS232服務(wù)程序接口執(zhí)行BIOS函數(shù)。活動記錄經(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.LOCTLRTCRead該LOCTL_RTC_Read函數(shù)用于讀出CMOSRAM中的RTC寄存器的內(nèi)容。自動讀出的數(shù)據(jù)格式與SYSTEMTIME結(jié)構(gòu)相類似并返回到系統(tǒng)緩沖區(qū)的用戶中。輸入數(shù)據(jù)無,不依靠緩沖區(qū)容量輸出數(shù)據(jù)&#60如下所示使用SYSTEMTIME模板&#62補(bǔ)償0字當(dāng)前年份補(bǔ)償2字當(dāng)前月分(一月=1)補(bǔ)償4字當(dāng)前星期幾(星期日=0)補(bǔ)償6字當(dāng)前月日(日歷)補(bǔ)償8字當(dāng)前小時補(bǔ)償100字當(dāng)前分鐘補(bǔ)償12字當(dāng)前秒補(bǔ)償14字當(dāng)前毫秒最小緩沖區(qū)大小32位。注意在RTC中的年份區(qū)域?yàn)?位寬度。在RTC中年份區(qū)域的內(nèi)容會重新計算到包含當(dāng)前年份、公元的全部值的SYSTEMTIME.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.LOCTLVERSIONLOCTL_VERSION函數(shù)將訪問驅(qū)動程序246驅(qū)動程序的主、次版本返回到調(diào)用程序。另外,由這個版本驅(qū)動程序?qū)崿F(xiàn)的該函數(shù)以位圖計算。該位圖的目的是使服務(wù)程序或更高級的驅(qū)動程序估計是否該版本的驅(qū)動程序可以實(shí)現(xiàn)其目的(通常在安裝時間)。輸入數(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.LOCTLPMSuspend該LOCTL_PM_Suspend函數(shù)使IRP_MJ_PNP_POWER、IRP_MNLTRESUMEIRP被發(fā)送到使用AccessDriverDriverReg入口點(diǎn)注冊本身的每個設(shè)備。輸入數(shù)據(jù)無,不依賴緩沖區(qū)內(nèi)容輸出數(shù)據(jù)無,不依賴緩沖區(qū)內(nèi)容B.訪問驅(qū)動程序246返回的錯誤代碼下表定義了當(dāng)IRP失敗或僅部分完成時返回的錯誤模式。也給出了該函數(shù)終止的條件。因?yàn)樵诓僮飨到y(tǒng)已知的NTSTATUS值和訪問驅(qū)動程序246設(shè)備驅(qū)動程序之間不需要存在一對一的對應(yīng),因此就需要該表。為了將代碼還原翻譯成應(yīng)用寫程序或最終用戶可用的串,強(qiáng)制僅使用NTSTATUS錯誤代碼。表2.從訪問驅(qū)動程序246返回的NTSTATUS代碼<tablesid="table2"num="002"><table>NTSTATUS函數(shù)終止條件STATUS_SUCCESS所有請求成功STATUS_SOME_NOTMAPPED目錄入口一個或多個存儲器或I/O區(qū)域不能被映射。驅(qū)動程序安裝失敗。STATUS____NOTIMPLEMENTED所有在該驅(qū)動程序中不能執(zhí)行被請求函數(shù)。STATUS____ACCESSDENIED所有IOCTL函數(shù)由于另一個服務(wù)程序排斥訪問或由于未給出BIOS服務(wù)目錄簽名,調(diào)用程序不可用設(shè)備。STATUS____MEDIACHECK所有LOCTL函數(shù)-未執(zhí)行BIOSROM中的內(nèi)容可能已改變。需要IOCTLLocate的新調(diào)用。</table></tables>C.BIOS232位入口點(diǎn)說明為使IOCTL_Locate發(fā)現(xiàn)BIOS的入口點(diǎn),使用BIOS232位服務(wù)目錄。在附錄C中描述BIOS232-位服務(wù)目錄。當(dāng)查找和執(zhí)行BIOS函數(shù)時,訪問驅(qū)動程序246所使用的簽名為“32”。如果受上述規(guī)定的條件影響未發(fā)現(xiàn)WinntEntry(BIOS232服務(wù)目錄)結(jié)構(gòu),則訪問驅(qū)動程序246驅(qū)動程序在裝入時間失敗,DriverEntry顯示不能進(jìn)行如每個表2中的初始化。D.實(shí)時時鐘硬件訪問為執(zhí)行IOCTL_RTCRead函數(shù),需要定義RTC寄存器和訪問的方法。該RTC寄存器定位于CMOSRAM的I/O地址空間。在表3中僅示出了RTC寄存器。通過將CMOS物理存儲器地址輸出到端口0x70來訪問該寄存器,然后讀取端口Ox70上的源(subject)8位寄存器。讀取所有RTC寄存器后,設(shè)定該CMOS物理存儲器地址指向0x0D。表3.RTC寄存器<tablesid="table3"num="003"><table>寄存名稱CMOS地址,注解年9-從1980以后的年份月8-1=一月日7星期幾6-0等于星期日時4分2秒0</table></tables>圖6A是本發(fā)明初始化過程的一個實(shí)施例的流程圖。從起動模式開始,過程600開始進(jìn)行塊610,初始化調(diào)用程序的變量(例如I/O管理程序242)。圖6B和配套的文字描述了該初始化過程6100的細(xì)節(jié)。然后過程600開始進(jìn)行塊620,在620上裝入訪問驅(qū)動程序246。然后發(fā)生訪問驅(qū)動程序變量的初始化。在初始化過程期間,發(fā)生兩個特別必要的初始化(a)位于物理存儲器250的BIOS陰影260(包括BIOS服務(wù)目錄)以及(b)同樣位于物理存儲250的BIOS數(shù)據(jù)區(qū)264,均映射到訪問驅(qū)動程序246的訪問驅(qū)動程序的246虛擬存儲器(如圖4中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é)流程圖。從起動模式開始,過程610開始進(jìn)行塊612,在612上來自I/O管理程序242的調(diào)用程序?yàn)橄到y(tǒng)緩沖區(qū)上指定的存儲器結(jié)構(gòu)分配存儲器。然后過程610前進(jìn)到過程塊614,在614上來自I/O管理程序242的調(diào)用程序確定許多BIOS函數(shù)的位置、相應(yīng)的入口點(diǎn)、長度和補(bǔ)償。在一個實(shí)施例中,通過進(jìn)入具有BIOS函數(shù)的虛擬地址的相應(yīng)BIOS函數(shù)的指定存儲器結(jié)構(gòu)的地址區(qū)域,以及通過提供識別每個BIOS函數(shù)的4位ASCⅡ串來完成的。然后終止調(diào)用程序的初始化。圖6C是圖6A的過程塊630的詳細(xì)流程圖。從起動模式開始,調(diào)用應(yīng)用程序232或服務(wù)程序234通過分類驅(qū)動程序調(diào)用IOCTL_Locate,如塊632所示。相應(yīng)地,訪問驅(qū)動程序246執(zhí)行查找BIOS服務(wù)目錄272的頭部,如過程塊634所示。一旦找到并確認(rèn)BIOS服務(wù)目錄272,訪問驅(qū)動程序246獲得BIOS服務(wù)目錄272頭部的虛擬地址,其提供從BIOS陰影270的基本虛擬地址的BIOS服務(wù)目錄272頭部虛擬地址的補(bǔ)償。然后過程630將控制返回到調(diào)用應(yīng)用程序232或服務(wù)程序234。圖7A是本發(fā)明的調(diào)用執(zhí)行過程的流程圖。從起動模式開始,過程700開始進(jìn)行過程塊710,在710上調(diào)用程序通過提供給訪問驅(qū)動程序246來調(diào)用BIOS函數(shù),它想在BIOS函數(shù)的地址開始執(zhí)行。然后過程700前進(jìn)到過程塊720,在720上訪問驅(qū)動程序246通過來自I/O管理程序242的IOCTL命令接收BIOS函數(shù)的調(diào)度調(diào)用(見圖4)。然后過程700前進(jìn)到過程塊730,在730上訪問驅(qū)動程序246實(shí)行入口點(diǎn)地址的范圍檢查。特別地,訪問驅(qū)動程序246確定入口點(diǎn)地址是否處在映射BIOS陰影地址的范圍內(nèi),不包括服務(wù)目錄頭部。如果不是,則訪問驅(qū)動程序246指示開始虛擬地址未處于從物理存儲器映射到虛擬存儲器的的地址范圍內(nèi)??梢酝ㄟ^使用標(biāo)志來進(jìn)行指示。如果范圍檢查成功,則過程700開始進(jìn)行過程塊740,在740上訪問驅(qū)動程序246執(zhí)行調(diào)用的BIOS函數(shù)。然后過程700終止。圖7B是圖7A中過程塊740的細(xì)節(jié)的流程圖。從起動模式開始,過程740開始進(jìn)行過程塊742,在742上訪問驅(qū)動程序246在先前由I/O管理程序242的程序規(guī)定的系統(tǒng)緩沖區(qū)中產(chǎn)生寄存器堆棧。然后過程730前進(jìn)到過程塊744,在744上訪問驅(qū)動程序246提供指向保存將要執(zhí)行的BIOS函數(shù)地址的寄存器堆棧的指針。然后過程740前進(jìn)到過程塊746,在746上來自I/O管理程序242的調(diào)用程序調(diào)用并執(zhí)行該函數(shù),該函數(shù)的開始地址由指針指示,將其物理地址作為虛擬存儲器的映射。然后過程740終止。現(xiàn)在提供一個在訪問驅(qū)動程序246中使用IOCTL_BIOS_EXEC函數(shù)的示例。最初,應(yīng)用程序232或服務(wù)程序234訪問使用命令I(lǐng)OCTL_Locate訪問驅(qū)動程序246。從訪問驅(qū)動程序246返回的數(shù)據(jù)包括BIOS陰影基本虛擬地址、從BIOS陰影基本虛擬地址的BIOS服務(wù)目錄補(bǔ)償以及BIOS數(shù)據(jù)區(qū)基本虛擬地址。然后利用隨后的動作確定BIOS服務(wù)程序、其入口點(diǎn)、長度和地址補(bǔ)償?shù)拇嬖?。來自I/O管理程序242的調(diào)用程序首先為諸如IOC_EXEC1的寄存器結(jié)構(gòu)分配存儲器,然后將IOCTL_Locate給出的虛擬地址填充到該結(jié)構(gòu)的biosFunction區(qū)域。其他寄存器值按如下填充識別BIOS服務(wù)程序的4位ASCⅡ串被裝入eax寄存器,零被裝入ebx寄存器。接著,調(diào)用程序調(diào)用具有IOC_EXEC1結(jié)構(gòu)內(nèi)容的訪問驅(qū)動程序246的IOCTL_BIOS_Exec函數(shù),該IOCTL_BIOS_Exec函數(shù)被拷貝到系統(tǒng)緩沖區(qū)用于IOCTL調(diào)用。然后執(zhí)行BIOS函數(shù)。訪問驅(qū)動程序246的IOCTL_BIOSExec函數(shù)返回每個都包含來自服務(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ū)動程序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ū)動程序246在調(diào)用BIOS函數(shù)中使用的分類驅(qū)動程序240的示范性源代碼。附錄D2和D3示出了訪問驅(qū)動程序246的示范性源代碼。附錄D2示出了在陰影執(zhí)行BIOS函數(shù)的示范性源代碼,而附錄D3示出了產(chǎn)生寄存器堆棧及調(diào)用執(zhí)行BIOS函數(shù)的入口點(diǎn)的示范性源代碼。通過使用本發(fā)明,提供了用于訪問和執(zhí)行來自虛擬存儲器子系統(tǒng)的物理存儲器內(nèi)容的系統(tǒng)和方法。該系統(tǒng)和方法易于增加存儲器的尋址能力和輸入/輸出操作,也允許在物理存儲空間中執(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ù)?!懊荑€對”包括“專用”密鑰和“公用”密鑰。“專用密鑰”為關(guān)鍵對的屬主所有并用來產(chǎn)生數(shù)字簽名。“公用”密鑰被普遍公布并用來改變數(shù)字簽名。公用密鑰通常以數(shù)字“證書”的形式公布?!皵?shù)字簽名”是使用數(shù)字消息和專用密鑰的數(shù)字量。不知道專用密鑰不能計算數(shù)字簽名。通過使用數(shù)字消息和與專用密鑰相對應(yīng)的公用密鑰可以改變數(shù)字簽名。成功校驗(yàn)證實(shí)數(shù)字消息的確是被簽名的,且簽名是利用與公用密鑰相對應(yīng)的專用密鑰產(chǎn)生的?!白C書”是至少包括公用密鑰、專用密鑰以及使用專用密鑰的數(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ū)動程序或軟件接口的集合,這些硬件設(shè)備諸如控制臺(鍵盤和顯示器)、普通打印機(jī)、輔助設(shè)備(串行端口)、計算機(jī)時鐘以及引導(dǎo)磁盤設(shè)備。BIOS1520通常嵌入非易失性存儲器中。操作系統(tǒng)1505包括與應(yīng)用程序1510、服務(wù)程序1515以及I/O管理程序1535相連接的分類驅(qū)動程序1530。I/O管理程序1535將應(yīng)用程序1510和服務(wù)程序1515(通過分類驅(qū)動程序1530進(jìn)行)中的請求轉(zhuǎn)換成位于核心1540內(nèi)的不同驅(qū)動程序的適當(dāng)?shù)男蛄姓{(diào)用。特別地,當(dāng)I/O管理程序1535接收I/O請求時,使用請求的函數(shù)代碼來調(diào)用位于核心1540內(nèi)的驅(qū)動程序的幾個分配程序中的一個。核心1540提供通過軟件中斷方式來訪問的獨(dú)立的硬件函數(shù)、調(diào)用系統(tǒng)函數(shù)。核心1540所提供的函數(shù)通常包括文件和目錄管理、存儲器管理、字符設(shè)備輸入/輸出及時間和日期支持等。在一個實(shí)施例中,操作系統(tǒng)1505為Windows操作系統(tǒng)。在另一個實(shí)施例中,操作系統(tǒng)1505包括Solaris或AIX操作系統(tǒng)或基于請求分頁的虛擬存儲器子系統(tǒng)的其它操作系統(tǒng)。本發(fā)明提供位于核心1540內(nèi)的訪問驅(qū)動程序1545,訪問驅(qū)動程序1545負(fù)責(zé)與ROM應(yīng)用程序接口(RAPI)1550相接連以訪問或升級位于BIOS1520的數(shù)據(jù)或通過BIOS訪問系統(tǒng)硬件數(shù)據(jù)。RAPI1550通常提供安全利用BIOS服務(wù)程序或函數(shù)的接口。下面對RAPI進(jìn)行更詳細(xì)地描述。在最佳實(shí)施例中,訪問驅(qū)動程序1545包括用C語言編寫的源代碼。我們知道利用其它的匯編語言也可以實(shí)現(xiàn)訪問驅(qū)動程序1545的功能。在最佳實(shí)施例中,利用訪問驅(qū)動程序1545的應(yīng)用程序1510、服務(wù)程序1515或分類驅(qū)動程序1530都可能得到一組入口點(diǎn)或函數(shù)調(diào)用。訪問驅(qū)動程序1545可以通過這些入口點(diǎn)打開、關(guān)閉并能夠接收輸入/輸出(“I/O”)控制代碼(“IOCTLs”)。圖9所示為根據(jù)本發(fā)明的一個實(shí)施例的訪問驅(qū)動程序1545和RAPI1550之間的交互序列的序列說明。在現(xiàn)有系統(tǒng)中,在訪問驅(qū)動程序1545可能將一個或多個服務(wù)請求發(fā)送到RAPI1550以利用BIOS服務(wù)程序之前,必須要在訪問驅(qū)動程序1545和RAPI1550之間建立工作會話。為建立與RAPI1550的工作會話,訪問驅(qū)動程序1545產(chǎn)生工作會話(塊1605)并將請求發(fā)送到RAPI1550(塊1610)。圖12所示為會話請求900的一個實(shí)施例的格式。每個會話請求900包括會話操作代碼905、參數(shù)910清單以及會話簽名915。會話操作代碼905是表示會話操作一個類型的數(shù)值。在一個實(shí)施例中的會話操作的說明性示例可以包括開始或建立會話的操作以及結(jié)束或終止會話的操作。每種會話操作類型都可以請求一個或更多外參數(shù)910清單。在一個實(shí)施例中,該參數(shù)910清單可以是駐留參數(shù)的存儲器位置的指針。每個會話請求900也包括會話請求簽名915以防止諸如計算機(jī)病毒的外來代碼段,從而捕捉和應(yīng)答該請求并中斷BIOS。圖10概述了會話請求的產(chǎn)生。在塊1705和1710中,會話操作代碼表示所需會話操作及所需會話操作插入到會話請求中的所需參數(shù)清單。塊1715、1720和1725顯示了會話請求簽名的產(chǎn)生。在現(xiàn)在密碼技術(shù)中,消息的數(shù)字簽名的產(chǎn)生動作稱為“簽名”消息。要注意的是,對消息進(jìn)行簽名消息或產(chǎn)生數(shù)字簽名的算法在現(xiàn)有技術(shù)中是公知的。還要注意的是,為產(chǎn)生數(shù)字簽名的現(xiàn)有算法通常包括計算將要被簽名消息的散列值和加密使用專用密鑰的散列值,如塊1715、1720和1725所示。設(shè)想全國科學(xué)技術(shù)學(xué)會提出的數(shù)字簽名加密(“DSA”)可被使用。也可以設(shè)想使用Rivest,Shamir和Adleman(“RSA”)算法。然而,需要注意的是,產(chǎn)生數(shù)字簽名的其它算法也可以在本發(fā)明中使用。如圖10中塊1715所示,形成會話消息以使其包括會話操作代碼和參數(shù)清單。在塊1720中,計算會話消息的散列值。要注意的是,計算散列值的算法在現(xiàn)有技術(shù)中是公知的。本領(lǐng)域技術(shù)人員會認(rèn)識到適合于本發(fā)明實(shí)施例的散列函數(shù)是一個可以單向計算并無沖突散列值的函數(shù)。在塊1725中,通過將計算出的使用存儲在當(dāng)前權(quán)限證書中的專用密鑰的會話消息的散列值加密來產(chǎn)生會話請求簽名。權(quán)限證書通常包含使諸如訪問驅(qū)動程序1545和RAPI1550(圖9所示)的系統(tǒng)部件產(chǎn)生安全會話或服務(wù)請示并改變那些請求完整性的足夠的信息。圖11所示為根據(jù)本發(fā)明的一個實(shí)施例的權(quán)限證書800的格式。示范性權(quán)限證書至少包括下列范圍共用密鑰805、專用密鑰810和證書簽名815。如后面所述,存儲在權(quán)限證書中的信息也用來實(shí)施會話和服務(wù)請求的安全限制。返回到圖9中的塊1615,RAPI1550建立如塊1610中訪問驅(qū)動程序1545發(fā)送的會話請求所規(guī)定的會話。圖14概述了所需動作建立會話。在塊1105中,消息根據(jù)會話操作代碼以及在從訪問驅(qū)動程序接收到的有效會話請求清單而建立。計算所建立消息的散列值(塊110)。會話請求簽名從會話請求中抽取并利用包括在當(dāng)前權(quán)限證書的RAPI的拷貝中的共用密鑰來解密(塊1115)。如后面所示,RAPI負(fù)責(zé)產(chǎn)生和支持訪問驅(qū)動程序的權(quán)限證書。然而,RAPI也保留了為其自己使用的大多數(shù)當(dāng)前權(quán)限證書的拷貝。在塊1120中,解密的會話簽名與計算出的所構(gòu)建消息的散列值相比較。如果被計算的散列值等于解密會話請求簽名,則RAPI開始著手起動會話(塊1125)。返回到圖9,建立會話后,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)。計算證書消息的散列值(塊2525)。使用證書消息和新的專用密鑰產(chǎn)生散列值證書簽名(塊2530)。然后將證書簽名插入到新的權(quán)限證書中(塊2535)。返回到圖9,RAPI1550將新的權(quán)限證書發(fā)送回訪問驅(qū)動程序1545(塊1625)。一旦接收到新的權(quán)限證書,訪問驅(qū)動程序1545用新證書中的信息將當(dāng)前權(quán)限證書更新(塊1630)。因此,在新權(quán)限證書中的信息被用來產(chǎn)生后續(xù)的服務(wù)請求。在塊1635中,訪問驅(qū)動程序1545產(chǎn)生服務(wù)請求以調(diào)用RAPI1550的函數(shù)。圖13顯示了根據(jù)當(dāng)前發(fā)明的一個實(shí)施例的服務(wù)請求100的格式。每個服務(wù)請求包括服務(wù)操作代碼1005、參數(shù)1010的清單以及服務(wù)請求簽名1015。服務(wù)操作代碼1005是表示服務(wù)操作類型的數(shù)值。在一個實(shí)施例中的服務(wù)操作的說明性示例可以包括讀或?qū)懘鎯υ诜且资源鎯ζ髦械臄?shù)據(jù)的操作。每種服務(wù)操作的類型可能需要一個或多個包括在參數(shù)清單中的參數(shù)。在一個實(shí)施例中,參數(shù)清單可以是指向參數(shù)束駐留的存儲器位置的指針。每個服務(wù)請求1000還包括服務(wù)請求簽名1015以防止諸如計算機(jī)病毒的外來代碼段,從而捕捉和應(yīng)答該服務(wù)請求使得不能對系統(tǒng)造成嚴(yán)重?fù)p壞。圖15概述了按照當(dāng)前發(fā)明的一個實(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ū)動程序1545將塊1635中產(chǎn)生的服務(wù)請求發(fā)送到RAPI1550中(塊1640)。一旦接收到服務(wù)請求,則RAPI1550處理該請求(塊1645)。圖16示出了根據(jù)當(dāng)前發(fā)明的一個實(shí)施例在處理服務(wù)請求中所需的動作。在塊1305中,從服務(wù)操作代碼和從訪問驅(qū)動程序中接收的服務(wù)請求中可得到的參數(shù)清單中構(gòu)建出消息。計算構(gòu)建消息的散列值(塊1310)。服務(wù)請求簽名從會話請求中抽取并利用包括在當(dāng)前權(quán)限證書的RAPI的拷貝中的共用密鑰來解密(塊1315)。在塊1320中,解密的會話簽名與被計算的構(gòu)建消息的散列值相比較。如果被計算的散列值等于解密會話請求簽名,則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ū)動程序1545。一旦接收到新的權(quán)限證書,訪問驅(qū)動程序1545用新證書中的信息更新當(dāng)前授僅證書(塊1630)。因此,在新權(quán)限證書中的信息會用來產(chǎn)生后續(xù)的服務(wù)請求。在塊1635中,訪問驅(qū)動程序1545產(chǎn)生會話請求以請求RAPI1550結(jié)束當(dāng)前會話。如上所述,圖10概述了包括產(chǎn)生會話請求的動作。隨著會話請求的產(chǎn)生,訪問驅(qū)動程序1545將請求發(fā)送到RAPI1550。一旦收到結(jié)束或終止會話的會話請求,RAPI1550就結(jié)束會話(塊1680)。圖17所示為包括結(jié)束當(dāng)前會話的動作。在塊1405中,從會話操作代碼和從訪問驅(qū)動程序中接收的會話請求中可得到的參數(shù)清單中構(gòu)建出消息。計算構(gòu)建消息的散列值(塊1410)。會話請求簽名從會話請求中抽取并利用包括在當(dāng)前權(quán)限證書的RAPI的拷貝中的共用密鑰來解密(塊1415)。在塊1420中,解密的會話簽名與被計算的構(gòu)建消息的散列值相比較。如果被計算的散列值等于解密會話請求簽名,則RAPI開始進(jìn)行結(jié)束當(dāng)前會話(塊1425)。返回到圖9,結(jié)束會話后,RAPI1550產(chǎn)生新的權(quán)限證書(塊1685)。如上所述,圖15所示為產(chǎn)生權(quán)限證書的過程。然后RAPI1550將新的權(quán)限證書發(fā)送回訪問驅(qū)動程序1545(塊1690)。一旦接收新的權(quán)限證書,訪問驅(qū)動程序1545用新證書中的信息更新當(dāng)前權(quán)限證書(塊1695)。因此,在新的權(quán)限證書中的信息可用來在后續(xù)會話中產(chǎn)生請求。圖9顯示在工作會話中訪問驅(qū)動程序僅產(chǎn)生一個服務(wù)請求。實(shí)際上,在每個工作會話中間可產(chǎn)生多個服務(wù)請求并發(fā)送到RAPI1550??傊景l(fā)明在會話和服務(wù)請求中需要包括數(shù)字簽名來作為安全措施防止系統(tǒng)外來組件(例如病毒)調(diào)用BIOS函數(shù)或服務(wù)程序。而且,每個連續(xù)會話或服務(wù)請求包括利用新的專用密鑰產(chǎn)生數(shù)字簽名以防止外來組件捕捉和應(yīng)答會話和/或服務(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ū)動程序?yàn)橹繟PM的程序提供電源管理服務(wù)。術(shù)語APMBIOS系統(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)存儲器。電源管理內(nèi)核驅(qū)動程序(PM驅(qū)動程序)為服務(wù)提供對BIOSROM,BIOS數(shù)據(jù)和32位服務(wù)的訪問。電源管理服務(wù)(PM服務(wù))為應(yīng)用程序和其他驅(qū)動程序提供電源管理服務(wù)。使用電源管理內(nèi)核驅(qū)動程序(PM驅(qū)動程序)提供的接口將它們的請求翻譯成對BIOS電源管理服務(wù)接口的查詢。PowerPAL鳳凰公司APMBIOS擴(kuò)展,提供系統(tǒng)和設(shè)備電源管理功能的應(yīng)用程序級訪問。系統(tǒng)空閑PM服務(wù)檢測到的在應(yīng)用程序級最小處理的狀態(tài)。在這個狀態(tài)下,只有在空閑優(yōu)先級下運(yùn)行的線程才被執(zhí)行并且它們被任何在更高優(yōu)先級類運(yùn)行的線程所搶占。用戶模式一種應(yīng)用程序代碼運(yùn)行的非專用處理器模式。用戶模式線程不能訪問I/O和系統(tǒng)存儲器。結(jié)構(gòu)概述支撐視窗NT電源管理的BIOS擴(kuò)展分為兩部分(a)BIOS32服務(wù)目錄的修改。增加了一個入口,它允許PM驅(qū)動程序找到BIOS電源管理服務(wù)接口的入口點(diǎn)。(b)新的32位BIOS電源管理服務(wù),它模仿APM32位接口而稍有不同,以下將說明。新的接口提供032位調(diào)用方法,它們更安全和對視窗NT更友好。當(dāng)PM內(nèi)核希望使用BIOS服務(wù)時,它必須進(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ù)目錄包括一個可以被PM驅(qū)動程序檢測的固定結(jié)構(gòu)和返回特定服務(wù)地址的單個函數(shù)。BIOS32服務(wù)目錄頭部實(shí)現(xiàn)BIOS32服務(wù)目錄的BIOS必須在物理地址0E000h-0FFFFFh的范圍內(nèi)的某處嵌入一個特定的連續(xù)16字節(jié)結(jié)構(gòu)。該結(jié)構(gòu)必須是分段對準(zhǔn)的(即,它必須在16字節(jié)邊界開始)。該結(jié)構(gòu)已知為BIOS32服務(wù)目錄頭部。該頭部由六個獨(dú)立的字段組成。以下是每個字段的描述。BIOS32服務(wù)目錄的客戶應(yīng)首先通過定位頭部而確定它的存在。這是通過掃描段增量中0E0000h至0FFFF0h和在每個段的首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ù)目錄在平臺中不存在。BIOS32服務(wù)目錄入口點(diǎn)它的相關(guān)代碼和數(shù)據(jù)可能定位在4GB物理地址空間內(nèi)的任何地方。然而,它必須保證為物理連續(xù)的(即,它將分配在ROM或閃存空間)并容納在兩頁中(即,它不跨過3頁)。BIOS服務(wù)目錄為了找到BIOS32位電源管理服務(wù)接口的入口點(diǎn),PM驅(qū)動程序必須帶以下參數(shù)調(diào)用BIOS服務(wù)目錄INEAX“NTPM”0X4e54504DEBX0x00000000OUTAL錯誤代碼0x00=空,0x81=服務(wù)不存在EBX32位電源管理服務(wù)代碼基地址ECX32位電源管理服務(wù)代碼入口點(diǎn)長度(從EBX)EDX32位電源管理服務(wù)代碼入口點(diǎn)偏移(從EBX)32位電源管理服務(wù)代碼入口點(diǎn)是FAR(即,需要段和偏移兩者壓入堆棧)CS基地址必須小于或等于包含入口點(diǎn)的頁的(4KB)頁地址。例如,如果入口點(diǎn)是0FFF81234H,則基地址必須小于或等于0FFF81000h。該范圍必須使基地址加該范圍生成一個地址大于或等于包含入口點(diǎn)的頁之后的(4kB)頁的最后地址。例如,如果入口點(diǎn)是0FFF81234H則基地址加范圍必須大于或等于0FFF82FFFH。簡而言之,基地址和范圍必須“包圍”包含入口點(diǎn)的頁和隨后頁。段類型必須是100b(代碼,只能可執(zhí)行)或101b(代碼,可執(zhí)行/讀)。但是,服務(wù)目錄的實(shí)現(xiàn)不能假設(shè)CS代碼段的讀訪問。系統(tǒng)位必須是1(非系統(tǒng)段)。推薦描述符專用級(DPL)為0。(CS描述符DPL成為當(dāng)前專用級,或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)段)。描述符專用級(DPL)必須大于或等于CPL(見段0DPL字段)。SS段類型必須是011b(數(shù)據(jù),讀/寫,向下擴(kuò)展)或001b數(shù)據(jù),讀/寫,向上擴(kuò)展)。系統(tǒng)位必須為1(非系統(tǒng)段)。描述符專用級(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專用級(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)相同的功能。有兩個區(qū)別的地方調(diào)用參數(shù)傳遞的方式和支持某些APM連接函數(shù)的方式。調(diào)用參數(shù)APM32位接口傳遞CPU寄存器中所有的參數(shù)。BIOS電源管理服務(wù)接口傳遞參數(shù)至堆棧。等效C形式聲明可以是typedefstruct(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;unsignedcharBPMSI(regStruct*parameters);活動APM函數(shù)和它的動作由寫入相應(yīng)的寄存器字段中的值決定。PDBA字段是指向內(nèi)核驅(qū)動程序映射BIOS數(shù)據(jù)區(qū)使它可被服務(wù)入口訪問的虛擬地址的指針。如果發(fā)生錯誤,regFlags的位0將是1和錯誤碼將是regEAX的位8-15,否則它將是0和regEAX的位8-15將為0。錯誤碼與APM1.2標(biāo)準(zhǔn)中的相同。軟件要求開發(fā)軟件要求建立PM服務(wù)要求的以下軟件開發(fā)工具M(jìn)ASM6.11C匯編器,微軟公司鳳凰PhDebug,用于跟蹤代碼軟件要求PM服務(wù)要求在以下環(huán)境運(yùn)行視窗NT4.0鳳凰NoteBIOS系統(tǒng),支持至PowerPAL的NTBIOS接口系統(tǒng)中安裝的PM驅(qū)動程序端口變化以下部分描述在Core,Miser和芯片組代碼中修改的文件。它還描述為正常BIOS接口至包含NT支持所需的變化。附錄BPhoneixPhlashNT視窗NT的閃存ROM編程工具附錄B中的PhoenixAD驅(qū)動程序是指訪問驅(qū)動程序46。1.0PhoenixPhlash閃存工具將用于將BIOS映象編程入AT兼容系統(tǒng)的閃存ROM中。該工具包括以下文件PHLASHNT.EXE用于對閃存ROM編程PLATFORM.DLL用于執(zhí)行平臺無關(guān)的函數(shù)BIOS.ROM被編程入閃存ROM的實(shí)際BIOS映象這份說明提供了PHLASHNT.EXE程序功能的詳細(xì)說明。因?yàn)镻LATFORM.DLL和BIOS.ROM是與平臺有關(guān)的,在這份文件中只覆蓋了這兩個文件的一般格式。PhoenixPhlash將作為Win32控制臺應(yīng)用程序執(zhí)行。這個設(shè)計工程的靈活性,適應(yīng)性和支持性是非常優(yōu)先的。在PLATFORM.DLL文件中盡可能放入更多的定制功能使得可以不修改PHLASHNT.EXE而支持許多不同的平臺和配置。PhoenixPhlash將支持有單一閃存ROM部件的平臺以及帶多個閃存ROM的平臺。1Mb-4Mb的閃存ROM可以容納包括引導(dǎo)塊設(shè)備和有多個可擦區(qū)的任何配置的設(shè)備。對于每個支持的部分,指定給特定閃存ROM部分的所有代碼(例如,英特爾28Fxxxx)將是PHLASHNT.EXE模塊的一部分。與平臺有關(guān)的所有代碼和參數(shù)(例如,擦除使能代碼和閃存ROM地址區(qū))將是PLATFORM.DLL模塊的一部分。PHLASHNT.EXE,Phoenixhlash工具的主要模塊,將包含與平臺無關(guān)的所有代碼。它將包含用戶界面代碼,加載和確認(rèn)PLATFORM.DLL文件的代碼和與平臺無關(guān)代碼以對閃存設(shè)備編程。PHLASHNT.EXE將是一個Win32可執(zhí)行文件,用微軟C++V4.2或其后版本生成。使用Cdriver訪問硬件PHLASHNT.EXE使用CdriverC++類,它與PhoenixAD驅(qū)動程序一起使視窗NT用戶模式應(yīng)用程序能夠訪問I/O端口,訪問BIOS設(shè)計和代碼區(qū);和執(zhí)行BIOS32服務(wù)。Cdriver類提供一個簡單和靈活的在應(yīng)用程序和PhoenixAD動程序之間的接口。Cdriver與PhoenixAD驅(qū)動程序一起為用戶模式應(yīng)用程序提供以下功能訪問I/O端口執(zhí)行BIOS32服務(wù)訪問BIOS映象訪問BIOS數(shù)據(jù)區(qū)讀取相同實(shí)時時鐘Cdriver類作為視窗NT應(yīng)用程序和PhoenixAD驅(qū)動程序之間的一個薄包裝接口。它封裝了驅(qū)動程序的接口和提供應(yīng)用程序和內(nèi)核驅(qū)動程序設(shè)計兩者的靈活性。為保證將來的兼容性,PHLASHNT.EXE不直接調(diào)用PhoenixAD驅(qū)動程序;相反,它調(diào)用Cdriver類中的方法。2.0運(yùn)行模式2.1Win32控制臺PHLASHNT.EXE在一個視窗NT中的窗口中開始,之后是可選的命令行標(biāo)志(如果有)。命令行標(biāo)志將包括(大小寫都可接受)/AAUTODETECTOFF-不從該部分讀取ID。缺省的,程序確認(rèn)制造者ID和和從部件中讀取的部件ID,比較PLATFORM.DLL文件中指定的ID和當(dāng)兩個ID不同時,使用從部件讀取的ID。這使得多個不同部件采用相同的PLATFORM.DLL和BIOS.ROM而不需要修改這兩個文件。當(dāng)該標(biāo)記不被設(shè)置時,假設(shè)ID是從部件“可讀”的。當(dāng)該標(biāo)記被設(shè)置,來自部件的ID不被使用,相反使用PLATFORM.DLL中指定的值。/B=文件名BINARYFILE-覆蓋缺省平臺特定二進(jìn)制文件。當(dāng)需要全路徑指定時和/或二進(jìn)制文件有一個不是PLATEFORM.DLL的文件名時,這個選項(xiàng)是必須的。/BU=filenameBACKUP-在被刪除之前將BIOS映象的以前版本存入文件filename。Filename是可選的;如果未指定,以前的映象存入BIOS.BAK。因?yàn)锽IOS的多個版本使用與平臺有關(guān)的特性,如陰影存儲器和解壓縮,所以經(jīng)常需要使用PLATFORM.DLL中與平臺有關(guān)的代碼而在它被寫入文件前取回BIOS映象。/CCMOSUPDATE-在閃存被更新后清除CMOS校驗(yàn)求和。如果AUTO_UPDATE特性安裝在新的BIOS映象中,在下一次引導(dǎo)時BIOS自動設(shè)置所有的CMOS字段至它們的缺省值。如果AUTO_UPDATE特征未加載,BIOS在下一次引導(dǎo)顯示CMOS校驗(yàn)求和錯誤信息并提示用戶按F2鍵以執(zhí)行Setup和手工重配置機(jī)器。/CSCHECKSUMBIOSROM-在BIOSROM映象上計算校驗(yàn)求和。如果校驗(yàn)求和不為0,或如果可選的PLATFORM.DLL函數(shù)CheckSum失敗,程序帶有錯誤信息終止。/HUSAGE-顯示程序名,版本,版權(quán)和幫助屏。/也可用于這個選項(xiàng)。/IIMAGESIZEVERIFICATION-只有ROM映象的文件大小與閃存部分大小相同時才運(yùn)行。/MODE=nOPERATION-為PHLASHNT選擇一個運(yùn)行模式。當(dāng)前支持以下模式0只更新BIOS映象(正常運(yùn)行模式)。在該模式下,PHLASHNT用新的映象代替當(dāng)前BIOS映象。系統(tǒng)BIOS中的DMI信息被保持。這是缺省模式和如果沒有/MODE命令行標(biāo)記或如果沒有指定運(yùn)行模式,這是缺省模式。1只更新DMI信息。在這個模式中,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版本和生成日期和時間,與BIOS.ROM文件中的相應(yīng)的結(jié)構(gòu)相同,則程序不閃(flashing)而終止。/OOVERRIDEPLATFORM.DLLOPTIONS-禁止PLATFORM.DLL中設(shè)置的所有標(biāo)志。沒有這個開關(guān),PLATFORM.DLL中設(shè)置的選項(xiàng)與命令行中指定的選項(xiàng)組合。當(dāng)這個開關(guān)被使用,只使用命令行選項(xiàng)。/PPRODUCTION-閃的最大速度。所有的用戶反饋被減到最小(沒有聲音,屏幕更新)。這用于減少在生產(chǎn)環(huán)境中閃一個部分所需的時間。只報告最后的成功/失敗。/PNBIOSPARTNUMBERCHECK-只有BIOS.ROM中的BIOS部件號與當(dāng)前BIOS部件號相同時才進(jìn)行。/PF=“l(fā)istofoptions”被傳遞到與平臺有關(guān)模塊PLATFORM.DLL的命令行選項(xiàng)。在一些平臺中,它希望傳遞命令行選項(xiàng)至平臺有關(guān)過程。這是通過CmdLine()函數(shù)實(shí)現(xiàn)。當(dāng)CmdLine()地址是非零和這個命令行選項(xiàng)出現(xiàn),緊接著等號的串被傳遞至PLATFORM.DLL(如果串中包含空格,包括雙引號中的串)。/RnRETRY-如果閃塊失敗,重試n次而不終止。/Rn選項(xiàng)通過在PLATFORM.CPP中設(shè)置psiRetryCount為希望的重試次數(shù)而被用于緊急模式。/SSILENT-無聲運(yùn)行而沒有聲音反饋。/VVERIFY-每個塊被編程后,閃部件地址空間中的數(shù)據(jù)與BIOS.ROM文件中的數(shù)據(jù)進(jìn)行比較。任何差別被報告和程序被相同塊重試編程或系統(tǒng)暫停(根據(jù)對提示的響應(yīng))。因?yàn)闄z查是在閃存被擦除后進(jìn)行的,系統(tǒng)將非常不穩(wěn)定和不可能正確提示用戶和恢復(fù)。/ZZEROBLOCKS-在擦除前零閃塊。filenameBIOSROM映象文件名。前面沒有反斜杠的任何命令行選項(xiàng)被解釋為BIOSROM映象文件的文件名。只有當(dāng)需要指定ROMBIOS映象和/或ROMBIOS映象文件不同于BIOS.ROM時才需要文件名。@filename響應(yīng)文件。上述任何命令行選項(xiàng)可以置于響應(yīng)文件中。PHLASHNT將讀取這個文件并作為輸入的命令行進(jìn)行處理。選項(xiàng)可以置于一行或不同行。每行最多1024個字符。以下命令行標(biāo)志用于寫信息至閃存以便其后通過鳳凰桌面管理接口(DMI)取回。DMI命令行標(biāo)志被忽略,如果目標(biāo)BIOS映象不支持DMI接口(沒有安裝DMIBCP結(jié)構(gòu))或PHLASHNT運(yùn)行模式只是BIOS(見以上)。所有標(biāo)志都有格式/DxxString,其中xx是識別指定DMI串的(見以下)一或兩個字符。DMI命令行標(biāo)志是可選的;即,如果一個給定的DMI命令行標(biāo)志不被指定,相應(yīng)的DMI串緩沖的以前的內(nèi)容不被修改,除非在PLATFORM.DLL中指定了缺省串。這種情況下,PHLASHNT總是寫入缺省串至相應(yīng)的DMI串緩沖。如果DMI命令標(biāo)志被指定而沒有String字段,相應(yīng)的DMI串緩沖被清空(置為空串)。String只能包含可打印ASCII字符。String如果含有空格,則必須包含在引號中。每個DMI串的最大長度是與平臺有關(guān)的;PHLASHNT返回有關(guān)錯誤信息,如果傳遞的串長過相應(yīng)的目標(biāo)緩沖。當(dāng)前支持以下的DMI字段。這些選項(xiàng)為了安全理由不能由幫助(/H)選項(xiàng)顯示。/DSSString指定系統(tǒng)序列號串/DMSString指定系統(tǒng)制造商名串/DPSString指定系統(tǒng)產(chǎn)品(模塊)識別串/DVSString指定系統(tǒng)版本串/DSMString指定母板序列號串/DMMString指定母板制造商名串/DPMString指定母板產(chǎn)品(模塊)識別串/DVMString指定母板版本串/DSCString指定機(jī)箱序列號串/DMCString指定機(jī)箱制造商名串/DPCString指定機(jī)箱產(chǎn)品(模塊)識別串/DVCString指定機(jī)箱版本串/DOlString指定OEM串l/DOnString指定OEM串n系統(tǒng)和機(jī)箱開關(guān)只用于DMI版本2.0命令行的舊形式,見以下,原用于DMI1.2并保持兼容。它們分別相當(dāng)于/DSM,/DPM和/DVM。/DSString指定母板序列號串/DMString指定母板制造商名串/DPString指定母板產(chǎn)品(模塊)識別串/DVString指定母板版本串接下來,閃存程序?qū)⒓虞dPLATFORM.DLL文件和調(diào)用PLATFORM.DLL中的與平臺有關(guān)函數(shù)EnableFlash()為閃準(zhǔn)備平臺。PLATFORM.DLL指示BIOSROM將在存儲器中加載的存儲器區(qū)域和指示哪個存儲器區(qū)域被用于閃設(shè)備。存儲器區(qū)域可以在傳統(tǒng)存儲器中或在擴(kuò)展存儲器中。在ROM映象被加載至存儲器后,設(shè)備編程開始。對于被編程的每個閃存ROM塊1.BeginFlash()在PLATFORM.DLL中被調(diào)用2.PHLASHNT.EXE中的正確算法被執(zhí)行。3.EndFlash()在PLATFORM.DLL中被調(diào)用該過程在每個PLATFORM.DLL中指定的閃存塊重復(fù)。這用于單個平臺中的多個設(shè)備,一個設(shè)備中的多個塊和每個塊的塊相關(guān)初始化/終止代碼。這還用于存儲器區(qū)域的自動保存和恢復(fù),例如引導(dǎo)塊。在閃期間,過程信息被顯示給用戶1.如果生產(chǎn)模式未被選擇,一個適合的消息窗口被顯示在屏幕上,其中包括時間,氣體表形式的進(jìn)度指示和狀態(tài)行消息。2.大約一秒一次短蜂鳴。3.在每步的開始和結(jié)束,一個適合的代碼被發(fā)送這跟蹤端口。視頻至少被一秒更新一次。聲音大約每秒生產(chǎn)一次。注意生產(chǎn)環(huán)境過程更新可以被禁止。在閃完成之后,DisableFlash()被從PLATFORM.DLL文件中執(zhí)行。兩個不同的聲音之一被生產(chǎn)以指示閃過程的成功或失敗。如果有視頻,適合的消息窗口被顯示。在短暫的暫停后系統(tǒng)重引導(dǎo)。2.3完成代碼雖然程序通過許多步驟進(jìn)行和能夠報告給用戶每個步驟的狀態(tài),只有三個主要階段被聲音和鍵盤LED代碼識別。三個主要階段是1.讀和確認(rèn)PLATFORM.DLL文件2.進(jìn)行平臺有關(guān)的初始化3.部件編程如果程序不能完成任何閃過程的三個主要階段,程序?qū)⑹褂脜^(qū)別的聲音序列和鍵盤LED以通知用戶在哪個階段失敗。在程序的開始,鍵盤的CAPS_LOCK,NUM_LOCK和SCROLL_LOCKLED打開。三個階段的每一個的失敗指示如下聲音鍵盤LED開描述低蜂鳴+3短音CAPS,NUM,SCROLL1.開始讀platform.dll前低蜂鳴+2短音CAPS,NUM,2.初始平臺前低蜂鳴+1短音NUM3.初始平臺后一個長音無成功完成階段1-失敗發(fā)生在定位PLATFORM.DLL之前。最可能是因?yàn)镻LATFORM.DLL文件格式錯誤。系統(tǒng)處于穩(wěn)定模式,BIOS沒有發(fā)生改變,不需要重引導(dǎo)。階段2-在平臺有關(guān)初始時失敗。系統(tǒng)不穩(wěn)定和需要重引導(dǎo)。BIOS未發(fā)生改變。階段3-在對閃存編程時發(fā)生失敗。系統(tǒng)不穩(wěn)定和BIOS閃存被破壞。系統(tǒng)必須用急救軟盤重新開始。該程序還在每個步驟進(jìn)行錯誤檢測。除非通過PRODUCTION選項(xiàng)明確禁止,在程序進(jìn)行時,在屏幕和跟蹤端口報告當(dāng)前進(jìn)行的步驟的步驟號,或錯誤代碼。錯誤的代碼號和程序在附件B2中被進(jìn)一步定義。當(dāng)在對閃存部件作出任何改變之前檢測到錯誤,程序?qū)⒃噲D通知用戶和帶有正確的錯誤消息而退出PHLASHNT。一旦閃存被修改,錯誤將使程序停止。2.4設(shè)備相關(guān)模塊對于支持的每種閃存類型,將有一個部件指定模塊進(jìn)行以下1.識別部件和返回制造商ID和部件ID2.清零閃存范圍(設(shè)置所有位為0)3.擦除閃存范圍(設(shè)置所有位為1)4.編程閃存范圍2.4.1自動檢測這個模塊是從閃存部件中讀取制造商ID和部件ID所需的代碼。如果不能確定這些ID,返回零。當(dāng)在PLATFORM.DLL文件中提供AutoSense()函數(shù);內(nèi)置自動檢測模塊不被采用;而采用提供的AutoSense()函數(shù)。2.4.2零有一些類型要求在被編程前閃存被置為零。這個模塊中是設(shè)置存儲器范圍為零所需的代碼。2.4.3擦除大多數(shù)閃存部件要求在部件被編程前置為1。這些部件經(jīng)常允許用一個寫操作擦除閃存的整個塊。在該模塊中是將存儲器范圍置為1必須的代碼。當(dāng)塊描述符在PLATFORM.DLL文件中被定義時,必須建立描述符使閃存中每個“可擦除”塊有至少一個描述符。例如在英特爾28F004閃存中,有一個16K字節(jié)BOOT塊,兩個8K字節(jié)PARAMETER塊,一個96K字節(jié)MAIN塊和三個128K字節(jié)EXTENDED塊。七個塊中的每一個能用一個寫擦除和七個塊的每一個必須有至少一個描述符。2.4.4程序在這個模塊中是從BIOSROM映象中讀取數(shù)據(jù)字節(jié)和將它們編程進(jìn)閃存部件所需的代碼。2.5支持的設(shè)備由PHLASHNT.EXE支持的閃存設(shè)備的初始設(shè)置包括下表列出的部件。對于每個部件類型,列出了制造商和部件ID和部件描述。當(dāng)有新的部件時,需要增加新的模塊至PHLASHNT.EXE使得可以提供閃算法的新類型(新的AutoDetect(),Zero(),Erase(),Program()函數(shù))。如果新的部件可能使用已有的算法而只是制造商和部件ID改變了,可以在PLATFORM.DLL文件中指出并不需要修改PHLASHNT.EXE(詳情見PartTypes部分)。類型MfgIDPartID描述20x010xA1AMD28F25620x010x25AMD28F51210x010xA7AMD28F51210x010xA2AMD28F010A20x010x2AAMD28F02020x010x29AMD28F020A20x010x20AMD29F01020x010xA4AMD29F04020x010x51AMD29F200T100x010xB0AMD29F002T100x010x34AMD29F002B100x010xDCAMD29F002BXT100x010x5DAMD29F002BXB30x1F0xD5ATMEL29C01080x1F0xDAATMEL29C02030x1F0x35ATMEL29LV01010x1C0xD0Mitsubishi28F10110x890xB9Intel28F25610x890xB8Intel28F51210x890xB4Intel28F01010x890xBDIntel28F02040x890x94Intel28F001BX-T40x890x95Intel28F001BX-B40x890x7CIntel28F002BX-T40x890x7DIntel28F002BX-B40x890x74Inetl28F200BX-T40x890x75Intel28F200BX-B40x890x78Intel28F004BX-T40x890x79Intel28F004BX-B40x890x70Intel28F400BX-T40x890x71Intel28F400BX-B50x890x07SST29EE010/29LE010120x890x10SST29EE02050xBF0x5DSST29EE51260xBF0x04SST28SF04010x200x07STM28F10170xC20x11MX28F1000110xC20x2AMX28F20003.0PLATFORM.DLL詳情該模塊包含所有與平臺有關(guān)的代碼和在特定平臺上對閃存編程所需的參數(shù)。3.1文件格式PLATFORM.DLL是視窗DLL,由PLATFORM.CPP編譯生成(使用微軟VisualC++4.2或其后版本)。它包含特定的平臺數(shù)據(jù)和可執(zhí)行代碼。PLATFORM.CPP文件的一個例子包含在附件B3中。PLATFORM.DLL的文件版本將從版本“NT1.00”開始。版本是由包含在PLATFORM.DLL中包含的szVersion變量指定。3.2文件頭部格式PLATFORM.DLL文件有以下描述的格式∥------------------------∥全局變量聲明∥------------------------DWORDdwFileSize∥ROM映象文件大小BYTEbManufactID∥閃存制造商BYTEbPartID∥閃存設(shè)備部件IDDWORDdwFlags∥選項(xiàng)標(biāo)志DWORDdwImageBuf∥映象文件的線性地址DWORDdwMfgIDAddr∥制造商ID的線性地址DWORDdwPartIDAddr∥部件ID的線性地址BYTEbRetryCount∥Rn選項(xiàng)計數(shù)(缺省=0)charszVersion[]∥PLATFORM.DLL版本charszROMFileName[]∥BIOS映象文件名DWORDdwDLLFuncDefine∥指示哪個函數(shù)被定義BYTEBBLOCKtABLEsIZE∥blockTable中塊的個數(shù)BLOCK_DESCRIPTORblockTable[]BYTEbpartTypesSize∥增加的閃存部件數(shù)DEVICETABLEpartTypes[]dwFileSizeBIOS.ROM文件中字節(jié)數(shù)bManufactID制造商IDbPartID部件IDdwFlags選項(xiàng)標(biāo)志。必須是以下值的組合FLAG_AUTOSENSEOFF不從部件讀取IDFLAG_BACKUP備份系統(tǒng)BIOSROMFLAG_NEWBIOSONLY如果在F0000的64K相同,則不閃FLAG_PRODUCTION最大速度(聲音和視頻關(guān))FLAG_SILENT不產(chǎn)生任何聲音FLAG_VERIFY在閃后確認(rèn)每個塊FLAG_PLATFORMCMDPLATFORM選項(xiàng)串存在FLAG_BIOSPARTNUM閃相同的BIOS部件號FLAG_CHECKSUM校驗(yàn)求和BIOS.ROMFLAG_CMOS清CMOS校驗(yàn)求和FLAG_IMAGESIZE確認(rèn)映象大小與閃存部件匹配DwImageBufBIOS.ROM映象在擴(kuò)展存儲器中緩沖的地址。該字段確定映象被讀入的緩沖區(qū)線性地址。該區(qū)域還在SAVE線性被指定時使用。被存儲的任何塊將使用dwImageBuffer+dwFileSize開始的地址范圍。dwMfgIDAddrdwPartIDAddr這兩個可選字段包含閃存ID字節(jié)的線性地址。當(dāng)這些字段是零時,使用缺省地址E00O0h和E0001h。BRetryCount如果閃失敗重試的次數(shù)。SzVersionPLATFORM.DLL的版本SzROMFileName保留給串“BIOS.ROM”。該字段用于識別和確認(rèn)PLATFORM.DLL文件的格式。DwDLLFuncDefine指出在PLATFORM.DLL中定義了哪些與平臺有關(guān)的函數(shù)。BblockTableSize在blockTable中描述的塊的個數(shù)。DwBlockTable閃存部件一次被編程一個連續(xù)塊。被編程的每塊必須有相應(yīng)的描述符。BpartTypesSize增加的閃存部件個數(shù)DwPartTyes支持的閃存部件的選項(xiàng)表。表的每項(xiàng)有以下格式Typedefstruct{BYTECmFGid;∥制造商IDBYTEcPartID;∥部件IDWORDwFlashType∥閃算法類型CharszPartName[28]∥可選描述}DEVICETABLE;設(shè)備表由描述符終止,cMfgID,cPartID,wFlashType被置為0。許多平臺允許多個不同的部件采用相同的BIOS.ROM映象。當(dāng)有新的部件時,部件不在PHLASHNT.EXE當(dāng)前支持的部件中時和該部件采用與支持的部件中的一個所用的閃算法相同時,采用該表。ProcEnable使能閃過程ProcDisable禁止閃過程ProcBegin閃過程開始ProcEnd結(jié)束閃過程ProcGetBlock為備份過程取得下一個BIOS塊ProcCmdLine處理定制命令行選項(xiàng)過程ProcSense定制autosense過程ProcIsflashable定制OEM過程以確定是否可以進(jìn)行ProcReboot定制重引導(dǎo)過程ProcCheckSum如果BIOSROM映象的校驗(yàn)求和不為零,定制采用的校驗(yàn)求和過程在附件B3中示出PLATFORM.DLL的示例性源代碼。3.3塊表格式塊表包含塊描述符的列表。表中的每個塊描述符由以下結(jié)構(gòu)定義typedefstruct{DWORDdwBlockSize;∥塊中的字節(jié)數(shù)DWORDdwFileOffset;∥BIOS.ROM文件中的偏移DWORDdwLinearAddress;∥閃存ROM的線性32位地址BYTEcMfgID∥制造商ID或0BYTEcPartID∥部件ID或0WORDwBlockAttr∥塊屬性}BLOCK_DESCRIPTOR;塊表由描述符終止,所有入口置為0。DwBlockSize塊的字節(jié)大小。塊必須連續(xù)DwFileOffsetBIOS.ROM文件中該塊的偏移DwLinearAddress該塊在32位地址空間中的起始地址CmfgID制造商ID或?yàn)?自動檢測CpartID部件ID或?yàn)?自動檢測WBlockAttr確定對該塊進(jìn)行的動作。必須是以下標(biāo)志的組合ATTR_ZERO在被編程前塊必須被置為0ATTR_ERASE在被編程前塊必須被擦除ATTR_SAVE在被編程前保存該塊內(nèi)容ATTR_PROG編程該塊ATTR_RESTORE在編程后恢復(fù)該塊內(nèi)容一次只能使用ATTR_SAVE,ATTR_PROG,ATTR_RESTORE中的一個。如果未指定屬性,PHLASHNT.EXE不改變塊。但是,即使所有這些被省略,還調(diào)用BeginFlash()和EndFlash()。BeginFlash()和EndFlash()當(dāng)兩塊在不同的閃存設(shè)備上時使用,或引導(dǎo)塊要求附加函數(shù)以使能塊寫入或在下一個編程前禁止它時使用。BeginFlash()還被用于條件塊處理。如果BeginFlash()返回非零,當(dāng)前塊不處理。每個ATTR_SAVE塊在另一個ATTR_SAVE塊被使用前,其后必須是ATTR_RESTORE塊。注意對于給定閃存存儲器范圍,可以有多個描述符。例如對于64K可擦除閃存中保留的16K閃存引導(dǎo)塊,可以使用3個塊描述符。第一個描述符保存16K引導(dǎo)塊,第二個擦除和編程64K和第三個恢復(fù)引導(dǎo)塊。為減少閃所需的時間,推薦不使用ATTR_ZERO標(biāo)志,因?yàn)檫@將避免清零步驟和減少一半閃時間。只有很少舊的閃存類型建議在重編程前進(jìn)行部件清零。大多數(shù)部件不要求這個操作。3.3.3多閃存塊使用塊表以支持多設(shè)備閃和每個設(shè)備多塊。對于這種平臺,ROM映象文件必須包含被編程的所有閃存部件的映象和塊表必須包含被閃的數(shù)據(jù)的每個塊的正確偏移和長度。為了在每個閃存塊之前和之后正確配置平臺,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存儲為了在一個閃存中編程一個存儲器區(qū)域,可能對相同的存儲器區(qū)域不得不有多個不同的塊描述符。這可能需要保護(hù)在單個“擦寫”存儲器區(qū)域中的引導(dǎo)塊或ESCD存儲器許多閃存部件有少量的寫操作作擦寫,每個存儲器塊一個(例如英特爾28F400閃存有7個塊(一個16K引導(dǎo)塊,兩個8K參數(shù)塊,一個64K主塊和3個128K擴(kuò)展塊)。這些部分只能用7個寫操作擦除。)對于其他部件,擦除功能可以一次擦除64K閃存,不論該范圍被分為引導(dǎo)和參數(shù)塊。在這種情況下,重要的是存儲器的每個64K塊有3個塊描述符。表中的第一個塊描述符用于保存引導(dǎo)塊,第二個塊描述符擦除和編程參數(shù)塊和第三個描述符在該范圍恢復(fù)引導(dǎo)塊。一些部件要求在引導(dǎo)塊被編程前進(jìn)行附加的平臺相關(guān)動作。例如英特爾部件要求VHH電壓,及VPP電壓被正確設(shè)置。在這種情況下,塊描述符必須在BeginFlash()和EndFlash()過程中有這種函數(shù)(在每個塊之前和之后調(diào)用)。3.3.5塊表實(shí)例以下是PLATFORM.CPP的“blockTable”部分中的代碼。擦除FC000處的4KB塊DD4*1024;4KBDD0;文件偏移DD000FC000h;該塊的線性地址DB0;制造商ID(0=缺省)DB0;部件ID(0=缺省)DWATTR_ERASE;動作標(biāo)志清零,之后在指定部件在E000處編程128KB塊DD128*1024;128KBDD0;文件偏移DD000FC000h;該塊的線性地址DB0;制造商ID(0=缺省)DB0;部件ID(0=缺省)DWATTR_ERASE;動作標(biāo)志3.4PLATFORM.DLL函數(shù)當(dāng)前支持的函數(shù)是包含在PLATFORM.DLL中的以下函數(shù)被PHLASHNT.EXE訪問以實(shí)現(xiàn)平臺相關(guān)功能EnableFlashDisableFlashBeginFlashEndFlashGetBlockCmdLineAutoSenseIsFlashableRebootCheckSum以下函數(shù)允許PHLASHNT.EXE訪問包含在PLATFORM.DLL中的全局變量和數(shù)據(jù)結(jié)構(gòu)GetBIOSFileSizeGetManufactIDGetPartIDGetFlagsGetImageBufGetMfgIDAddrGetPartIDAddrGetRetryCountGetblockTableSizeGetpartTyupesSizeGetBlockTableGetpartTypesGetDLLVersionGetROMFileNameGetDLLFuncDefine3.4.1函數(shù)EnableFlash()入口無返回錯誤代碼(或零)該函數(shù)必須出現(xiàn)在PLATFORM.DLL中。在任何試圖訪問閃存前調(diào)用它。這個函數(shù)進(jìn)行的動作包括映射閃存至存儲器禁止高速緩存,陰影和電源管理刷新高速緩存禁止PCI橋使能ROM以寫(VPP開)大多數(shù)平臺要求在部件被使能閃前改變一個跳接器。EnableFlash()過程必須確認(rèn)這個跳接器已被去除并返回一個錯誤代碼,如果它確定該跳接器設(shè)置錯誤。錯誤代碼見附件B。3.4.2函數(shù)DisableFlash()入口無返回錯誤代碼(或0)該可選函數(shù)在最后一個塊被編程(或檢測到錯誤)后被調(diào)用。在PHLASHNT.EXE退出前被立即調(diào)用(一般作為重引導(dǎo)前的最后一個函數(shù))。該函數(shù)一般進(jìn)行的動作包括禁止ROM寫入(VPP關(guān))3.4.3函數(shù)BeginFlash(DWORDBlock_Index)入口將被編程的塊的索引(或如果不使用表為0)退出無返回錯誤代碼(或0)這個可選函數(shù)被PHLASHNT.EXE在該閃存塊被處理前立即被調(diào)用。它為(在塊表中找到的)每個塊調(diào)用。該函數(shù)一般進(jìn)行的動作包括在它被擦除前保存引導(dǎo)塊從一個設(shè)備轉(zhuǎn)換到另一個(在有多個設(shè)備的平臺上)使能VHH使引導(dǎo)塊重編程確定是否當(dāng)前塊被處理如果BeginFlash()返回非零,當(dāng)前塊不被處理。3.4.4函數(shù)EndFlash(DWORDBlock_Index)入口剛被編程的塊的索引(如果不使用表為零)返回錯誤代碼(或零)這個可選函數(shù)被PHLASHNT.EXE在該閃存塊被處理后立即被調(diào)用。它為(在塊表中找到的)每個塊調(diào)用。該函數(shù)一般進(jìn)行的動作包括恢復(fù)由BeginFlash()函數(shù)保存的引導(dǎo)塊在編程兩個不同設(shè)備之間去除禁止VHH,如果引導(dǎo)塊剛剛被編程3.4.5函數(shù)GetBlock(DWORDIndex,DWORDBuffer_Address)入口被拷貝塊的索引和64K緩沖區(qū)線性地址退出用現(xiàn)有的BIOSROM映象的下一個塊填寫緩沖區(qū)返回負(fù)錯誤代碼,零,或正塊索引當(dāng)/BACKUP標(biāo)志被指定時,PHLASHNT.EXE調(diào)用可選函數(shù)。GetBlock()用于在閃存被改變之前保存閃存已有內(nèi)容。因?yàn)樵S多的BIOS映象被解壓縮至陰影RAM,PHLASHNT.EXE不是總可以訪問所有的BIOSROM映象而沒有平臺相關(guān)相同設(shè)置。函數(shù)GetBlock()需要允許平臺相關(guān)訪問已有的BIOSROM映象。BIOSROM映象被PHLASHNT.EXE保存,使用以下步驟1.調(diào)用GetBlock(Index,Buffer)而Index置為0和64K緩沖區(qū),由參數(shù)緩沖區(qū)指向,填入預(yù)定義方式。如果緩沖區(qū)的方式未被改變,程序帶錯誤退出。如果方式被改變,方式被作為第一個64K塊存入BIOS.BAK文件。之后程序進(jìn)行到下一步。2.調(diào)用GetBlock(Index,Buffer),Index置為前一個GetBlock()調(diào)用的返回值,保存64K緩沖區(qū)至BIOS.BAK和重復(fù)直至GetBlock()的返回值是非正數(shù)。3.如果GetBlock()返回的最后一個值是零,則進(jìn)行存儲器閃。如果最后返回值是負(fù)錯誤代碼,報告錯誤,刪除BIOS.BAK并退出。GetBlock()實(shí)現(xiàn)的任務(wù)是保證平臺處于正確狀態(tài)以允許GetBlock()拷貝BIOSROM映象至緩沖區(qū)和在GetBlock()返回控制至PHLASHNT.EXE前平臺恢復(fù)至原來模式。特別是,GetBlock()在調(diào)用EnableFlash()前被調(diào)用。傳遞給GetBlock()的緩沖區(qū)指針總是在64K以下的真實(shí)存儲器范圍,允許直接傳遞至磁盤。3.4.6函數(shù)CmdLine(char*szOptions)入口有平臺指定命令行選項(xiàng)的串指針返回錯誤代碼(或0)該選項(xiàng)函數(shù)由PHLASHNT.EXE在PLATFORM.DLL被讀入后立即調(diào)用。包含所有的平臺指定命令行參數(shù)的字符串的地址被傳入(在等號后被指定/PLATFORM=”命令行選項(xiàng)”)。如果有的話字符串包括包括前和后雙引號。3.4.7函數(shù)AutoSense()入口由PLATFORM。INI頭部取回的制造商和設(shè)備ID返回從閃存部件取回的新的ID(或0)這個函數(shù)被PHLASHNT.EXE在在PLATFORM.DLL中的EnableFlash()函數(shù)被調(diào)用后立即被調(diào)用。當(dāng)“非標(biāo)準(zhǔn)”存儲器組織被用于閃存時,AutoSense()函數(shù)使能自動檢測閃存部件。例如,當(dāng)兩個分開的部件被用于偶和奇BIOS地址(在這種情況下,傳統(tǒng)自動檢測將失敗),該函數(shù)被用于獲得和確認(rèn)每個部件的ID。ID是一字節(jié)長和被放入一個DWORD,制造商ID放入BYTE0而設(shè)備ID放入BYTE1。3.4.8函數(shù)IsFlashable(charfar*szErrorMsg)入口包含返回的錯誤信息字符串的指針退出szErrorMsg包含錯誤信息串返回錯誤代碼(或0)該可選函數(shù)在EnableFlash()前調(diào)用確定是否可以進(jìn)行處理前被調(diào)用。如果函數(shù)返回非零錯誤代碼,字符串szErrorMsg被顯示并且程序終止。最多254加一個空終止符可以在szErrorMsg中返回。如何使用它的一個例子是對于相同平臺,OEM出售帶或不帶即插即用功能的系統(tǒng)。IsFlashable()函數(shù)能夠確定系統(tǒng)當(dāng)前是否是即插即用和在沒有它的系統(tǒng)中不閃即插即用BIOS。3.4.8函數(shù)Reboot()入口無返回?zé)o這個可選函數(shù)在編程結(jié)束后被調(diào)用以復(fù)位系統(tǒng)。如果被提供,它被調(diào)用而代替PHLASHNT自己的重引導(dǎo)代碼。3.4.10函數(shù)CheckSum()入口無返回錯誤代碼(或0)在編程前調(diào)用這個可選函數(shù)確定BIOSROM允許的校驗(yàn)求和是否正確。一般,NuBIOS映象的BIOSROM映象校驗(yàn)求和是零。當(dāng)已知ROM映象校驗(yàn)求和將不是零時,這個例程可以用于提供另一種校驗(yàn)求和確認(rèn)方法。如果這個函數(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中返回全局變量dwPartIDAdddr的內(nèi)容。3.4.18函數(shù)GetRetryCount()入口無返回閃失敗后重試的次數(shù)該函數(shù)從PLATFORM.DLL中返回全局變量bRetryCount的內(nèi)容。3.4.19函數(shù)GetblockTableSize()入口無返回blockTable中塊的個數(shù)該函數(shù)從PLATFORM.DLL中返回全局變量bblockTableSize的內(nèi)容。3.4.20函數(shù)GetpartTypesSize()入口無返回PLATFORM.DLL將描述的附加閃存部件的個數(shù)該函數(shù)從PLATFORM.DLL中返回全局變量bpartTypesSize的內(nèi)容。3.4.21函數(shù)GetBlockTable()入口無返回blockTable的地址該函數(shù)從PLATFORM.DLL中返回全局結(jié)構(gòu)blockTable的地址。3.4.22函數(shù)GetpartTypes()入口無返回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()入口無返回BIOSROM文件名該函數(shù)從PLATFORM.DLL中返回全局變量szROMFileName的內(nèi)容。3.4.25函數(shù)GetDLLFuncDefine()入口無返回在PLATFORM.DLL中定義哪些平臺有關(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)使用微軟VisualC++V4.2和其后版本開發(fā)。因?yàn)檫@個程序是新的設(shè)備可用和代碼大小不是很重要,編碼的風(fēng)格應(yīng)使代碼可讀和清晰的重要程度高于可執(zhí)行代碼的的小型化。但是,因?yàn)槌绦蛞灿糜诋a(chǎn)品環(huán)境,它應(yīng)當(dāng)使部件閃操作的時間最短。特別是,它應(yīng)當(dāng)盡可能使非關(guān)鍵性用戶界面提示可以被禁止;有可能的話,閃函數(shù)花費(fèi)的時間用匯編語言優(yōu)化。附件B1-進(jìn)一步增強(qiáng)帶有鍵盤LED的完成代碼如果程序不能完成閃過程的三個主要階段的任一個,程序?qū)⑹褂面I盤LED以通知用戶程序的哪個階段程序失敗。在程序開始時鍵盤上的CAPS_LOCK,NUM_LOCK和SCROLL_LOCKLED打開。三個階段的每個階段的失敗由以下指示鍵盤LED開描述CAPS,NUM,SCROLL在讀platform.dll前CAPS,NUM在platform初始前NUM在platform初始后無成功完成附件B2-PHLASHNT.H完成和錯誤代碼FFhBIOS.BAK緩沖區(qū)存儲器分配失敗FEhBIOS.BAK已存在(重命名或刪除)FDhBIOS.BAK文件建立失敗FChBIOS.BAK文件寫入失敗FBhBIOS.BAK文件關(guān)閉失敗FAhPLATFORM.DLL不支持BIOS備份F9hPLATFORM.DLL文件打開失敗F8hPLATFORM.DLL文件讀取失敗F7hPLATFORM.DLL文件關(guān)閉失敗F6h不能在PLATFORM.DLL中定位字節(jié)位置F5h不支持的PLATFORM.DLL文件版本F2hPLATFORM.DLL中的設(shè)備表有過多的項(xiàng)F1hPLATFORM.DLL中的設(shè)備表有不支持的閃存類型F0h在PLATFORM.OLL中組合保存和恢復(fù)屬性EFh保存塊而不匹配PLATFORM.DLL中的恢復(fù)塊ECh在支持的部件表中未找到部件IDEBhPLATFORM.DLL在命令行參數(shù)中找到錯誤EahBIOSROM映象分配錯誤E9h打開BIOSROM映象文件錯誤E8h讀取BIOSROM映象文件錯誤E6hBIOS.ROM文件關(guān)閉錯誤E4h試圖讀閃存ID失敗E3hPLATFORM.DLL不能返回閃存IDE2h在BIOSROM文件映象中不能找到BCPSYS塊E1h文件不包含相同的BIOS部件號E0h文件不包含BIOSROM映象的不同版本DFh寫入閃存的數(shù)據(jù)與BIOSROM映象不匹配Deb寫入閃存失敗DDh擦除閃存塊失敗DChVPP不在希望的范圍DBh擦除序列失敗Dah新的DMI串過大D9hBIOSROM文件可能不用于這個系統(tǒng)D8h分配DMIOEM串失敗D7h在BIOSROM中沒有DMIOEM串的空間D6hDMIOEM串不支持(要求BCPDMI0.1+)D5h在BIOSROM文件映象中不能找到BCPDMI塊D3hBIOSROM文件可能被破壞(校驗(yàn)求和不為零)D2hBIOSROM文件大小與閃存部件大小不匹配D1hDMI系統(tǒng)和機(jī)箱串要求BCPDMI2.1+附件B3-PLATFORM.DLL示例源代碼PLATFORM.CPP/***題目PLATFORM.CPP-32位DLL用于PHLASHNT.EXE*的與平臺相關(guān)函數(shù)*版權(quán)所有鳳凰技術(shù)公司1997(C)*****************************************文件名PLATFORM.CPP*工程PLATFORM.EXE*功能塊*注釋變量dwDLLFuncDefine在PHLASHNT中用于確定*PLATFORM.DLL中確定了哪些與平臺有關(guān)函數(shù)。*以下列出的是dwDLLFuncDefine可能的值和它們在模塊中定義*的函數(shù)*DLL_ENABLEFLASHEnableFlash*DLL_DISABLEFLASHDisableFlash*DLL_BEGINFLASHBeginFlash*DLL_ENDFLASHEndFlash*DLL_GETBLOCKGetBlock*DLL_CMDLINECmdLine*DLL_AUTOSENSEAutoSense*DLL_ISFLASHABLEIsFlashable*DLL_REBOOTReboot*DLL_CHECKSUMChectSum*內(nèi)容*****************************************版本控制信息*$Logk/nb/archive/nuttols/phlash.nt/stage2/drivers/platform.cpv$*Rev1.0*最初再版****************************************#include″stdfx.h″#include&#60afxdllx.h&#62#include&#60stdio.h&#60#include″d\nutools\phlash.nt\stage2\phlashnt.h″#definePLATFORM_CPP∥--------------------∥全局變量聲明∥--------------------DWORDdwFileSize=0x00040000;∥ROM映象文件大小BYTEbManufactID=0x89∥閃存設(shè)備制造商BYTEbPartID=0xBD∥閃存設(shè)備部件IDDWORDdwFlags=FLAG_BIOSPARTNUM|FLAG_CHECKSUM|FLAG_IMAGESIZEDWORDdwImageBuf=0x00200000∥映象緩沖區(qū)的線性地址DWORDdwMfgIDAddr=0xFFFE0000∥制造商ID的線性地址DWORDdwPartIDAddr=0xFFFE0001∥部件ID的線性地址BYTEbRetryCount=0/∥Rn選項(xiàng)的計數(shù)(缺省為零)CharszVersion[]=″NT1.00″∥platform.dll版本CharszROMFileName[]=″BIOS.ROM″∥BIOS映象文件名∥指示PLATFORM.DLL中定義了哪些函數(shù)DWORDdwDLLFuncDefine=DLL_ENABLEFLASH|DLL_DISABLEFLASH|DLL_BEGINFLASH|DLL_ENDFLASH|DLL_GETBLOCK|DLL_CMDLINE|DLL_AUTOSENSE|DLL_ISFLASHABLE|DLL_REBOOTDLL_CHECKSUM∥----------------∥定義blockTable∥----------------BYTEbblockTableSize=5∥blockTable中塊的個數(shù)BLOCK_DESCRIPTORblockTable[]={{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_FRASF},{128*1024,∥128KB(低)0,∥文件偏移0xFFFE0000,∥閃存ROM的線性地址0,∥MfgID(與缺省相同)0,∥PartID(與缺省相同)ATTR_PROG},{128*1024,∥128KB(高)0x00020000,∥文件偏移0xFFFE0000,∥閃存ROM的線性地址0,∥MfgID(與缺省相同)0,∥PartID(與缺省相同)ATTR_PROG},{∥將塊置為0以終止blockTable需要0,0,0,0,0,0},};∥----------------∥定義partTypes∥----------------BYTEbpartTypesSize=1∥平臺中閃存部件的個數(shù)∥如果不使用partTypes則置為0DEVICETABLEpartTypes[]={{0x89,∥閃存設(shè)備制造商ID0Xbd∥閃存設(shè)備設(shè)備ID1,∥閃操作算法類型0,∥忽略wPartSize″Intel28F0202″∥閃存設(shè)備名},{∥將塊置為0以終止partTypes需要0,O,0,0,″″},};HINSTANCEhKernel32=0;∥注意不要改變這行代碼。/**************************函數(shù)********************************/*********************************函數(shù)名DllMain**描述*參數(shù)*返回**注意不要修改這個函數(shù)**********************extern″C″intAPIENTRYDllMain(HINSTANCEhInstance,DWORDdwReason,LPVOIDlpReserVed){if(dwReason==DLL_PROCESS_ATTACH){TRACE0(″PLATFORM.DLLBegin|\n″);HKernel32=LoadLibrary(″Kernel32.dll″);∥取得Kernel32.dll的句柄}elseif(dwReason==DLL_PROCESS_DETACH){TRACE0(″PLATFORM.DLLTerminating|\n″);If(HKernel32)FreeLibrary(hKernel32);;}return1;∥ok}∥DllMain()/****************************函數(shù)名EnableFlash**描述*參數(shù)*返回**注意**********************DLL_FUNC_TYPEvoidEnableFlash(){printf(″EnableFlash\n″);∥(stub)}/****************************函數(shù)名DisableFlash**描述*參數(shù)*返回**注意**********************DLL_FUNC_TYPEvoidDisableFlash(){printf(″DisableFlash\n″);∥(stub)}/****************************函數(shù)名BeginFlash**描述*參數(shù)*返回**注意**********************DLL_FUNC_TYPEshortBeginFlash(USHORTblockNumber){return0;∥(stub)}/****************************函數(shù)名EndFlash**描述*參數(shù)*返回**注意**********************DLL_FUNC_TYPEshortEndFlash(USHORTblockNumber){return0;∥(stub)}/****************************函數(shù)名GetBlock**描述*參數(shù)*返回**注意**********************DLL_FUNC_TYPESHORTGetBlock(ULONGdwIndex,F(xiàn)ULONGdwDst){printf(″GetBlock;dwIndex,dwDstpassdin=%d,%d\n″,dwIndex,dwDst);∥(stub)}/****************************函數(shù)名CmdLine**描述*參數(shù)*返回**注意**********************DLL_FUNC_TYPEUSHORTCmdLine(char*PlatformString){printf(″CmdLine\n″);∥(stub)return(0);∥(stub)}/****************************函數(shù)名AutoSense**描述*參數(shù)*返回**注意制造商ID在BYTE0,設(shè)備ID在BYTE1**********************DLL_FUNC_TYPEDWORDAutoSense(DWORDPartID){return(0x0000);∥(stud)}/****************************函數(shù)名IsFlashable**描述*參數(shù)*返回**注意**********************DLL_FUNC_TYPEUSHORTIsFlashable(){printf(″IsFlashable\n″);∥(stub)return0}/****************************函數(shù)名Reboot**描述*參數(shù)*返回**注意**********************DLL_FUNC_TYPEvoidReboot(){printf(″Reboot\n″);∥(stub)}/****************************函數(shù)名CheckSum**描述*參數(shù)*返回**注意**********************DLL_FUNC_TYPEvoidCheckSum(){printf(″CheckSum\n″);∥(stub)}∥---------------------------∥注意不要修改以下函數(shù)∥----------------------------------DLL_FUNC_TYPEDWORDGetBIOSFileSize(void){return(dwFileSize);}DLL_FUNC_TYPEBYTEGetManufactID(void){return(bManufactID);}DLL_FUNC_TYPEBYTEGetPartID(void){return(bPartID);}DLL_FUNC_TYPEDWORDGetFlags(void){return(dwFlags);}DLL_FUNC_TYPEDWORDGetImageBuf(void){return(dwImageBuf);}DLL_FUNC_TYPEDWORDGetMfgIDAddr(void){return(dwMfgIDAddr);}DLL_FUNC_TYPEDWORDGetPartIDAddr(void){return(dwPartIDAddr);}DLL_FUNC_TYPEBYTEGetRetryCount(void){return(bRetryCount);}DLL_FUNC_TYPEBYTEGetblockTableSize(void){return(bblockTableSize);}DLL_FUNC_TYPEBYTEGetpartTypesSize(void){return(bpartTable);}DLL_FUNC_TYPEBLOCK_DESCRIPTOR*GetBlockTable(void){return(&blockTable);}DLL_FUNC_TYPEDEVICETABLE*GetpartTable(void){return(&partTable[O]);}DLL_FUNC_TYPEchar*GetDLLVersion(void){return(szVersion);}DLL_FUNC_TYPEchar*GetROMFileName(void){return(szROMFileName);}DLL_FUNC_TYPEDWORDGetDLLFuncDefine(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ū)動程序。該服務(wù)的提供者是實(shí)現(xiàn)一個或多個32位BIOS服務(wù)的BIOS供應(yīng)商。介紹BIOS32服務(wù)目錄建議是在為外圍部件互聯(lián)(PCI)標(biāo)準(zhǔn)建立32位代碼接口時出現(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ù),顯然給每個服務(wù)提供一個簽名(以及任何相關(guān)信息,例如每個的入口點(diǎn),段需求)對于緊張的存儲器資源是一個消耗。因此,BIOS32服務(wù)目錄后的思路是使用單一的簽名標(biāo)識一般32位服務(wù),它返回所有指定32位服務(wù)的信息。實(shí)現(xiàn)一般方案的進(jìn)一步調(diào)整相對于繼續(xù)逐個解決問題的優(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ù)目錄有兩個部分頭部和調(diào)用接口。頭部是包含簽名和位于已知存儲器區(qū)域的靜態(tài)數(shù)據(jù)結(jié)構(gòu)。有效頭部的存在表示調(diào)用接口的存在和實(shí)際上,描述它的入口點(diǎn)。調(diào)用接口是代碼體和在由頭部和任何特定32位BIOS服務(wù)分開的分立存儲器空間中存在的數(shù)據(jù)。它提供了功能性接口,提供它調(diào)用者接收特定32位BIOS服務(wù)的信息。(部分0描述頭部的假設(shè)存儲器映象,調(diào)用接口,和32位BIOS服務(wù)的“XYZ”)。調(diào)用接口設(shè)計可以在二維擴(kuò)展。第一,它是基于函數(shù)的接口,進(jìn)一步更新服務(wù)可以加入新的功能,如果需要的話。第二,特定32位BIOS服務(wù)由4字節(jié)部件ID表示。這使OS調(diào)用者和BIOS32服務(wù)目錄實(shí)現(xiàn)器兩者相似從而在有新的32位BIOS服務(wù)時容易增加。BIOS32服務(wù)目錄接口,和示例綜述2BIOS32服務(wù)目錄頭部實(shí)現(xiàn)BIOS32服務(wù)目錄的BIOS必須嵌入物理存儲器范圍0E0000h-0FFFFFh中某處特定的連續(xù)16字節(jié)方式。該方式必須分段對準(zhǔn)(即,它必須從16字節(jié)邊界開始)。該方式已知為在BIOS32服務(wù)目錄頭部中。頭部包括6個分立的字段。下表描述每個字段。表1BIOS32服務(wù)目錄頭部BIOS32服務(wù)目錄的客戶必須首先通過定位頭部而確定它的存在。這是通過以段為增量掃描0E0000h至0FFF0h在每段的前4個字節(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ù)目錄在平臺中不存在。3BIOS32服務(wù)目錄調(diào)用接口如果已經(jīng)確定BIOS32服務(wù)目錄存在(通過以上的頭部檢測),則在頭部中找到的32位物理地址作為調(diào)用接口的入口點(diǎn)??蛻魬?yīng)CALLFAR至該地址??蛻舻恼{(diào)用環(huán)境有以下要求3.1代碼段CS代碼段選擇器必須設(shè)置為有以下值的段描述符*基地址必須小于或等于包含入口點(diǎn)的頁的(4KB)頁地址。例如,如果入口點(diǎn)是0FFF81234H,則基地址必須小于或等于0FFF81000h。*該范圍必須使基地址加該范圍生成一個地址大于或等于包含入口點(diǎn)的頁之后的頁的最后地址。例如,如果入口點(diǎn)是0FFF81234H則基地址加范圍必須大于或等于0FFF82FFFH。*簡而言之,基地址和范圍必須“包圍”包含入口點(diǎn)的頁和隨后頁。*段類型必須是100b(代碼,只能可執(zhí)行)或101b(代碼,可執(zhí)行/讀)。但是,服務(wù)目錄的實(shí)現(xiàn)不能假設(shè)CS代碼段的讀訪問。*系統(tǒng)位必須是1(非系統(tǒng)段)。*推薦描述符專用級(DPL)為0。(CS描述符DPL成為當(dāng)前專用級,或CPL)。如果CPL是非0,則OS必須提供環(huán)0專用指令(例如訪問CRx)的捕獲和虛擬服務(wù)。還請注意該字段的依賴于EFLAGS中IOPL字段(見段0)。*缺省大小位必須為1(32位)。BIOS32服務(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)段)。*描述符專用級(DPL)必須大于或等于CPL(見段0DPL字段)。對于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)段)。*描述符專用級(DPL)等于CPL(見段0DPL字段)。*缺省大小位必須是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專用級(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返回值有單個函數(shù)定義。當(dāng)前定義了一個BIOS32服務(wù)目錄函數(shù)。它在以下說明。3.6部件存在函數(shù)(BL=0h)部件存在函數(shù)返回指定的32位BIOS范圍存在的信息和,如果存在,占據(jù)了哪個存儲器空間。輸入BL,0hEAX,部件ID部件ID是4字節(jié)ASCII串,唯一標(biāo)識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ù)目錄。它識別兩個不同的存儲器部件頭部和調(diào)用接口。頭部是一個簽名數(shù)據(jù)段,位于存儲器范圍0E0000h-0FFFFFh。調(diào)用接口是4GB地址空間中任何位置的物理連續(xù)段的代碼體,并且長度小于兩頁(8kb)。頭部包含指向調(diào)用接口存儲器區(qū)域的指針。BIOS32服務(wù)目錄調(diào)用接口函數(shù)描述附加的存儲器區(qū)域,包含特定32位BIOS范圍的代碼和數(shù)據(jù)。后面是假定頭部的存儲器映象,調(diào)用接口和“XYZ”32位BIOS范圍。本文件提供了訪問32位BIOS服務(wù)的標(biāo)準(zhǔn)方法。由于32位BIOS服務(wù)被認(rèn)可和實(shí)現(xiàn),可以方便地使用BIOS32服務(wù)目錄調(diào)用接口來提高標(biāo)準(zhǔn)方法。#ifdefTESTEXEC∥測試bios執(zhí)行函數(shù)printf(″phadtest-testbiosexecutionbreakpoint\n″);ioExec=(PIOC_EXECl)systemBuffer;ioExec->biosFunction=biosShadowArseBaseVA+biosServiceDirectoryVA;strncpy((PUCHAR)(&ioExec->regEAX),BIOS_PM_SIGNATURE,,4);ioExec->regEBX=OL;if(DeviceIonControl(hDriver,IOCTL_BIOS_EXEC,bufferPtr,256,bufferPtr,256,&actuaLxfr,NULL)){printf(″IOCTL2052-BIOSExecute(%s)-success\n″,BIOS_PM_SIGNATURE);printf(″#bycesreturned%Ld\n″,actualXfr);printf(″Registercontents\n″);printf(″AL=%X\n″,(ioeExec->regEAX)&0xff);printf(″EBX=%LX\n″,ioExec->regEBX);printf(″ECX=%LX\n″,ioExec->regECX);printf(″EDX=%LX\n″,ioExec->regEDX);}else{ioCode=GetLastError();printf(″IOCTL2050Eailedon%LX\n″,ioCode);}#endif附件D1附件D2附件D權(quán)利要求1.一種在基于處理器的系統(tǒng)中從虛擬存儲器訪問和執(zhí)行物理存儲器中的指令序列的系統(tǒng),包括存儲器,存儲處理基于處理器的系統(tǒng)的指令序列,存儲器包括物理存儲器和虛擬存儲器;以及執(zhí)行所存儲的指令序列的處理器;以及其中,所存儲的指令序列包括以下處理步驟使處理器(a)將多個預(yù)定指令序列從物理存儲器映射到虛擬存儲器;(b)在虛擬存儲器中確定對一所述多個預(yù)定指令序列其中之一的補(bǔ)償;(c)接收指令以執(zhí)行所述多個預(yù)定指令序列其中之一;(d)傳送控制至所述多個指令序列其中之一;以及(e)從虛擬存儲器處理所述多個指令序列其中之一。2.根據(jù)權(quán)利要求1的系統(tǒng),其中在步驟(c)中,指令是由應(yīng)用程序形成的。3.根據(jù)權(quán)利要求1的系統(tǒng),其中在步驟(c)中,指令是由分類驅(qū)動程序形成的。4.根據(jù)權(quán)利要求1的系統(tǒng),其中步驟(a)包括的步驟有(a.1)將多個BIOS指令序列從物理存儲器映射到虛擬存儲器,所述BIOS指令序列包括BIOS服務(wù)目錄;以及(a.2)將BIOS數(shù)據(jù)從物理存儲器映射到虛擬存儲器。5.根據(jù)權(quán)利要求4的系統(tǒng),其中步驟(b)包括的步驟有(b.1)確定BIOS服務(wù)目錄的起始虛擬地址;以及(b.2)參考BIOS服務(wù)目錄確定多個BIOS指令序列其中之一的起始虛擬地址。6.根據(jù)權(quán)利要求5的系統(tǒng),其中步驟(d)包括的步驟有(d.1)在存儲位置中建立寄存器堆棧;(d.2)識別寄存器堆棧中多個BIOS指令序列其中之一的起始虛擬地址的位置;以及(d.3)傳送控制至多個BIOS指令序列其中之一。7.根據(jù)權(quán)利要求6的系統(tǒng),其中在步驟(d.1)中,存儲位置是位于動態(tài)隨機(jī)存取存儲器(DRAM)中的緩沖器。8.根據(jù)權(quán)利要求6的系統(tǒng),其中在步驟(d.1)中,存儲單元是位于主存儲器中的緩沖器。9.根據(jù)權(quán)利要求6的系統(tǒng),其中步驟(e)包括的步驟有(e.1)確定起始虛擬地址是否在從物理存儲器映射到虛擬存儲器的地址范圍內(nèi);以及(e.2)如果是,從虛擬存儲器執(zhí)行多個BIOS指令序列其中之一,否則指示起始虛擬地址不在從物理存儲器映射到虛擬存儲器的地址范圍內(nèi)。10.一種在基于處理器的系統(tǒng)中從虛擬存儲器訪問和執(zhí)行物理存儲器中的指令序列的方法,包括(a)將多個預(yù)定指令序列從物理存儲器映射到虛擬存儲器;(b)在虛擬存儲器中確定對所述多個預(yù)定指令序列其中之一的補(bǔ)償;(c)接收指令以執(zhí)行所述多個預(yù)定指令序列其中之一;(d)傳送控制至所述多個指令序列其中之一;以及(e)從虛擬存儲器處理所述多個指令序列其中之一。11.根據(jù)權(quán)利要求10的方法,其中在步驟(c)中,指令是由應(yīng)用程序形成的。12.根據(jù)權(quán)利要求10的方法,其中在步驟(c)中,指令是由分類驅(qū)動程序形成的。13.根據(jù)權(quán)利要求10的方法,其中步驟(a)包括的步驟有(a1)將多個BIOS指令序列從物理存儲器映射到虛擬存儲器,所述BIOS指令序列包括BIOS服務(wù)目錄;以及(a.2)將BIOS數(shù)據(jù)從物理存儲器映射到虛擬存儲器。14.根據(jù)權(quán)利要求13的方法,其中步驟(b)包括的步驟有(b.1)確定BIOS服務(wù)目錄的起始虛擬地址;以及(b.2)引用BIOS服務(wù)目錄確定多個BIOS指令序列其中之一的起始虛擬地址。15.根據(jù)權(quán)利要求14的方法,其中步驟(d)包括的步驟有(d.1)在存儲位置中建立寄存器堆棧;(d.2)識別寄存器堆棧中多個BIOS指令序列其中之一的起始虛擬地址的位置;以及(d.3)傳送控制至多個BIOS指令序列其中之一。16.根據(jù)權(quán)利要求15的方法,其中在步驟(d.1)中,存儲位置是位于動態(tài)隨機(jī)存取存儲器(DRAM)中的緩沖器。17.根據(jù)權(quán)利要求15的方法,其中在步驟(d.1)中,存儲位置是位于主存儲器中的緩沖器。18.根據(jù)權(quán)利要求15的方法,其中步驟(e)包括的步驟有(e.1)確定起始虛擬地址是否在從物理存儲器映射到虛擬存儲器的地址范圍內(nèi);以及(e.2)如果是,從虛擬存儲器執(zhí)行多個BIOS指令序列其中之一,否則指示起始虛擬地址不在從物理存儲器映射到虛擬存儲器的地址范圍內(nèi)。19.在基于處理器的系統(tǒng)中從虛擬存儲器訪問和執(zhí)行物理存儲器中的指令序列的計算機(jī)可執(zhí)行的處理步驟,所述處理步驟包括(a)將多個預(yù)定指令序列從物理存儲器映射到虛擬存儲器;(b)在虛擬存儲器中確定對所述多個預(yù)定指令序列其中之一的補(bǔ)償;(c)接收指令以執(zhí)行所述多個預(yù)定指令序列其中之一;(d)傳送控制至所述多個指令序列其中之一;以及(e)從虛擬存儲器處理所述多個指令序列其中之一。20.根據(jù)權(quán)利要求19的計算機(jī)可執(zhí)行的處理步驟,其中在步驟(c)中,指令是由應(yīng)用程序形成的。21.根據(jù)權(quán)利要求19的計算機(jī)可執(zhí)行的處理步驟,其中步驟(a)包括的步驟有(a.1)將多個BIOS指令序列從物理存儲器映射到虛擬存儲器,所述BIOS指令序列包括BIOS服務(wù)目錄;以及(a.2)將BIOS數(shù)據(jù)從物理存儲器映射到虛擬存儲器。22.根據(jù)權(quán)利要求21的計算機(jī)可執(zhí)行的處理步驟,其中步驟(b)包括的步驟有(b.1)確定BIOS服務(wù)目錄的起始虛擬地址;以及(b.2)引用BIOS服務(wù)目錄確定多個BIOS指令序列其中之一的起始虛擬地址。23.根據(jù)權(quán)利要求22的計算機(jī)可執(zhí)行的處理步驟,其中步驟(d)包括的步驟有(d.1)在存儲位置中建立寄存器堆棧;(d.2)識別寄存器堆棧中多個BIOS指令序列其中之一的起始虛擬地址的位置;以及(d.3)傳送控制至多個BIOS指令序列其中之一。24.根據(jù)權(quán)利要求23的計算機(jī)可執(zhí)行的處理步驟,其中在步驟(d.1)中,存儲位置是位于動態(tài)隨機(jī)存取存儲器(DRAM)中的緩沖器。25.根據(jù)權(quán)利要求23的計算機(jī)可執(zhí)行的處理步驟,存儲位置是位于主存儲器中的緩沖器。26.根據(jù)權(quán)利要求23的計算機(jī)可執(zhí)行的處理步驟,其中步驟(e)包括的步驟有(e.1)確定起始虛擬地址是否在從物理存儲器映射到虛擬存儲器的地址范圍內(nèi);以及(e.2)如果是,從虛擬存儲器執(zhí)行多個BIOS指令序列其中之一,否則指示初始虛擬地址不在從物理存儲器映射到虛擬存儲器的地址范圍內(nèi)。27.一種在基于處理器的系統(tǒng)中從虛擬存儲器訪問物理存儲器中的指令序列的系統(tǒng),包括存儲器,存儲處理基于處理器的系統(tǒng)的指令序列,存儲器包括物理存儲器和虛擬存儲器;以及執(zhí)行所存儲的指令序列的處理器;以及其中,所存儲的指令序列包括以下處理步驟使處理器(a)將多個預(yù)定指令序列從物理存儲器映射到虛擬存儲器;(b)在虛擬存儲器中確定對所述多個預(yù)定指令序列其中之一的補(bǔ)償;(c)接收指令以執(zhí)行所述多個預(yù)定指令序列其中之一;(d)傳送控制至所述多個指令序列其中之一;以及(e)從虛擬存儲器處理所述多個指令序列其中之一。28.根據(jù)權(quán)利要求27的系統(tǒng),其中步驟(a)包括的步驟有(a.1)將多個BIOS指令序列從物理存儲器映射到虛擬存儲器,所述BIOS指令序列包括多個BIOS只讀存儲器(ROM)指令序列和BIOS服務(wù)目錄;以及(a.2)將BIOS數(shù)據(jù)從物理存儲器映射到虛擬存儲器。29.根據(jù)權(quán)利要求28的系統(tǒng),其中步驟(b)包括的步驟有(b.1)確定BIOS服務(wù)目錄的起始虛擬地址;以及(b.2)引用BIOS服務(wù)目錄確定多個BIOS指令序列其中之一的起始虛擬地址。30.根據(jù)權(quán)利要求29的系統(tǒng),其中步驟(d)包括的步驟有(d.1)在存儲位置中建立寄存器堆棧;(d.2)識別寄存器堆棧中多個BIOSROM指令序列其中之一的初始虛擬地址的位置。31.根據(jù)權(quán)利要求30的系統(tǒng),其中步驟(e)包括的步驟有(e.1)確定起始虛擬地址是否在從物理存儲器映射到虛擬存儲器的地址范圍內(nèi);以及(e.2)如果是,從虛擬存儲器讀多個BIOSROM指令序列其中之一,否則指示起始虛擬地址不在從物理存儲器映射到虛擬存儲器的地址范圍內(nèi)。32.一種在基于處理器的系統(tǒng)中從虛擬存儲器訪問物理存儲器中的指令序列的方法,包括(a)將多個預(yù)定指令序列從物理存儲器映射到虛擬存儲器;(b)在虛擬存儲器中確定對所述多個預(yù)定指令序列其中之一的補(bǔ)償;(c)接收指令以執(zhí)行所述多個預(yù)定指令序列其中之;(d)傳送控制至所述多個指令序列其中之一;以及(e)從虛擬存儲器處理所述多個指令序列其中之一。33.根據(jù)權(quán)利要求32的方法,其中步驟(a)包括的步驟有(a.1)將多個BIOS指令序列從物理存儲器映射到虛擬存儲器,所述BIOS指令序列包括多個BIOS只讀存儲器(ROM)指令序列和BIOS服務(wù)目錄;以及(a.2)將BIOS數(shù)據(jù)從物理存儲器映射到虛擬存儲器。34.根據(jù)權(quán)利要求33的方法,其中步驟(b)包括的步驟有(b.1)確定BIOS服務(wù)目錄的起始虛擬地址;以及(b.2)引用BIOS服務(wù)目錄確定多個BIOS指令序列其中之一的起始虛擬地址。35.根據(jù)權(quán)利要求34的方法,其中步驟(d)包括的步驟有(d.1)在存儲位置中建立寄存器堆棧;(d.2)識別寄存器堆棧中多個BIOSROM指令序列其中一的起始虛擬地址的位置。36.根據(jù)權(quán)利要求35的方法,其中步驟(e)包括的步驟有(e.1)確定起始虛擬地址是否在從物理存儲器映射到虛擬存儲器的地址范圍內(nèi)以及(e.2)如果是,從虛擬存儲器讀多個BIOSROM指令序列其中之一,否則指示起始虛擬地址不在從物理存儲器映射到虛擬存儲器的地址范圍內(nèi)。37.一種安全利用基本輸入輸出系統(tǒng)(BIOS)服務(wù)的系統(tǒng),包括訪問驅(qū)動程序,產(chǎn)生利用BIOS服務(wù)的服務(wù)請求,服務(wù)請求包括利用密鑰對中的專用密鑰建立的服務(wù)請求簽名;以及接口,利用密鑰對中共用密鑰校驗(yàn)服務(wù)請求簽名以保證服務(wù)請求完整性。38.根據(jù)權(quán)利要求37的系統(tǒng),其中訪問驅(qū)動程序產(chǎn)生會話請求以與接口建立會話;以及會話請求包括利用密鑰對中專用密鑰建立的會話請求簽名。39.根據(jù)權(quán)利要求37的系統(tǒng),其中訪問驅(qū)動程序產(chǎn)生會話請求以結(jié)束與接口的會話;以及會話請求包括利用密鑰對中專用密鑰建立的會話請求簽名。40.根據(jù)權(quán)利要求37的系統(tǒng),其中接口產(chǎn)生權(quán)限證書并在接收會話請求之后將權(quán)限證書發(fā)送到訪問驅(qū)動程序;以及訪問驅(qū)動程序利用包括在權(quán)限證書中的信息產(chǎn)生后續(xù)會話請求。41.根據(jù)權(quán)利要求40的系統(tǒng),其中權(quán)限證書包括新的共用密鑰。42.根據(jù)權(quán)利要求40的系統(tǒng),其中權(quán)限證書包括新的專用密鑰。43.根據(jù)權(quán)利要求40的系統(tǒng),其中權(quán)限證書包括證書簽名。44.根據(jù)權(quán)利要求37的系統(tǒng),其中接口產(chǎn)生權(quán)限證書并在接收服務(wù)請求之后將權(quán)限證書發(fā)送到訪問驅(qū)動程序;以及訪問驅(qū)動程序利用權(quán)限證書中的信息產(chǎn)生后續(xù)會話請求。45.一種安全調(diào)用基本輸入輸出系統(tǒng)(BIOS)服務(wù)的方法,包括產(chǎn)生調(diào)用BIOS服務(wù)的服務(wù)請求;利用密鑰對中的專用密鑰產(chǎn)生的服務(wù)請求簽名簽署服務(wù)請求;以及利用密鑰對中共用密鑰校驗(yàn)服務(wù)請求簽名以保證服務(wù)請求完整性。46.根據(jù)權(quán)利要求45的方法,還包括在處理服務(wù)請求之后產(chǎn)生包括新的專用密鑰和新的共用密鑰的權(quán)限證書;以利用新的專用密鑰產(chǎn)生的服務(wù)請求簽名簽署后續(xù)服務(wù)請求;以及用新的共用密鑰校驗(yàn)后續(xù)服務(wù)請求的服務(wù)請求簽名。47.根據(jù)權(quán)利要求45的方法,還包括執(zhí)行由包含在服務(wù)請求中的服務(wù)操作碼表示的BIOS服務(wù)程序。48.根據(jù)權(quán)利要求45的方法,還包括產(chǎn)生會話請求以建立與ROM應(yīng)用程序接口(RAPI)的會話;以利用密鑰對中專用密鑰產(chǎn)生的會話請求簽名簽署后續(xù)服務(wù)請求;以及用密鑰對中的共用密鑰校驗(yàn)會話請求簽名以保證會話請求的完整性。49.根據(jù)權(quán)利要求48的方法,還包括在處理會話請求之后產(chǎn)生包括新的專用密鑰和新的共用密鑰的權(quán)限證書;以利用新的專用密鑰產(chǎn)生的會話請求簽名簽署后續(xù)會話請求;以及用新的共用密鑰校驗(yàn)后續(xù)會話請求的會話請求簽名。50.根據(jù)權(quán)利要求45的方法,還包括產(chǎn)生會話請求以結(jié)束與ROM應(yīng)用程序接口(RAPI)的會話;以利用密鑰對中專用密鑰產(chǎn)生的會話請求簽名簽署后續(xù)服務(wù)請求;以及用密鑰對中的共用密鑰校驗(yàn)會話請求簽名以保證會話請求的完整性。51.一種包含在計算機(jī)可讀介質(zhì)上以安全利用基本輸入輸出系統(tǒng)(BIOS)服務(wù)的計算機(jī)程序,包括訪問驅(qū)動程序,產(chǎn)生利用BIOS服務(wù)的服務(wù)請求,服務(wù)請求包括利用密鑰對中專用密鑰建立的服務(wù)請求簽名;以及接口,利用密鑰對中共用密鑰校驗(yàn)服務(wù)請求簽名以保證服務(wù)請求完整性。52.一種包含在數(shù)據(jù)流中的計算機(jī)數(shù)據(jù)信號,包括訪問驅(qū)動程序,產(chǎn)生利用BIOS服務(wù)的服務(wù)請求,服務(wù)請求包括利用密鑰對中專用密鑰建立的服務(wù)請求簽名;以及接口,利用密鑰對中共用密鑰校驗(yàn)服務(wù)請求簽名以保證服務(wù)請求完整性。全文摘要本發(fā)明的系統(tǒng)包括存儲器,存儲處理基于處理器的系統(tǒng)的指令序列,存儲器包括物理存儲器和虛擬存儲器。系統(tǒng)還包括執(zhí)行所存儲的指令序列的處理器。所存儲的指令序列包括以下處理步驟使處理器:將多個預(yù)定指令序列從物理存儲器映射到虛擬存儲器;在虛擬存儲器中確定對所述多個預(yù)定指令序列其中之一的補(bǔ)償:接收指令以執(zhí)行所述多個預(yù)定指令序列其中之一;傳送控制至所述多個指令序列其中之一傳送控制;以及從虛擬存儲器處理所述多個指令序列其中之一。文檔編號G06F12/00GK1282920SQ0012250公開日2001年2月7日申請日期2000年6月18日優(yōu)先權(quán)日1999年6月18日發(fā)明者L·J·加拉索,M·E·茲爾默,Q·范申請人:鳳凰技術(shù)有限公司