專利名稱:模擬實模式內存訪問時訪問擴展內存的系統和方法
技術領域:
本發明的實施例一般涉及計算系統,更具體地,涉及在模擬實模式內存訪問的同時在保護模式下訪問擴展內存。
背景技術:
盡管多年來計算機均配備了若干兆字節的隨機存取存儲器(RAM),但是,在實模式下,預啟動附加設備可用的總內存仍然僅限于1MB的內存。這1MB的限制已成為預啟動期間的負擔,因為不存在從640K的基本內存區中分配內存的標準方法。在很多情況下,由一個程序分配的內存將會被另一個程序改寫,因為該程序或者未察覺所使用的內存分配方法,或者程序本身存在缺陷。無法阻止一個程序改寫內存中的另一個程序的數據,因為在預啟動期間不存在保護機制。在實模式下,每個程序均能訪問所有可用內存。某些競爭內存的程序是設備特有的可選ROM(option ROM)、基本輸入/輸出系統和操作系統(OS)啟動加載器。為使用擴展內存,可以超越1MB限制,但這通常需要對之前運行于實模式下的程序進行較大的修改。
當計算機系統啟動時,BIOS取得控制權,且處理器執行于實模式。對處理器而言,實模式通常是16位模式,但由于段地址的緣故,也可以訪問20位的地址。16位模式意味著可以訪問16位地址。與使用不具有段的16位地址僅能訪問64K內存相比,段編址(addressing)允許訪問1MB內存。在實模式下,總的可用內存空間是1MB。在實模式下,傳統上應用程序能使用640K的基本內存。而擴展內存或超過1MB的內存在實模式下不可用。
現在參考圖1,其中示出了一種在實模式下使用20位段地址和偏移來訪問1MB內存的方法。段寄存器101為16位。偏移寄存器103也為16位。通過將段寄存器左移4位而將這些寄存器組合在一起,使得它成為20位數105。將偏移寄存器103加入段地址105,以生成20位的段+偏移內存引用107。
一種理解這種編址方案的簡單方法是,想象段寄存器105在較低端總具有不可改變的4個附加位109。因此,該段寄存器實際上是20位的,但在處理器之外,僅有16位可見。以下,根據圖1中的數值加入16位偏移103。實際的20位段寄存器是1001 1101 1111 0000 0000其中,用粗體表示的0-3位在處理器之外不可見。按以下方式加入該段寄存器和偏移,以產生1MB范圍內的物理地址。
可見的段寄存器1001 1101 1111 0000(9DF0)有效偏移+0000 0100 0000 0000(物理(或線性)地址=1001111000110000 00000,也可以寫成9DF00400)在內存中,每隔16個字節便開始新的可能段。每一個段均為64K長。這樣,段之間將發生相互重疊,即加入段地址的偏移跨度將超過一個段。在內存中的實際地址內,可能存在超過4000個段+偏移的組合。換言之,各物理地址均可能處于多于一個段的范圍內。
圖2示出了具有段地址和64K偏移的16K段地址的重疊。例如,示出了段地址0(201)、段地址1(203)和段地址2(205)。將多達64K的偏移加入段地址0,這引用了與使用段地址2引用的內存(209)重疊的內存207。這種編址方案在業內是眾所周知的。
保護模式使得程序可以訪問超過1MB的內存。處理器可以隨時切換到保護模式。上述執行軟件啟動至保護模式的切換。該執行軟件也可以切換回實模式。至保護模式的切換通常是通過啟動加載器(boot loader)在加載操作系統(OS)時執行的,這使得OS可以使用所有內存。在保護模式期間,可通過選擇器和偏移的組合來訪問擴展內存。
在應用程序對內存的要求較高時,業內需要使預啟動應用程序(如在設備特有的可選ROM上找到的那些應用程序)能使用擴展內存而非較低的1MB內存。也需要使那些原本設計成在實模式下運行的預啟動應用程序在無需重寫的情況下便能在保護模式下執行。
通過本發明的以下詳細描述,可以更清楚地理解本發明的特征和優點。
圖1的框圖示出了使用段和偏移的實模式內存編址;圖2的框圖示出,段地址可能在內存中發生重疊;圖3的框圖示出了使用選擇器寄存器、偏移和描述符表的保護模式內存編址的實施例;圖4的框圖示出了為期望實模式編址的應用程序使用保護模式內存編址的系統的典型實施例;圖5的框圖示出了使用實模式和保護模式編址訪問較低的1MB內存和擴展內存的不同;以及圖6的流程圖示出了本文所述的、用于使用保護模式來使預啟動應用程序能使用擴展內存的方法的實施例。
具體實施例方式
本發明的一個實施例是一種涉及在執行設計成用于實模式內存訪問的指令代碼的同時切換到保護模式來訪問擴展內存的系統和方法。在至少一個實施例中,本發明希望在預啟動過程中執行復雜的可選ROM代碼,而不致破壞由BIOS或其他可選ROM使用的系統內存。
說明書中提及的本發明的“一個實施例”或“某一實施例”意味著在本發明的至少一個實施例中包括了結合這些實施例所述的特定特征、結構或特性。從而,在說明書中的不同處出現的短語“在一個實施例中”不一定指同一實施例。
本文所述的方法的實施例將擴展內存映射到基本內存區中的內存。這將允許現有的可選ROM使用更多的基本內存,而不至于與其他程序對基本內存的使用發生沖突,或是使它們自己的內存被其他程序改寫。對于需要在整個預啟動階段維持大量數據存儲空間的可選ROM而言,這種技術尤其有用。
所公開方法的一個實施例將用于存儲數據的擴展內存分配給預啟動應用程序,其中,該預啟動應用程序設計成在實模式下運行。處理器可以切換到保護模式。可以將該預啟動應用程序引用的實模式內存地址轉換成擴展內存地址引用,且可以使用轉換后的擴展內存地址而非實模式內存地址來執行上述預啟動應用程序指令。
本文所述的方法的一個實施例包括在預啟動過程中周期性地將處理器從實模式切換到保護模式。為避免對現有的可選ROM進行程序變更,可以使用保護模式選擇器,并將上述長度限制設為小于或等于64KB,且將基址設為可用的擴展內存地址。這樣,便無需與門A20接口。如以下所述,門A20控制了1MB地址的回繞(wrap around)特征,并影響了其他預啟動系統(如加電自檢內存管理器)。
參考圖3,其中示出了用于訪問處于保護模式下的虛擬內存方案。在保護模式下,編址使用16位的選擇器301和偏移303。選擇器不同于實模式中使用的段地址,因為選擇器不是地址,而是描述符表(如全局描述符表(GDT)305)的索引。GDT中的各個描述符包含用于選擇器的線性基址307和長度限制309。GDT本身通常被限于64KB,且每個條目占用8個字節,這樣,便為總共8192個描述符留出了空間。各個描述符的長度均為8個字節,且選擇器311的底部的3個字節用作標志。例如,如果將選擇器設置為8h,而偏移量為400h,則使用了GDT中的第二描述符。未使用描述符表中的處于零位置的第一位置。在該實例中,第二描述符包括基址3F00000h和長度限制0FFFFh(64K段)。由于偏移400h小于長度限制,因而將該偏移直接加到基址,以形成以下的線性地址3F00000h+400h=3F00400h。如以下進一步所述,由于不存在關于使用上述選擇器的底部3個位的規定,因而,如果必須為小于16個字節的邊界編址,則可使用其他方法。
本發明的一個實施例將保護模式選擇器用作偽實模式段地址。這種方法要求切換到保護模式。可以分配64KB的GDT,并將其初始化為零或使用每個引用正確線性地址的描述符來對其進行初始化。最好使每個描述符均具有0FFFFh(64KB)的長度限制,以保證實模式正常工作。在一個實例中,可以將整個GDT初始化為零。在初始化該表之后,通過替換該希望的選擇器,可將擴展內存地址映射為偽實模式地址。例如,為將地址3F00000h映射到段地址9DF0h上,可以用基址3F00000h和長度限制0FFFFh來配置從GDT的開端起的偏移9DF0h處的選擇器。一旦完成此過程,則訪問段9DF0h的實模式程序實際上將訪問擴展內存地址3F00000h。這種轉換對正處于執行之中的ROM是透明的。
當將GDT初始化為零時,所有描述符一開始均為空。如果程序試圖訪問該GDT中的空描述符,則出現一般保護錯誤(GPF)。在保護模式下,通過安裝中斷描述符表(IDT)和在IDT中安裝GPF處理器便可俘獲這種錯誤。當調用GPF處理器時,堆棧上的返回地址就是該違規指令的地址。以這種方式,在改正最初的問題后,當從GPF處理器返回違規指令時,可以重新執行該指令。如果該描述符已初始化為線性地址,或已用該線性地址填充了該描述符,則在不引起GPF的情況下,通過使用該描述符中引用的地址可立即執行上述指令。
可以安裝GPF處理器,以處理當使用空描述符之一時出現的錯誤。該處理器可以填充被使用的描述符,并重新執行該指令。例如,如果段寄存器包含應指向BIOS數據區(BDA)的40h,則應向處于從GDT的開端起的偏移40h處的描述符填充基址400h和長度限制0FFFFh。使用段編址,將地址左移4位,且最低4位不用作地址的一部分。當GPF處理器完成處理后,重新執行上述指令,則程序將直接訪問實BIOS數據區。如果內存訪問發生在已進行重新映射的范圍內,則基址應指向擴展內存中的適當偏移,且可以縮減上述長度限制,使得上述程序不能訪問該經過分配的擴展內存(經過其末端)。
為使這種方法能夠運作,還必須解決其他的一些問題。首先,選擇器可能僅訪問GDT中的8192個條目,因為只有最重要的13個位被用作索引。在一個實施例中,選擇器(311)中的前3個位是內存的保護標志,且總是為零。對于其他的應用程序,該標志用于指明內存為只讀或讀/寫,等等。因而,對于任何以1-7結尾的地址,不存在有效的選擇器,因為最低3個位必須為零。例如,不能使用這13個位的選擇器來表示9DF1h至9DF7h。在實模式下,所有的段地址都是有效的,因為段地址在使用之前被左移了4位。從而,在段地址9DF0h和9DF1h之間實際上存在16個字節,但9DF1h是一個有效地址。第二,由選擇器0引用的第一個描述符必須總為空。這可能會導致問題,因為實模式中斷向量表(IVT)通常位于地址0000:0000處,且需要為零的選擇器引用。以下,在典型實施例中描述了關于這些問題的可能解決方案。
在一個實施例中,從上述GDT中指定了一系列已知從不會被上述可選ROM或任何相關驅動器使用的描述符。例如,如果將這種方法僅應用于一個可選ROM,則可以保留未使用的地址范圍,如3000:0至3FFF:0。另一個實施例建立了另一種稱為局部描述符表(LDT)的描述符表來表示那些不能被8整除的段地址。在任一種情況下,安裝的GPF處理器必須用表示需要被尋址的內存的描述符代替上述無效的段寄存器中的值。只要GPF處理器恰當地將正確的物理內存位置關聯到正在執行的指令,則可以使用其他方法來俘獲不規則(odd)段地址。對本領域技術人員而言,顯而易見,可以用各種方法來轉換這些不規則的地址,且這些方法與實施方式有關。
在一個實施例中,當調用上述可選的ROM的入口點時(如通過調用中斷服務程序(ISR)),處理器切換到保護模式,且安裝了上述的GDT和可選的LDT。在可選的ROM退出之前,處理器恢復到其之前的狀態,包括恢復任何之前安裝的描述符表。
現在參考圖4,其中示出了一種使得為實模式內存訪問設計的代碼能訪問擴展內存的典型系統。處理器401在運行中連接到與非易失性內存403,后者具有用于啟動系統400的基本輸入輸出系統(BIOS)405。以通信方式將附加設備407與處理器401耦合,且可存在用于初始化附加設備407的可選的ROM 409。BIOS405在預啟動過程中掃描系統400,并加載和執行可選的ROM409的設備代碼。處理器與系統內存411相連。在實模式過程中,僅可訪問1MB的系統內存411。該處理器可能經歷啟動中斷服務程序(ISR)415的一般保護錯誤(GPF)。在實施例中,ISR415在保護模式期間處理內存訪問,以仿真對實模式內存進行的訪問,如以下所述。
圖5還示出了在實模式和保護模式下對系統內存411進行訪問的不同之處。系統內存411包括640K的傳統內存501和上位內存503。在現有的系統中,傳統內存501與上位內存503組合在一起構成了1MB的內存。可存在各種數量的擴展內存505。實模式內存訪問510使得指令能訪問傳統內存與上位內存。保護模式訪問520使得該指令還能訪問使用GDT530的擴展內存(即虛擬內存)。通過轉換GDT中的基址,保護模式下使用的虛擬地址使用GDT來訪問擴展內存。
在一個實施例中,將程序(如存儲在可選ROM中的指令)設計成用于實模式(即限于1MB)。當加載這些指令時,BIOS分配1MB的擴展內存,以執行該可選ROM。該處理器切換至保護模式,且可將該可選的ROM實模式編址轉換成使用GPF、ISR和描述符表的保護模式擴展內存地址。這種方法讓人覺得似乎可選ROM訪問了整個1MB的實模式地址空間,而沒有與其他已加載的可選ROM或系統BIOS發生沖突。以這種方式,現有的實模式程序便可以使用更多的內存空間,而無需被重寫來明確地訪問擴展內存。
本發明的實施例可用來減少程序使用的傳統內存數量。本發明的實施例也允許程序縮減其上位內存塊(UMB)代碼圖像(codeimage)。這使得系統BIOS能加載更多的可選ROM。
在現有的系統中,存在兩種類型的可選ROM(1)啟動連接向量(BCV)設備(即用于小型計算機接口(SCSI)卡之類的設備),它們通常使用int 13中斷訪問磁盤,和(2)啟動入口向量(BEV)設備。從加電自檢(POST)開始BCV設備便必須駐留于內存中,因為它們可能包含啟動指令。這些設備通常不使用過多內存。
BEV設備通常是預啟動執行環境(PXE)設備,它不需要存在于整個預啟動過程中,但可用于啟動系統。在BIOS和所有其他ROM結束使用實模式內存之前,BIOS不會企圖啟動這些PXE設備。PXE設備可能占用大量的內存。然而,由于它們在其他設備結束對內存的使用之前不會啟動,因而無需擔心其他預啟動程序會破壞PXE裝置需要的內存。
互聯網SCSI(iSCSI)是對SCSI協議的串行化,并運行于互聯網或互聯網協議網絡。通過網絡,iSCSI使得來自遠程磁盤的處理器可以在另一計算機上運行,就仿佛該處理器位于本地一樣。iSCSI驅動器看起來就像是該系統上的另一個驅動器。iSCSI啟動設備必須存在于整個預啟動執行過程中,且具有與PXE設備相同的內存需求。因而,當在預啟動過程中執行其他需要部分真實內存的可選ROM或指令時,人們遇到了挑戰。現有的系統不具有這樣的內存管理系統它能容納具有很高內存要求的設備,這些要求阻止另一模塊或設備改寫內存。因而,現有的iSCSI裝置不能用作啟動設備。
對iSCSI而言,需要許多緩沖器來讓網絡流量正常進行,因此需要更多的內存。如果在實模式下分配緩沖器,則因為這些緩沖器占用了如此之多的內存,以至于當BIOS再次取得控制權時,這些緩沖器將會被BIOS改寫。未來的遠程IDE協議也將經歷與iSCSI同樣的問題。同樣,其他遠程啟動協議也可能經歷這些問題。本發明的實施例使得iSCSI裝置能成為啟動設備,并可以容納未來的遠程IDE協議。
所公開方法的實施例的優點在于門A20未受影響。門A20控制了1MB地址的回繞特征。當啟用回繞特征且引用1MB內的地址時,實模式編址從底部起發生回繞。為了訪問擴展內存,需要停用該特征。關閉該特征可能會破壞許多當前系統上存在的加電自檢內存管理器(PMM)。PMM允許以有組織的方式訪問超過1MB的內存。如果PMM在平臺上運行,便不應直接更改A20的設置。即使本發明的實施例可以訪問處于保護模式下的超過1MB的地址,但也可將GDT中的選擇器長度限制設為64KB或更少,使得A20回繞從不被使用。虛擬地址將不會超過1MB,但物理地址有可能超過此限制。在一個實施例中,門A20僅影響虛擬地址。一旦使用GDT將虛擬地址解碼,它將超過1MB。門A20通常僅在實模式下使用,但因為在預啟動其間使用了該技術,因而,對其他程序而言,可以將該門置位或不置位。
現在參考圖6,其中的流程圖示出了一種方法的實施例,該方法用于使針對實模式編寫的應用程序在保護模式下以透明的方式訪問擴展內存。當處理器被啟動時,它隨框601中的ROM初始化而繼續進行流程。BIOS對設備進行掃描,并在必要時執行來自這些設備的可選ROM。
在執行可選ROM之前,在框603中,BIOS可以為各可選ROM分配用于存儲數據的擴展內存。最好為各可選ROM分配完整的1MB擴展內存,以使人覺得似乎所有真實內存均已分配給可選ROM的執行。如果存在加電自檢內存管理器(PMM),則可以用PMM來分配內存。如果不存在該管理器,則可使用其他分配方法。
在一個實施例中,在框605中創建并初始化了全局描述符表(GDTs)、中斷描述符表(IDT)和可選的局部描述符表(LDTs)。用處理器指令來安裝這些表。安裝GDT相當于讓處理器得知這些表位于何處。必要時,處理器查找GDT中的虛擬地址,然后執行所述轉換。由于訪問空描述符的緣故,因而用于處理一般保護錯誤(GPF)的中斷服務程序(ISR)被加載到IDT中,并與適當的GPF處理器進行關聯。當處理器實際上運行于實模式時,不存在GPF,且不會運行ISR。當前執行的可選ROM將與當前的GDT進行關聯。該過程僅需要一個額外的GDT。可能存在與各種可選ROM和預啟動指令相關聯的GDT的堆疊,但其中未牽涉到特殊的處理。
當處理器運行可選ROM指令或其他設置成使用本公開方法的預啟動指令時,在執行可能需要訪問內存的指令之前,可能會生成GPF。在框611中,可執行中斷服務程序(ISR)來處理上述內存訪問,以使用擴展內存而非較低的1MB內存。如果已填充了描述符,即已轉換了該內存地址,則可以執行上述指令,而不會生成GPF。在一個例子中,指令指針可以引用移動指令(即將某些數據移入內存A(x)之中),而這要求對實模式內存地址A(x)進行內存訪問。根據本公開的一個實施例,將會把由上述指令引用的內存位置映射到擴展內存。而內存訪問本身導致了異常或錯誤,并啟動了錯誤處理器或中斷服務程序。在框613中,ISR將處理器切換至保護模式,但記住了該切換之前上述處理器所處的模式。
一旦處于保護模式下,便使用選擇器和偏移方法訪問內存,但是,在框621中,上述指令使用實模式段格式。在訪問實際內存之前,必須通過上述處理器來轉換內存引用。錯誤處理器確定是否使用GDT來映射內存。如果不能,則將數據段(DS)變更為LDT的索引。ISR仍然知曉引用了哪個物理地址。
可選ROM環境未發生改變。這些可選ROM在實模式段地址處運行。當可選ROM代碼嘗試進行訪問時,如果尚未在GDT中建立段地址,則描述符便為空。該處理器將該段地址用作GDT中的選擇器。然后,在框623中,處理器確定引用的描述符是否為空。如果該描述符為空,則在框625中,由上述處理器發出一般保護錯誤GPF。與該GPF關聯的ISR將可選ROM代碼使用的選擇器映射成擴展內存中的不同物理地址,然后,試圖再次執行該指令。該ISR將段和偏移映射成選擇器和偏移,以通過GDT訪問擴展內存。
由于較低的3個字節為0,因而,如果出現了GPF,則可使用局部描述符表(LDT)來填充編址中的間隙,但不可使用GDT。相反,可以用LDT將新的選擇器映射到虛擬內存,然后,使用適當的選擇器/偏移的組合來重新執行指令。本領域技術人員將懂得,也可以用其他方法來映射使用GDT方案不能尋址的段。LDT可以以與GDT相同的方式工作,也就是說,它具有描述符,該描述符具有基址和長度限制。可能不經常使用LDT,因為通常在GDT包含的邊界上的組塊(chunk)中引用內存。如果必要,則可能在LDT中設置描述符,且將被引用的物理地址置于LDT之中,并且將DS變為LDT的索引。
為確定LDT是否必要,在框627中,確定段地址的最后3個位是否為零和它是否為非空段。在框629中,如果最后3個位為0,則可以使用GDT,且在GDT中為該段地址創建了用于指向擴展內存中的正確位置的新描述符。
如果段地址的最后3個位不為0,則在框631和633中,必須使用另外的方法將該地址轉換成擴展內存。在一個實施例中,在框631中,使用來自LDT的空描述符。并用段信息來填充該描述符。然后,在框633中,用新創建的LDT描述符代替段寄存器。
在一個實施例中,LDT具有一個有效描述符。可以使用LDT中的第一個要素。建立該描述符并訪問了該地址。將上述段地址變成了指向LDT的指針。當使用GDT時,無需改變段。在一個實例中,將該段變為8。該LDT的大小可以與GDT的大小相同。描述符1是該LDT中第一個可用的描述符。建立該描述符,以引用期望在實模式下訪問的內存。用LDT中的新描述符來代替上述段地址。然后,在框641中,處理器離開錯誤處理器,并重新執行該單一指令。可能使用處理器阱(trap)來執行單一指令。然后,用最初地址代替上述段地址,以供將來使用。在框643中,確定任務是否已完成。如果是這樣,則在框645中,將處理器恢復到其之前的模式,并恢復最初的描述符表(GDT/LDT)。在一個實施例中,各程序均具有唯一的GDT/LDT,且它們存儲在堆棧或其他數據結構中,以確保使用適當的表。當執行在框651中離開時,繼續進行所述流程。然而,如果任務并未完成,換言之,還需要另外的內存訪問,則在框621中,繼續進行處理。
在另一個實施例中,可以為LDT加載散列表,然后,LDT像GDT一樣運行。當引用地址時,如果存在異常,則與GDT一樣,在LDT中分配描述符,然后,返回該描述符,并讓ISR通過LDT正常訪問內存。這種方法的缺點在于使用了更多內存,因為各個段必須具有不重復使用的散列位置。因而,必須為該表分配整個64K的空間。由于各可選ROM均需分配其自身的LDT,因而這種方法可能不是很理想。
在另一個實施例中,對處理器和BIOS也應用這種方法,使得BIOS代碼可以在1MB的擴展內存而非較低的1MB內存中執行。在一個實施例中,可選ROM啟動至保護模式的轉變。在另一個實施例中,BIOS啟動至保護模式的轉變,并使用公開的技術來訪問擴展內存。這種轉換對執行代碼而言是透明的。
另一個難點是中斷向量表(IVT)通常位于0000h。描述符位置0不可用。然而,幾乎總是使用為0的段地址來訪問IVT。在一個實施例中,按以下方式訪問該表建立映射到零地址的非零描述符,訪問該表,然后重新設置上述地址,以供以后使用。上述過程之所以必要,是因為期望在實模式下執行要執行的程序,然而該程序實際上在保護模式下執行。
一個關于希望在何處應用本發明的實施例的例子是實施互聯網小型計算機系統接口(iSCSI)啟動可選ROM。為了讓iSCSI啟動正常進行,必須在內存中保留若干較大的項,這些項包括用于提供網絡訪問功能的網絡接口卡(NIC)或主板集成局域網(LAN)(LOM)驅動程序,以及用于與iSCSI目標通信的全功能傳輸控制協議/互聯網協議(TCP/IP)和iSCSI堆棧。iSCSI啟動在現有系統中存在問題,因為必須在驅動過程的極早期分配內存,且在OS啟動加載器執行至保護模式iSCSI啟動程序的切換之前,該內存必須保持可用。因為必須將該內存保持如此長的時間(按預啟動標準),因而,不能將該內存分配成可以由其他程序使用的暫時內存(scratch memory)。另一個問題之所以存在,僅僅是因為可以使用現有的NIC/LOM驅動程序來提供網絡訪問,且也許不能改變這些驅動程序來使用擴展內存。本公開方法的實施例允許iSCSI和LOM驅動程序在不經過重寫的情況下訪問擴展內存。
本文所述的技術不限于任何特定的硬件或軟件配置;它們可用于任何計算、消費電子產品或處理環境。可以以硬件、軟件和這兩者的組合來實施本技術。可以在移動或固定計算機、個人數字助理、機頂盒、蜂窩電話與尋呼機、消費電子產品(包括DVD播放器、個人錄像機、個人放像機、衛星接收機、立體聲接收機、有線電視接收機)之類的可編程設備和其他電子設備(可包括處理器、可由處理器讀的存儲介質(包括易失和非易失性內存和/或存儲元件)、至少一個輸入設備以及一個或多個輸出設備)上運行的程序中實施本技術。將程序代碼應用于使用輸入設備輸入的數據來執行上述功能以及生成輸出信息。可以將該輸出信息應用于一個或多個輸出設備。本領域技術人員將懂得,可以用各種系統配置(包括多處理器系統、微型計算機、獨立的消費電子設備等)來實施本發明。也可以在分布式計算環境(其中,通過經通信網絡連接的遠程處理設備來執行任務)中實施本發明。
可以用高級的過程或面向對象的編程語言來實施各程序,以便與處理系統進行通信。然而,如果需要,也可以用匯編語言或機器語言來實施各程序。在任何情況下,均可以編譯或解釋上述語言。
可以用程序指令來使編有這些指令的通用或專用處理系統執行上述的操作。或者,可通過包含用于這些操作的硬接線邏輯的特定硬件部件或經過編程的計算機部件與定制的硬件部件的任何組合來執行上述操作。可以以計算機程序產品的形式提供本文所述的方法,該產品包括其上存有可用于對處理系統或其他電子設備編程而使它們執行所述方法的指令的機器可訪問介質。本文使用的術語“機器可訪問介質”應包括任何能存儲或編碼由機器執行的指令序列和使得該機器執行本文所述方法中的任一種方法的介質。因此,術語“機器可訪問介質”應當包括但不僅限于固態存儲器、光盤和磁盤和對數據信號進行編碼的載波。另外,業內通常將一種形式或另一種形式的軟件(如程序、流程、過程、應用程序、模塊、邏輯等等)稱為采取行動或引起結果。這樣的表達僅僅是陳述上述情形(即由處理系統執行上述軟件,從而引起處理器執行某些動作,并得到結果)的一種簡化方式。
盡管已結合說明性實施例描述了本發明,但是,不應將本說明書視為限制性的。并且,認為那些對本領域技術人員而言顯而易見的所述實施例的各種修改、本發明的其他實施例落在本發明的精神和范圍內。
權利要求
1.一種方法,包括將用于存儲數據的擴展內存分配給預啟動應用程序,該預啟動應用程序設計成在實模式下運行;將處理器切換至保護模式;將由所述預啟動應用程序使用的實模式內存地址轉換為擴展內存地址引用;以及使用所述轉換后的擴展內存地址而非所述實模式內存地址執行預啟動應用程序指令。
2.如權利要求1所述的方法,其中,分配擴展內存還包括創建描述符表;以及初始化所述描述符表。
3.如權利要求2所述的方法,其中,所述描述符表包括至少一個全局描述符表(GDT)、至少一個中斷描述符表(IDT)和至少一個局部描述符表(LDT)。
4.如權利要求1所述的方法,其中,所述轉換由中斷服務程序(ISR)執行。
5.如權利要求4所述的方法,還包括使用實模式段寄存器訪問內存;如果在全局描述符表(GDT)中引用了空描述符,則發出一般保護錯誤(GPF);以及在所述GDT中創建指向擴展內存中的位置的新描述符。
6.如權利要求5所述的方法,還包括當所述段寄存器的標志位不為零時,使用局部描述符表來轉換地址;以及用新創建的LDT描述符代替所述段寄存器。
7.一種機器可訪問介質,包含用于將實模式地址轉換為保護模式地址的指令,當執行這些指令時,將導致機器將用于存儲數據的擴展內存分配給預啟動應用程序,該預啟動應用程序設計成在實模式下運行;將處理器切換至保護模式;將由所述預啟動應用程序使用的實模式地址轉換成擴展內存地址引用;以及使用所述轉換后的擴展內存地址而非所述實模式內存地址來執行預啟動應用程序指令。
8.如權利要求7所述的機器可訪問介質,其包含的指令還導致所述機器創建描述符表;以及初始化所述描述符表。
9.如權利要求8所述的機器可訪問介質,其中,所述描述符表包括至少一個全局描述符表(GDT)、至少一個中斷描述符表(IDT)和至少一個局部描述符表(LDT)。
10.如權利要求7所述的機器可訪問介質,其中,所述轉換由中斷服務程序(ISR)來執行。
11.如權利要求10所述的機器可訪問介質,其包含的指令還導致所述機器使用實模式段寄存器訪問內存;如果在全局描述符表(GDT)中引用了空描述符,則發出一般保護錯誤(GPF);以及在所述GDT中創建指向擴展內存中的位置的新描述符。
12.如權利要求11所述的機器可訪問介質,其包含的指令還導致所述機器當所述段寄存器的標志位不為零時,使用局部描述符表來轉換地址;以及用新創建的LDT描述符代替所述段寄存器。
13.一種系統,包括在運行中耦合到存儲預啟動指令的非易失性內存的處理器;在運行中耦合到所述處理器的系統內存,其中,所述系統內存包括可以在實模式與保護模式下訪問的傳統內存塊和上位內存塊,以及僅能在保護模式下訪問的擴展內存塊;以及用于將實模式段編址轉換成保護模式選擇器編址的中斷服務程序(ISR),其中,當預啟動應用程序在執行期間試圖訪問內存時,該ISR自動啟動。
14.如權利要求13所述的系統,其中,所述預啟動應用程序是用于附加設備的可選ROM。
15.如權利要求13所述的系統,其中,在將實模式段編址轉換為保護模式選擇器編址的過程中,所述ISR使用描述符表,且其中空描述符引發一般保護錯誤來啟動中斷處理程序,以生成所述引用了擴展內存中的物理內存地址的段地址的描述符。
16.如權利要求13所述的系統,其中,所述預啟動應用程序是基本輸入/輸出系統(BIOS)。
全文摘要
在某些實施例中,本發明包括一種系統和方法,該系統和方法涉及在執行設計成用于實模式內存訪問的指令代碼的同時切換至保護模式來訪問擴展內存。在至少一個實施例中,本發明希望能在預啟動過程中執行復雜的可選ROM代碼,而不致破壞由BIOS或其他可選ROM使用的系統內存。也描述和主張了其他實施例。
文檔編號G06F9/46GK1977243SQ200580021416
公開日2007年6月6日 申請日期2005年6月15日 優先權日2004年6月30日
發明者D·L·馬瑟尼 申請人:英特爾公司