亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

模擬實(shí)模式內(nèi)存訪問時(shí)訪問擴(kuò)展內(nèi)存的系統(tǒng)和方法

文檔序號(hào):6656302閱讀:206來源:國(guó)知局
專利名稱:模擬實(shí)模式內(nèi)存訪問時(shí)訪問擴(kuò)展內(nèi)存的系統(tǒng)和方法
技術(shù)領(lǐng)域
本發(fā)明的實(shí)施例一般涉及計(jì)算系統(tǒng),更具體地,涉及在模擬實(shí)模式內(nèi)存訪問的同時(shí)在保護(hù)模式下訪問擴(kuò)展內(nèi)存。
背景技術(shù)
盡管多年來計(jì)算機(jī)均配備了若干兆字節(jié)的隨機(jī)存取存儲(chǔ)器(RAM),但是,在實(shí)模式下,預(yù)啟動(dòng)附加設(shè)備可用的總內(nèi)存仍然僅限于1MB的內(nèi)存。這1MB的限制已成為預(yù)啟動(dòng)期間的負(fù)擔(dān),因?yàn)椴淮嬖趶?40K的基本內(nèi)存區(qū)中分配內(nèi)存的標(biāo)準(zhǔn)方法。在很多情況下,由一個(gè)程序分配的內(nèi)存將會(huì)被另一個(gè)程序改寫,因?yàn)樵摮绦蚧蛘呶床煊X所使用的內(nèi)存分配方法,或者程序本身存在缺陷。無法阻止一個(gè)程序改寫內(nèi)存中的另一個(gè)程序的數(shù)據(jù),因?yàn)樵陬A(yù)啟動(dòng)期間不存在保護(hù)機(jī)制。在實(shí)模式下,每個(gè)程序均能訪問所有可用內(nèi)存。某些競(jìng)爭(zhēng)內(nèi)存的程序是設(shè)備特有的可選ROM(option ROM)、基本輸入/輸出系統(tǒng)和操作系統(tǒng)(OS)啟動(dòng)加載器。為使用擴(kuò)展內(nèi)存,可以超越1MB限制,但這通常需要對(duì)之前運(yùn)行于實(shí)模式下的程序進(jìn)行較大的修改。
當(dāng)計(jì)算機(jī)系統(tǒng)啟動(dòng)時(shí),BIOS取得控制權(quán),且處理器執(zhí)行于實(shí)模式。對(duì)處理器而言,實(shí)模式通常是16位模式,但由于段地址的緣故,也可以訪問20位的地址。16位模式意味著可以訪問16位地址。與使用不具有段的16位地址僅能訪問64K內(nèi)存相比,段編址(addressing)允許訪問1MB內(nèi)存。在實(shí)模式下,總的可用內(nèi)存空間是1MB。在實(shí)模式下,傳統(tǒng)上應(yīng)用程序能使用640K的基本內(nèi)存。而擴(kuò)展內(nèi)存或超過1MB的內(nèi)存在實(shí)模式下不可用。
現(xiàn)在參考圖1,其中示出了一種在實(shí)模式下使用20位段地址和偏移來訪問1MB內(nèi)存的方法。段寄存器101為16位。偏移寄存器103也為16位。通過將段寄存器左移4位而將這些寄存器組合在一起,使得它成為20位數(shù)105。將偏移寄存器103加入段地址105,以生成20位的段+偏移內(nèi)存引用107。
一種理解這種編址方案的簡(jiǎn)單方法是,想象段寄存器105在較低端總具有不可改變的4個(gè)附加位109。因此,該段寄存器實(shí)際上是20位的,但在處理器之外,僅有16位可見。以下,根據(jù)圖1中的數(shù)值加入16位偏移103。實(shí)際的20位段寄存器是1001 1101 1111 0000 0000其中,用粗體表示的0-3位在處理器之外不可見。按以下方式加入該段寄存器和偏移,以產(chǎn)生1MB范圍內(nèi)的物理地址。
可見的段寄存器1001 1101 1111 0000(9DF0)有效偏移+0000 0100 0000 0000(物理(或線性)地址=1001111000110000 00000,也可以寫成9DF00400)在內(nèi)存中,每隔16個(gè)字節(jié)便開始新的可能段。每一個(gè)段均為64K長(zhǎng)。這樣,段之間將發(fā)生相互重疊,即加入段地址的偏移跨度將超過一個(gè)段。在內(nèi)存中的實(shí)際地址內(nèi),可能存在超過4000個(gè)段+偏移的組合。換言之,各物理地址均可能處于多于一個(gè)段的范圍內(nèi)。
圖2示出了具有段地址和64K偏移的16K段地址的重疊。例如,示出了段地址0(201)、段地址1(203)和段地址2(205)。將多達(dá)64K的偏移加入段地址0,這引用了與使用段地址2引用的內(nèi)存(209)重疊的內(nèi)存207。這種編址方案在業(yè)內(nèi)是眾所周知的。
保護(hù)模式使得程序可以訪問超過1MB的內(nèi)存。處理器可以隨時(shí)切換到保護(hù)模式。上述執(zhí)行軟件啟動(dòng)至保護(hù)模式的切換。該執(zhí)行軟件也可以切換回實(shí)模式。至保護(hù)模式的切換通常是通過啟動(dòng)加載器(boot loader)在加載操作系統(tǒng)(OS)時(shí)執(zhí)行的,這使得OS可以使用所有內(nèi)存。在保護(hù)模式期間,可通過選擇器和偏移的組合來訪問擴(kuò)展內(nèi)存。
在應(yīng)用程序?qū)?nèi)存的要求較高時(shí),業(yè)內(nèi)需要使預(yù)啟動(dòng)應(yīng)用程序(如在設(shè)備特有的可選ROM上找到的那些應(yīng)用程序)能使用擴(kuò)展內(nèi)存而非較低的1MB內(nèi)存。也需要使那些原本設(shè)計(jì)成在實(shí)模式下運(yùn)行的預(yù)啟動(dòng)應(yīng)用程序在無需重寫的情況下便能在保護(hù)模式下執(zhí)行。


通過本發(fā)明的以下詳細(xì)描述,可以更清楚地理解本發(fā)明的特征和優(yōu)點(diǎn)。
圖1的框圖示出了使用段和偏移的實(shí)模式內(nèi)存編址;圖2的框圖示出,段地址可能在內(nèi)存中發(fā)生重疊;圖3的框圖示出了使用選擇器寄存器、偏移和描述符表的保護(hù)模式內(nèi)存編址的實(shí)施例;圖4的框圖示出了為期望實(shí)模式編址的應(yīng)用程序使用保護(hù)模式內(nèi)存編址的系統(tǒng)的典型實(shí)施例;圖5的框圖示出了使用實(shí)模式和保護(hù)模式編址訪問較低的1MB內(nèi)存和擴(kuò)展內(nèi)存的不同;以及圖6的流程圖示出了本文所述的、用于使用保護(hù)模式來使預(yù)啟動(dòng)應(yīng)用程序能使用擴(kuò)展內(nèi)存的方法的實(shí)施例。
具體實(shí)施例方式
本發(fā)明的一個(gè)實(shí)施例是一種涉及在執(zhí)行設(shè)計(jì)成用于實(shí)模式內(nèi)存訪問的指令代碼的同時(shí)切換到保護(hù)模式來訪問擴(kuò)展內(nèi)存的系統(tǒng)和方法。在至少一個(gè)實(shí)施例中,本發(fā)明希望在預(yù)啟動(dòng)過程中執(zhí)行復(fù)雜的可選ROM代碼,而不致破壞由BIOS或其他可選ROM使用的系統(tǒng)內(nèi)存。
說明書中提及的本發(fā)明的“一個(gè)實(shí)施例”或“某一實(shí)施例”意味著在本發(fā)明的至少一個(gè)實(shí)施例中包括了結(jié)合這些實(shí)施例所述的特定特征、結(jié)構(gòu)或特性。從而,在說明書中的不同處出現(xiàn)的短語“在一個(gè)實(shí)施例中”不一定指同一實(shí)施例。
本文所述的方法的實(shí)施例將擴(kuò)展內(nèi)存映射到基本內(nèi)存區(qū)中的內(nèi)存。這將允許現(xiàn)有的可選ROM使用更多的基本內(nèi)存,而不至于與其他程序?qū)緝?nèi)存的使用發(fā)生沖突,或是使它們自己的內(nèi)存被其他程序改寫。對(duì)于需要在整個(gè)預(yù)啟動(dòng)階段維持大量數(shù)據(jù)存儲(chǔ)空間的可選ROM而言,這種技術(shù)尤其有用。
所公開方法的一個(gè)實(shí)施例將用于存儲(chǔ)數(shù)據(jù)的擴(kuò)展內(nèi)存分配給預(yù)啟動(dòng)應(yīng)用程序,其中,該預(yù)啟動(dòng)應(yīng)用程序設(shè)計(jì)成在實(shí)模式下運(yùn)行。處理器可以切換到保護(hù)模式??梢詫⒃擃A(yù)啟動(dòng)應(yīng)用程序引用的實(shí)模式內(nèi)存地址轉(zhuǎn)換成擴(kuò)展內(nèi)存地址引用,且可以使用轉(zhuǎn)換后的擴(kuò)展內(nèi)存地址而非實(shí)模式內(nèi)存地址來執(zhí)行上述預(yù)啟動(dòng)應(yīng)用程序指令。
本文所述的方法的一個(gè)實(shí)施例包括在預(yù)啟動(dòng)過程中周期性地將處理器從實(shí)模式切換到保護(hù)模式。為避免對(duì)現(xiàn)有的可選ROM進(jìn)行程序變更,可以使用保護(hù)模式選擇器,并將上述長(zhǎng)度限制設(shè)為小于或等于64KB,且將基址設(shè)為可用的擴(kuò)展內(nèi)存地址。這樣,便無需與門A20接口。如以下所述,門A20控制了1MB地址的回繞(wrap around)特征,并影響了其他預(yù)啟動(dòng)系統(tǒng)(如加電自檢內(nèi)存管理器)。
參考圖3,其中示出了用于訪問處于保護(hù)模式下的虛擬內(nèi)存方案。在保護(hù)模式下,編址使用16位的選擇器301和偏移303。選擇器不同于實(shí)模式中使用的段地址,因?yàn)檫x擇器不是地址,而是描述符表(如全局描述符表(GDT)305)的索引。GDT中的各個(gè)描述符包含用于選擇器的線性基址307和長(zhǎng)度限制309。GDT本身通常被限于64KB,且每個(gè)條目占用8個(gè)字節(jié),這樣,便為總共8192個(gè)描述符留出了空間。各個(gè)描述符的長(zhǎng)度均為8個(gè)字節(jié),且選擇器311的底部的3個(gè)字節(jié)用作標(biāo)志。例如,如果將選擇器設(shè)置為8h,而偏移量為400h,則使用了GDT中的第二描述符。未使用描述符表中的處于零位置的第一位置。在該實(shí)例中,第二描述符包括基址3F00000h和長(zhǎng)度限制0FFFFh(64K段)。由于偏移400h小于長(zhǎng)度限制,因而將該偏移直接加到基址,以形成以下的線性地址3F00000h+400h=3F00400h。如以下進(jìn)一步所述,由于不存在關(guān)于使用上述選擇器的底部3個(gè)位的規(guī)定,因而,如果必須為小于16個(gè)字節(jié)的邊界編址,則可使用其他方法。
本發(fā)明的一個(gè)實(shí)施例將保護(hù)模式選擇器用作偽實(shí)模式段地址。這種方法要求切換到保護(hù)模式??梢苑峙?4KB的GDT,并將其初始化為零或使用每個(gè)引用正確線性地址的描述符來對(duì)其進(jìn)行初始化。最好使每個(gè)描述符均具有0FFFFh(64KB)的長(zhǎng)度限制,以保證實(shí)模式正常工作。在一個(gè)實(shí)例中,可以將整個(gè)GDT初始化為零。在初始化該表之后,通過替換該希望的選擇器,可將擴(kuò)展內(nèi)存地址映射為偽實(shí)模式地址。例如,為將地址3F00000h映射到段地址9DF0h上,可以用基址3F00000h和長(zhǎng)度限制0FFFFh來配置從GDT的開端起的偏移9DF0h處的選擇器。一旦完成此過程,則訪問段9DF0h的實(shí)模式程序?qū)嶋H上將訪問擴(kuò)展內(nèi)存地址3F00000h。這種轉(zhuǎn)換對(duì)正處于執(zhí)行之中的ROM是透明的。
當(dāng)將GDT初始化為零時(shí),所有描述符一開始均為空。如果程序試圖訪問該GDT中的空描述符,則出現(xiàn)一般保護(hù)錯(cuò)誤(GPF)。在保護(hù)模式下,通過安裝中斷描述符表(IDT)和在IDT中安裝GPF處理器便可俘獲這種錯(cuò)誤。當(dāng)調(diào)用GPF處理器時(shí),堆棧上的返回地址就是該違規(guī)指令的地址。以這種方式,在改正最初的問題后,當(dāng)從GPF處理器返回違規(guī)指令時(shí),可以重新執(zhí)行該指令。如果該描述符已初始化為線性地址,或已用該線性地址填充了該描述符,則在不引起GPF的情況下,通過使用該描述符中引用的地址可立即執(zhí)行上述指令。
可以安裝GPF處理器,以處理當(dāng)使用空描述符之一時(shí)出現(xiàn)的錯(cuò)誤。該處理器可以填充被使用的描述符,并重新執(zhí)行該指令。例如,如果段寄存器包含應(yīng)指向BIOS數(shù)據(jù)區(qū)(BDA)的40h,則應(yīng)向處于從GDT的開端起的偏移40h處的描述符填充基址400h和長(zhǎng)度限制0FFFFh。使用段編址,將地址左移4位,且最低4位不用作地址的一部分。當(dāng)GPF處理器完成處理后,重新執(zhí)行上述指令,則程序?qū)⒅苯釉L問實(shí)BIOS數(shù)據(jù)區(qū)。如果內(nèi)存訪問發(fā)生在已進(jìn)行重新映射的范圍內(nèi),則基址應(yīng)指向擴(kuò)展內(nèi)存中的適當(dāng)偏移,且可以縮減上述長(zhǎng)度限制,使得上述程序不能訪問該經(jīng)過分配的擴(kuò)展內(nèi)存(經(jīng)過其末端)。
為使這種方法能夠運(yùn)作,還必須解決其他的一些問題。首先,選擇器可能僅訪問GDT中的8192個(gè)條目,因?yàn)橹挥凶钪匾?3個(gè)位被用作索引。在一個(gè)實(shí)施例中,選擇器(311)中的前3個(gè)位是內(nèi)存的保護(hù)標(biāo)志,且總是為零。對(duì)于其他的應(yīng)用程序,該標(biāo)志用于指明內(nèi)存為只讀或讀/寫,等等。因而,對(duì)于任何以1-7結(jié)尾的地址,不存在有效的選擇器,因?yàn)樽畹?個(gè)位必須為零。例如,不能使用這13個(gè)位的選擇器來表示9DF1h至9DF7h。在實(shí)模式下,所有的段地址都是有效的,因?yàn)槎蔚刂吩谑褂弥氨蛔笠屏?位。從而,在段地址9DF0h和9DF1h之間實(shí)際上存在16個(gè)字節(jié),但9DF1h是一個(gè)有效地址。第二,由選擇器0引用的第一個(gè)描述符必須總為空。這可能會(huì)導(dǎo)致問題,因?yàn)閷?shí)模式中斷向量表(IVT)通常位于地址0000:0000處,且需要為零的選擇器引用。以下,在典型實(shí)施例中描述了關(guān)于這些問題的可能解決方案。
在一個(gè)實(shí)施例中,從上述GDT中指定了一系列已知從不會(huì)被上述可選ROM或任何相關(guān)驅(qū)動(dòng)器使用的描述符。例如,如果將這種方法僅應(yīng)用于一個(gè)可選ROM,則可以保留未使用的地址范圍,如3000:0至3FFF:0。另一個(gè)實(shí)施例建立了另一種稱為局部描述符表(LDT)的描述符表來表示那些不能被8整除的段地址。在任一種情況下,安裝的GPF處理器必須用表示需要被尋址的內(nèi)存的描述符代替上述無效的段寄存器中的值。只要GPF處理器恰當(dāng)?shù)貙⒄_的物理內(nèi)存位置關(guān)聯(lián)到正在執(zhí)行的指令,則可以使用其他方法來俘獲不規(guī)則(odd)段地址。對(duì)本領(lǐng)域技術(shù)人員而言,顯而易見,可以用各種方法來轉(zhuǎn)換這些不規(guī)則的地址,且這些方法與實(shí)施方式有關(guān)。
在一個(gè)實(shí)施例中,當(dāng)調(diào)用上述可選的ROM的入口點(diǎn)時(shí)(如通過調(diào)用中斷服務(wù)程序(ISR)),處理器切換到保護(hù)模式,且安裝了上述的GDT和可選的LDT。在可選的ROM退出之前,處理器恢復(fù)到其之前的狀態(tài),包括恢復(fù)任何之前安裝的描述符表。
現(xiàn)在參考圖4,其中示出了一種使得為實(shí)模式內(nèi)存訪問設(shè)計(jì)的代碼能訪問擴(kuò)展內(nèi)存的典型系統(tǒng)。處理器401在運(yùn)行中連接到與非易失性內(nèi)存403,后者具有用于啟動(dòng)系統(tǒng)400的基本輸入輸出系統(tǒng)(BIOS)405。以通信方式將附加設(shè)備407與處理器401耦合,且可存在用于初始化附加設(shè)備407的可選的ROM 409。BIOS405在預(yù)啟動(dòng)過程中掃描系統(tǒng)400,并加載和執(zhí)行可選的ROM409的設(shè)備代碼。處理器與系統(tǒng)內(nèi)存411相連。在實(shí)模式過程中,僅可訪問1MB的系統(tǒng)內(nèi)存411。該處理器可能經(jīng)歷啟動(dòng)中斷服務(wù)程序(ISR)415的一般保護(hù)錯(cuò)誤(GPF)。在實(shí)施例中,ISR415在保護(hù)模式期間處理內(nèi)存訪問,以仿真對(duì)實(shí)模式內(nèi)存進(jìn)行的訪問,如以下所述。
圖5還示出了在實(shí)模式和保護(hù)模式下對(duì)系統(tǒng)內(nèi)存411進(jìn)行訪問的不同之處。系統(tǒng)內(nèi)存411包括640K的傳統(tǒng)內(nèi)存501和上位內(nèi)存503。在現(xiàn)有的系統(tǒng)中,傳統(tǒng)內(nèi)存501與上位內(nèi)存503組合在一起構(gòu)成了1MB的內(nèi)存??纱嬖诟鞣N數(shù)量的擴(kuò)展內(nèi)存505。實(shí)模式內(nèi)存訪問510使得指令能訪問傳統(tǒng)內(nèi)存與上位內(nèi)存。保護(hù)模式訪問520使得該指令還能訪問使用GDT530的擴(kuò)展內(nèi)存(即虛擬內(nèi)存)。通過轉(zhuǎn)換GDT中的基址,保護(hù)模式下使用的虛擬地址使用GDT來訪問擴(kuò)展內(nèi)存。
在一個(gè)實(shí)施例中,將程序(如存儲(chǔ)在可選ROM中的指令)設(shè)計(jì)成用于實(shí)模式(即限于1MB)。當(dāng)加載這些指令時(shí),BIOS分配1MB的擴(kuò)展內(nèi)存,以執(zhí)行該可選ROM。該處理器切換至保護(hù)模式,且可將該可選的ROM實(shí)模式編址轉(zhuǎn)換成使用GPF、ISR和描述符表的保護(hù)模式擴(kuò)展內(nèi)存地址。這種方法讓人覺得似乎可選ROM訪問了整個(gè)1MB的實(shí)模式地址空間,而沒有與其他已加載的可選ROM或系統(tǒng)BIOS發(fā)生沖突。以這種方式,現(xiàn)有的實(shí)模式程序便可以使用更多的內(nèi)存空間,而無需被重寫來明確地訪問擴(kuò)展內(nèi)存。
本發(fā)明的實(shí)施例可用來減少程序使用的傳統(tǒng)內(nèi)存數(shù)量。本發(fā)明的實(shí)施例也允許程序縮減其上位內(nèi)存塊(UMB)代碼圖像(codeimage)。這使得系統(tǒng)BIOS能加載更多的可選ROM。
在現(xiàn)有的系統(tǒng)中,存在兩種類型的可選ROM(1)啟動(dòng)連接向量(BCV)設(shè)備(即用于小型計(jì)算機(jī)接口(SCSI)卡之類的設(shè)備),它們通常使用int 13中斷訪問磁盤,和(2)啟動(dòng)入口向量(BEV)設(shè)備。從加電自檢(POST)開始BCV設(shè)備便必須駐留于內(nèi)存中,因?yàn)樗鼈兛赡馨瑔?dòng)指令。這些設(shè)備通常不使用過多內(nèi)存。
BEV設(shè)備通常是預(yù)啟動(dòng)執(zhí)行環(huán)境(PXE)設(shè)備,它不需要存在于整個(gè)預(yù)啟動(dòng)過程中,但可用于啟動(dòng)系統(tǒng)。在BIOS和所有其他ROM結(jié)束使用實(shí)模式內(nèi)存之前,BIOS不會(huì)企圖啟動(dòng)這些PXE設(shè)備。PXE設(shè)備可能占用大量的內(nèi)存。然而,由于它們?cè)谄渌O(shè)備結(jié)束對(duì)內(nèi)存的使用之前不會(huì)啟動(dòng),因而無需擔(dān)心其他預(yù)啟動(dòng)程序會(huì)破壞PXE裝置需要的內(nèi)存。
互聯(lián)網(wǎng)SCSI(iSCSI)是對(duì)SCSI協(xié)議的串行化,并運(yùn)行于互聯(lián)網(wǎng)或互聯(lián)網(wǎng)協(xié)議網(wǎng)絡(luò)。通過網(wǎng)絡(luò),iSCSI使得來自遠(yuǎn)程磁盤的處理器可以在另一計(jì)算機(jī)上運(yùn)行,就仿佛該處理器位于本地一樣。iSCSI驅(qū)動(dòng)器看起來就像是該系統(tǒng)上的另一個(gè)驅(qū)動(dòng)器。iSCSI啟動(dòng)設(shè)備必須存在于整個(gè)預(yù)啟動(dòng)執(zhí)行過程中,且具有與PXE設(shè)備相同的內(nèi)存需求。因而,當(dāng)在預(yù)啟動(dòng)過程中執(zhí)行其他需要部分真實(shí)內(nèi)存的可選ROM或指令時(shí),人們遇到了挑戰(zhàn)。現(xiàn)有的系統(tǒng)不具有這樣的內(nèi)存管理系統(tǒng)它能容納具有很高內(nèi)存要求的設(shè)備,這些要求阻止另一模塊或設(shè)備改寫內(nèi)存。因而,現(xiàn)有的iSCSI裝置不能用作啟動(dòng)設(shè)備。
對(duì)iSCSI而言,需要許多緩沖器來讓網(wǎng)絡(luò)流量正常進(jìn)行,因此需要更多的內(nèi)存。如果在實(shí)模式下分配緩沖器,則因?yàn)檫@些緩沖器占用了如此之多的內(nèi)存,以至于當(dāng)BIOS再次取得控制權(quán)時(shí),這些緩沖器將會(huì)被BIOS改寫。未來的遠(yuǎn)程IDE協(xié)議也將經(jīng)歷與iSCSI同樣的問題。同樣,其他遠(yuǎn)程啟動(dòng)協(xié)議也可能經(jīng)歷這些問題。本發(fā)明的實(shí)施例使得iSCSI裝置能成為啟動(dòng)設(shè)備,并可以容納未來的遠(yuǎn)程IDE協(xié)議。
所公開方法的實(shí)施例的優(yōu)點(diǎn)在于門A20未受影響。門A20控制了1MB地址的回繞特征。當(dāng)啟用回繞特征且引用1MB內(nèi)的地址時(shí),實(shí)模式編址從底部起發(fā)生回繞。為了訪問擴(kuò)展內(nèi)存,需要停用該特征。關(guān)閉該特征可能會(huì)破壞許多當(dāng)前系統(tǒng)上存在的加電自檢內(nèi)存管理器(PMM)。PMM允許以有組織的方式訪問超過1MB的內(nèi)存。如果PMM在平臺(tái)上運(yùn)行,便不應(yīng)直接更改A20的設(shè)置。即使本發(fā)明的實(shí)施例可以訪問處于保護(hù)模式下的超過1MB的地址,但也可將GDT中的選擇器長(zhǎng)度限制設(shè)為64KB或更少,使得A20回繞從不被使用。虛擬地址將不會(huì)超過1MB,但物理地址有可能超過此限制。在一個(gè)實(shí)施例中,門A20僅影響虛擬地址。一旦使用GDT將虛擬地址解碼,它將超過1MB。門A20通常僅在實(shí)模式下使用,但因?yàn)樵陬A(yù)啟動(dòng)其間使用了該技術(shù),因而,對(duì)其他程序而言,可以將該門置位或不置位。
現(xiàn)在參考圖6,其中的流程圖示出了一種方法的實(shí)施例,該方法用于使針對(duì)實(shí)模式編寫的應(yīng)用程序在保護(hù)模式下以透明的方式訪問擴(kuò)展內(nèi)存。當(dāng)處理器被啟動(dòng)時(shí),它隨框601中的ROM初始化而繼續(xù)進(jìn)行流程。BIOS對(duì)設(shè)備進(jìn)行掃描,并在必要時(shí)執(zhí)行來自這些設(shè)備的可選ROM。
在執(zhí)行可選ROM之前,在框603中,BIOS可以為各可選ROM分配用于存儲(chǔ)數(shù)據(jù)的擴(kuò)展內(nèi)存。最好為各可選ROM分配完整的1MB擴(kuò)展內(nèi)存,以使人覺得似乎所有真實(shí)內(nèi)存均已分配給可選ROM的執(zhí)行。如果存在加電自檢內(nèi)存管理器(PMM),則可以用PMM來分配內(nèi)存。如果不存在該管理器,則可使用其他分配方法。
在一個(gè)實(shí)施例中,在框605中創(chuàng)建并初始化了全局描述符表(GDTs)、中斷描述符表(IDT)和可選的局部描述符表(LDTs)。用處理器指令來安裝這些表。安裝GDT相當(dāng)于讓處理器得知這些表位于何處。必要時(shí),處理器查找GDT中的虛擬地址,然后執(zhí)行所述轉(zhuǎn)換。由于訪問空描述符的緣故,因而用于處理一般保護(hù)錯(cuò)誤(GPF)的中斷服務(wù)程序(ISR)被加載到IDT中,并與適當(dāng)?shù)腉PF處理器進(jìn)行關(guān)聯(lián)。當(dāng)處理器實(shí)際上運(yùn)行于實(shí)模式時(shí),不存在GPF,且不會(huì)運(yùn)行ISR。當(dāng)前執(zhí)行的可選ROM將與當(dāng)前的GDT進(jìn)行關(guān)聯(lián)。該過程僅需要一個(gè)額外的GDT??赡艽嬖谂c各種可選ROM和預(yù)啟動(dòng)指令相關(guān)聯(lián)的GDT的堆疊,但其中未牽涉到特殊的處理。
當(dāng)處理器運(yùn)行可選ROM指令或其他設(shè)置成使用本公開方法的預(yù)啟動(dòng)指令時(shí),在執(zhí)行可能需要訪問內(nèi)存的指令之前,可能會(huì)生成GPF。在框611中,可執(zhí)行中斷服務(wù)程序(ISR)來處理上述內(nèi)存訪問,以使用擴(kuò)展內(nèi)存而非較低的1MB內(nèi)存。如果已填充了描述符,即已轉(zhuǎn)換了該內(nèi)存地址,則可以執(zhí)行上述指令,而不會(huì)生成GPF。在一個(gè)例子中,指令指針可以引用移動(dòng)指令(即將某些數(shù)據(jù)移入內(nèi)存A(x)之中),而這要求對(duì)實(shí)模式內(nèi)存地址A(x)進(jìn)行內(nèi)存訪問。根據(jù)本公開的一個(gè)實(shí)施例,將會(huì)把由上述指令引用的內(nèi)存位置映射到擴(kuò)展內(nèi)存。而內(nèi)存訪問本身導(dǎo)致了異?;蝈e(cuò)誤,并啟動(dòng)了錯(cuò)誤處理器或中斷服務(wù)程序。在框613中,ISR將處理器切換至保護(hù)模式,但記住了該切換之前上述處理器所處的模式。
一旦處于保護(hù)模式下,便使用選擇器和偏移方法訪問內(nèi)存,但是,在框621中,上述指令使用實(shí)模式段格式。在訪問實(shí)際內(nèi)存之前,必須通過上述處理器來轉(zhuǎn)換內(nèi)存引用。錯(cuò)誤處理器確定是否使用GDT來映射內(nèi)存。如果不能,則將數(shù)據(jù)段(DS)變更為L(zhǎng)DT的索引。ISR仍然知曉引用了哪個(gè)物理地址。
可選ROM環(huán)境未發(fā)生改變。這些可選ROM在實(shí)模式段地址處運(yùn)行。當(dāng)可選ROM代碼嘗試進(jìn)行訪問時(shí),如果尚未在GDT中建立段地址,則描述符便為空。該處理器將該段地址用作GDT中的選擇器。然后,在框623中,處理器確定引用的描述符是否為空。如果該描述符為空,則在框625中,由上述處理器發(fā)出一般保護(hù)錯(cuò)誤GPF。與該GPF關(guān)聯(lián)的ISR將可選ROM代碼使用的選擇器映射成擴(kuò)展內(nèi)存中的不同物理地址,然后,試圖再次執(zhí)行該指令。該ISR將段和偏移映射成選擇器和偏移,以通過GDT訪問擴(kuò)展內(nèi)存。
由于較低的3個(gè)字節(jié)為0,因而,如果出現(xiàn)了GPF,則可使用局部描述符表(LDT)來填充編址中的間隙,但不可使用GDT。相反,可以用LDT將新的選擇器映射到虛擬內(nèi)存,然后,使用適當(dāng)?shù)倪x擇器/偏移的組合來重新執(zhí)行指令。本領(lǐng)域技術(shù)人員將懂得,也可以用其他方法來映射使用GDT方案不能尋址的段。LDT可以以與GDT相同的方式工作,也就是說,它具有描述符,該描述符具有基址和長(zhǎng)度限制??赡懿唤?jīng)常使用LDT,因?yàn)橥ǔT贕DT包含的邊界上的組塊(chunk)中引用內(nèi)存。如果必要,則可能在LDT中設(shè)置描述符,且將被引用的物理地址置于LDT之中,并且將DS變?yōu)長(zhǎng)DT的索引。
為確定LDT是否必要,在框627中,確定段地址的最后3個(gè)位是否為零和它是否為非空段。在框629中,如果最后3個(gè)位為0,則可以使用GDT,且在GDT中為該段地址創(chuàng)建了用于指向擴(kuò)展內(nèi)存中的正確位置的新描述符。
如果段地址的最后3個(gè)位不為0,則在框631和633中,必須使用另外的方法將該地址轉(zhuǎn)換成擴(kuò)展內(nèi)存。在一個(gè)實(shí)施例中,在框631中,使用來自LDT的空描述符。并用段信息來填充該描述符。然后,在框633中,用新創(chuàng)建的LDT描述符代替段寄存器。
在一個(gè)實(shí)施例中,LDT具有一個(gè)有效描述符??梢允褂肔DT中的第一個(gè)要素。建立該描述符并訪問了該地址。將上述段地址變成了指向LDT的指針。當(dāng)使用GDT時(shí),無需改變段。在一個(gè)實(shí)例中,將該段變?yōu)?。該LDT的大小可以與GDT的大小相同。描述符1是該LDT中第一個(gè)可用的描述符。建立該描述符,以引用期望在實(shí)模式下訪問的內(nèi)存。用LDT中的新描述符來代替上述段地址。然后,在框641中,處理器離開錯(cuò)誤處理器,并重新執(zhí)行該單一指令??赡苁褂锰幚砥髭?trap)來執(zhí)行單一指令。然后,用最初地址代替上述段地址,以供將來使用。在框643中,確定任務(wù)是否已完成。如果是這樣,則在框645中,將處理器恢復(fù)到其之前的模式,并恢復(fù)最初的描述符表(GDT/LDT)。在一個(gè)實(shí)施例中,各程序均具有唯一的GDT/LDT,且它們存儲(chǔ)在堆?;蚱渌麛?shù)據(jù)結(jié)構(gòu)中,以確保使用適當(dāng)?shù)谋怼.?dāng)執(zhí)行在框651中離開時(shí),繼續(xù)進(jìn)行所述流程。然而,如果任務(wù)并未完成,換言之,還需要另外的內(nèi)存訪問,則在框621中,繼續(xù)進(jìn)行處理。
在另一個(gè)實(shí)施例中,可以為L(zhǎng)DT加載散列表,然后,LDT像GDT一樣運(yùn)行。當(dāng)引用地址時(shí),如果存在異常,則與GDT一樣,在LDT中分配描述符,然后,返回該描述符,并讓ISR通過LDT正常訪問內(nèi)存。這種方法的缺點(diǎn)在于使用了更多內(nèi)存,因?yàn)楦鱾€(gè)段必須具有不重復(fù)使用的散列位置。因而,必須為該表分配整個(gè)64K的空間。由于各可選ROM均需分配其自身的LDT,因而這種方法可能不是很理想。
在另一個(gè)實(shí)施例中,對(duì)處理器和BIOS也應(yīng)用這種方法,使得BIOS代碼可以在1MB的擴(kuò)展內(nèi)存而非較低的1MB內(nèi)存中執(zhí)行。在一個(gè)實(shí)施例中,可選ROM啟動(dòng)至保護(hù)模式的轉(zhuǎn)變。在另一個(gè)實(shí)施例中,BIOS啟動(dòng)至保護(hù)模式的轉(zhuǎn)變,并使用公開的技術(shù)來訪問擴(kuò)展內(nèi)存。這種轉(zhuǎn)換對(duì)執(zhí)行代碼而言是透明的。
另一個(gè)難點(diǎn)是中斷向量表(IVT)通常位于0000h。描述符位置0不可用。然而,幾乎總是使用為0的段地址來訪問IVT。在一個(gè)實(shí)施例中,按以下方式訪問該表建立映射到零地址的非零描述符,訪問該表,然后重新設(shè)置上述地址,以供以后使用。上述過程之所以必要,是因?yàn)槠谕趯?shí)模式下執(zhí)行要執(zhí)行的程序,然而該程序?qū)嶋H上在保護(hù)模式下執(zhí)行。
一個(gè)關(guān)于希望在何處應(yīng)用本發(fā)明的實(shí)施例的例子是實(shí)施互聯(lián)網(wǎng)小型計(jì)算機(jī)系統(tǒng)接口(iSCSI)啟動(dòng)可選ROM。為了讓iSCSI啟動(dòng)正常進(jìn)行,必須在內(nèi)存中保留若干較大的項(xiàng),這些項(xiàng)包括用于提供網(wǎng)絡(luò)訪問功能的網(wǎng)絡(luò)接口卡(NIC)或主板集成局域網(wǎng)(LAN)(LOM)驅(qū)動(dòng)程序,以及用于與iSCSI目標(biāo)通信的全功能傳輸控制協(xié)議/互聯(lián)網(wǎng)協(xié)議(TCP/IP)和iSCSI堆棧。iSCSI啟動(dòng)在現(xiàn)有系統(tǒng)中存在問題,因?yàn)楸仨氃隍?qū)動(dòng)過程的極早期分配內(nèi)存,且在OS啟動(dòng)加載器執(zhí)行至保護(hù)模式iSCSI啟動(dòng)程序的切換之前,該內(nèi)存必須保持可用。因?yàn)楸仨殞⒃搩?nèi)存保持如此長(zhǎng)的時(shí)間(按預(yù)啟動(dòng)標(biāo)準(zhǔn)),因而,不能將該內(nèi)存分配成可以由其他程序使用的暫時(shí)內(nèi)存(scratch memory)。另一個(gè)問題之所以存在,僅僅是因?yàn)榭梢允褂矛F(xiàn)有的NIC/LOM驅(qū)動(dòng)程序來提供網(wǎng)絡(luò)訪問,且也許不能改變這些驅(qū)動(dòng)程序來使用擴(kuò)展內(nèi)存。本公開方法的實(shí)施例允許iSCSI和LOM驅(qū)動(dòng)程序在不經(jīng)過重寫的情況下訪問擴(kuò)展內(nèi)存。
本文所述的技術(shù)不限于任何特定的硬件或軟件配置;它們可用于任何計(jì)算、消費(fèi)電子產(chǎn)品或處理環(huán)境??梢砸杂布?、軟件和這兩者的組合來實(shí)施本技術(shù)??梢栽谝苿?dòng)或固定計(jì)算機(jī)、個(gè)人數(shù)字助理、機(jī)頂盒、蜂窩電話與尋呼機(jī)、消費(fèi)電子產(chǎn)品(包括DVD播放器、個(gè)人錄像機(jī)、個(gè)人放像機(jī)、衛(wèi)星接收機(jī)、立體聲接收機(jī)、有線電視接收機(jī))之類的可編程設(shè)備和其他電子設(shè)備(可包括處理器、可由處理器讀的存儲(chǔ)介質(zhì)(包括易失和非易失性內(nèi)存和/或存儲(chǔ)元件)、至少一個(gè)輸入設(shè)備以及一個(gè)或多個(gè)輸出設(shè)備)上運(yùn)行的程序中實(shí)施本技術(shù)。將程序代碼應(yīng)用于使用輸入設(shè)備輸入的數(shù)據(jù)來執(zhí)行上述功能以及生成輸出信息??梢詫⒃撦敵鲂畔?yīng)用于一個(gè)或多個(gè)輸出設(shè)備。本領(lǐng)域技術(shù)人員將懂得,可以用各種系統(tǒng)配置(包括多處理器系統(tǒng)、微型計(jì)算機(jī)、獨(dú)立的消費(fèi)電子設(shè)備等)來實(shí)施本發(fā)明。也可以在分布式計(jì)算環(huán)境(其中,通過經(jīng)通信網(wǎng)絡(luò)連接的遠(yuǎn)程處理設(shè)備來執(zhí)行任務(wù))中實(shí)施本發(fā)明。
可以用高級(jí)的過程或面向?qū)ο蟮木幊陶Z言來實(shí)施各程序,以便與處理系統(tǒng)進(jìn)行通信。然而,如果需要,也可以用匯編語言或機(jī)器語言來實(shí)施各程序。在任何情況下,均可以編譯或解釋上述語言。
可以用程序指令來使編有這些指令的通用或?qū)S锰幚硐到y(tǒng)執(zhí)行上述的操作?;蛘?,可通過包含用于這些操作的硬接線邏輯的特定硬件部件或經(jīng)過編程的計(jì)算機(jī)部件與定制的硬件部件的任何組合來執(zhí)行上述操作??梢砸杂?jì)算機(jī)程序產(chǎn)品的形式提供本文所述的方法,該產(chǎn)品包括其上存有可用于對(duì)處理系統(tǒng)或其他電子設(shè)備編程而使它們執(zhí)行所述方法的指令的機(jī)器可訪問介質(zhì)。本文使用的術(shù)語“機(jī)器可訪問介質(zhì)”應(yīng)包括任何能存儲(chǔ)或編碼由機(jī)器執(zhí)行的指令序列和使得該機(jī)器執(zhí)行本文所述方法中的任一種方法的介質(zhì)。因此,術(shù)語“機(jī)器可訪問介質(zhì)”應(yīng)當(dāng)包括但不僅限于固態(tài)存儲(chǔ)器、光盤和磁盤和對(duì)數(shù)據(jù)信號(hào)進(jìn)行編碼的載波。另外,業(yè)內(nèi)通常將一種形式或另一種形式的軟件(如程序、流程、過程、應(yīng)用程序、模塊、邏輯等等)稱為采取行動(dòng)或引起結(jié)果。這樣的表達(dá)僅僅是陳述上述情形(即由處理系統(tǒng)執(zhí)行上述軟件,從而引起處理器執(zhí)行某些動(dòng)作,并得到結(jié)果)的一種簡(jiǎn)化方式。
盡管已結(jié)合說明性實(shí)施例描述了本發(fā)明,但是,不應(yīng)將本說明書視為限制性的。并且,認(rèn)為那些對(duì)本領(lǐng)域技術(shù)人員而言顯而易見的所述實(shí)施例的各種修改、本發(fā)明的其他實(shí)施例落在本發(fā)明的精神和范圍內(nèi)。
權(quán)利要求
1.一種方法,包括將用于存儲(chǔ)數(shù)據(jù)的擴(kuò)展內(nèi)存分配給預(yù)啟動(dòng)應(yīng)用程序,該預(yù)啟動(dòng)應(yīng)用程序設(shè)計(jì)成在實(shí)模式下運(yùn)行;將處理器切換至保護(hù)模式;將由所述預(yù)啟動(dòng)應(yīng)用程序使用的實(shí)模式內(nèi)存地址轉(zhuǎn)換為擴(kuò)展內(nèi)存地址引用;以及使用所述轉(zhuǎn)換后的擴(kuò)展內(nèi)存地址而非所述實(shí)模式內(nèi)存地址執(zhí)行預(yù)啟動(dòng)應(yīng)用程序指令。
2.如權(quán)利要求1所述的方法,其中,分配擴(kuò)展內(nèi)存還包括創(chuàng)建描述符表;以及初始化所述描述符表。
3.如權(quán)利要求2所述的方法,其中,所述描述符表包括至少一個(gè)全局描述符表(GDT)、至少一個(gè)中斷描述符表(IDT)和至少一個(gè)局部描述符表(LDT)。
4.如權(quán)利要求1所述的方法,其中,所述轉(zhuǎn)換由中斷服務(wù)程序(ISR)執(zhí)行。
5.如權(quán)利要求4所述的方法,還包括使用實(shí)模式段寄存器訪問內(nèi)存;如果在全局描述符表(GDT)中引用了空描述符,則發(fā)出一般保護(hù)錯(cuò)誤(GPF);以及在所述GDT中創(chuàng)建指向擴(kuò)展內(nèi)存中的位置的新描述符。
6.如權(quán)利要求5所述的方法,還包括當(dāng)所述段寄存器的標(biāo)志位不為零時(shí),使用局部描述符表來轉(zhuǎn)換地址;以及用新創(chuàng)建的LDT描述符代替所述段寄存器。
7.一種機(jī)器可訪問介質(zhì),包含用于將實(shí)模式地址轉(zhuǎn)換為保護(hù)模式地址的指令,當(dāng)執(zhí)行這些指令時(shí),將導(dǎo)致機(jī)器將用于存儲(chǔ)數(shù)據(jù)的擴(kuò)展內(nèi)存分配給預(yù)啟動(dòng)應(yīng)用程序,該預(yù)啟動(dòng)應(yīng)用程序設(shè)計(jì)成在實(shí)模式下運(yùn)行;將處理器切換至保護(hù)模式;將由所述預(yù)啟動(dòng)應(yīng)用程序使用的實(shí)模式地址轉(zhuǎn)換成擴(kuò)展內(nèi)存地址引用;以及使用所述轉(zhuǎn)換后的擴(kuò)展內(nèi)存地址而非所述實(shí)模式內(nèi)存地址來執(zhí)行預(yù)啟動(dòng)應(yīng)用程序指令。
8.如權(quán)利要求7所述的機(jī)器可訪問介質(zhì),其包含的指令還導(dǎo)致所述機(jī)器創(chuàng)建描述符表;以及初始化所述描述符表。
9.如權(quán)利要求8所述的機(jī)器可訪問介質(zhì),其中,所述描述符表包括至少一個(gè)全局描述符表(GDT)、至少一個(gè)中斷描述符表(IDT)和至少一個(gè)局部描述符表(LDT)。
10.如權(quán)利要求7所述的機(jī)器可訪問介質(zhì),其中,所述轉(zhuǎn)換由中斷服務(wù)程序(ISR)來執(zhí)行。
11.如權(quán)利要求10所述的機(jī)器可訪問介質(zhì),其包含的指令還導(dǎo)致所述機(jī)器使用實(shí)模式段寄存器訪問內(nèi)存;如果在全局描述符表(GDT)中引用了空描述符,則發(fā)出一般保護(hù)錯(cuò)誤(GPF);以及在所述GDT中創(chuàng)建指向擴(kuò)展內(nèi)存中的位置的新描述符。
12.如權(quán)利要求11所述的機(jī)器可訪問介質(zhì),其包含的指令還導(dǎo)致所述機(jī)器當(dāng)所述段寄存器的標(biāo)志位不為零時(shí),使用局部描述符表來轉(zhuǎn)換地址;以及用新創(chuàng)建的LDT描述符代替所述段寄存器。
13.一種系統(tǒng),包括在運(yùn)行中耦合到存儲(chǔ)預(yù)啟動(dòng)指令的非易失性內(nèi)存的處理器;在運(yùn)行中耦合到所述處理器的系統(tǒng)內(nèi)存,其中,所述系統(tǒng)內(nèi)存包括可以在實(shí)模式與保護(hù)模式下訪問的傳統(tǒng)內(nèi)存塊和上位內(nèi)存塊,以及僅能在保護(hù)模式下訪問的擴(kuò)展內(nèi)存塊;以及用于將實(shí)模式段編址轉(zhuǎn)換成保護(hù)模式選擇器編址的中斷服務(wù)程序(ISR),其中,當(dāng)預(yù)啟動(dòng)應(yīng)用程序在執(zhí)行期間試圖訪問內(nèi)存時(shí),該ISR自動(dòng)啟動(dòng)。
14.如權(quán)利要求13所述的系統(tǒng),其中,所述預(yù)啟動(dòng)應(yīng)用程序是用于附加設(shè)備的可選ROM。
15.如權(quán)利要求13所述的系統(tǒng),其中,在將實(shí)模式段編址轉(zhuǎn)換為保護(hù)模式選擇器編址的過程中,所述ISR使用描述符表,且其中空描述符引發(fā)一般保護(hù)錯(cuò)誤來啟動(dòng)中斷處理程序,以生成所述引用了擴(kuò)展內(nèi)存中的物理內(nèi)存地址的段地址的描述符。
16.如權(quán)利要求13所述的系統(tǒng),其中,所述預(yù)啟動(dòng)應(yīng)用程序是基本輸入/輸出系統(tǒng)(BIOS)。
全文摘要
在某些實(shí)施例中,本發(fā)明包括一種系統(tǒng)和方法,該系統(tǒng)和方法涉及在執(zhí)行設(shè)計(jì)成用于實(shí)模式內(nèi)存訪問的指令代碼的同時(shí)切換至保護(hù)模式來訪問擴(kuò)展內(nèi)存。在至少一個(gè)實(shí)施例中,本發(fā)明希望能在預(yù)啟動(dòng)過程中執(zhí)行復(fù)雜的可選ROM代碼,而不致破壞由BIOS或其他可選ROM使用的系統(tǒng)內(nèi)存。也描述和主張了其他實(shí)施例。
文檔編號(hào)G06F9/46GK1977243SQ200580021416
公開日2007年6月6日 申請(qǐng)日期2005年6月15日 優(yōu)先權(quán)日2004年6月30日
發(fā)明者D·L·馬瑟尼 申請(qǐng)人:英特爾公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1