專利名稱::應(yīng)用程序可重定位加載的方法及地址重定位裝置的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及應(yīng)用程序加栽技術(shù),具體涉及一種應(yīng)用程序可重定位加栽的方法及相應(yīng)的地址重定位裝置。
背景技術(shù):
:操作系統(tǒng)在啟動應(yīng)用程序之前需要加載應(yīng)用程序,也就是為應(yīng)用程序預(yù)先準(zhǔn)備運行環(huán)境,包括為應(yīng)用程序運行前準(zhǔn)備內(nèi)存環(huán)境。在現(xiàn)有的嵌入式操作系統(tǒng)中,加栽應(yīng)用程序的方式主要有兩種第一種是在沒有硬件存儲器管理單元(MMU,MemoryManagementUnit)或不使用硬件MMU的方式下,嵌入式操作系統(tǒng)以下列方式加載應(yīng)用程序嵌入式操作系統(tǒng)與所有預(yù)先設(shè)定的應(yīng)用線程編譯連接在一起。操作系統(tǒng)在運行時,根據(jù)需要從自身啟動各應(yīng)用程序執(zhí)行。所以,這種情況下,操作系統(tǒng)與應(yīng)用程序統(tǒng)一運行在同一內(nèi)存地址空間,應(yīng)用程序的崩潰將導(dǎo)致整個系統(tǒng)的癱瘓。并且,所有應(yīng)用程序必須事先設(shè)定完成,與操作系統(tǒng)一起編譯,從而不能在現(xiàn)有正在運行的系統(tǒng)中動態(tài)增加新的應(yīng)用程序。嵌入式操作系統(tǒng)將應(yīng)用程序加載到內(nèi)存的固定地址。由于操作系統(tǒng)在運行時可以為所有應(yīng)用程序分配的地址空間不可以預(yù)先確定,所以導(dǎo)致操作系統(tǒng)只能夠指定一段特定的內(nèi)存地址空間作為應(yīng)用程序的加載空間,并且預(yù)留空間必須足夠運行最大的應(yīng)用程序,且一次只能夠運行一個應(yīng)用程序。嵌入式操作系統(tǒng)動態(tài)加栽應(yīng)用程序到任意的內(nèi)存地址空間。但是,由于應(yīng)用程序的運行地址空間在編譯時確定,所以為了能夠?qū)⒁呀?jīng)編譯完成的應(yīng)用程序加載到任意的內(nèi)存地址空間運行,必須根據(jù)應(yīng)用程序的符號信息對應(yīng)用程序進(jìn)行地址重定位。這就要求應(yīng)用程序在編譯階段攜帶所有符號信息和地址重定位信息,操作系統(tǒng)才可以根據(jù)加載時的運行狀況,動態(tài)分配內(nèi)存,解析應(yīng)用程序攜帶的符號信息和地址重定位信息進(jìn)行加載。但是帶有符號信息和地址重定位信息的應(yīng)用程序?qū)⒅辽俦葻o符號信息和地址重定位信息的應(yīng)用程序文件的長度大IO倍以上,從而增大了應(yīng)用程序的代碼尺寸,增加了操作系統(tǒng)在加載應(yīng)用程序時的時間,最終影響了操作系統(tǒng)的運行速度。第二種,在使用硬件MMU的方式下,嵌入式操作系統(tǒng)可以實現(xiàn)完善的應(yīng)用程序加載方案。每一個應(yīng)用程序都有自己獨立的地址空間,因此應(yīng)用程序在崩潰時不會危害操作系統(tǒng)的運行。但是以這種運行方式執(zhí)行應(yīng)用程序時,操作系統(tǒng)需要為每一個應(yīng)用程序保存其運行頁面對照表。例如,典型的x86系統(tǒng)中,一旦啟動應(yīng)用程序就需要分配至少三個頁面的空間3x4k〗故頁表空間,包括一個一級頁表和二個二級頁表,并且隨著應(yīng)用程序的運行,操作系統(tǒng)會不斷地為應(yīng)用程序分配各級頁表。而在有些系統(tǒng)中,每一個頁表可能由二個頁面組成,所以需要為新的應(yīng)用程序分配2x3x4k的地址空間做頁表使用。由于硬件MMU的復(fù)雜性,頁表的管理在操作系統(tǒng)的管理中也相當(dāng)復(fù)雜,需要花費操作系統(tǒng)大量的運行時間維護(hù)頁面對照表的完整性和一致性,從而使得對頁表的管理減慢了操作系統(tǒng)運行的速度。在一些實時性要求很高的嵌入式系統(tǒng)應(yīng)用中,將直接影響實際的嵌入式應(yīng)用效果。在常見的精簡指令集計算機(RISC,ReducedInstructionSetComputer)體系結(jié)構(gòu)中,內(nèi)存的存取方式已經(jīng)由頁模式取代段模式。在經(jīng)典的x86等復(fù)雜指令集計算機(CISC,ComplexInstructionSetComputer)體系結(jié)構(gòu)的中央處理單元(CPU,CentralProcessingUnit)中,存在有明顯的段概念,需要預(yù)先知道段的設(shè)置,在編譯應(yīng)用程序或初始化應(yīng)用程序時,需要對段寄存器進(jìn)行賦值,這使得過程變得復(fù)雜。在代碼執(zhí)行過程中產(chǎn)生的代碼和數(shù)據(jù)地址都需要與這些段寄存器共同產(chǎn)生實際的物理地址,使得代碼段在物理內(nèi)存中只能從一個段移到另一個段,而不是靈活的移動。
發(fā)明內(nèi)容有鑒于此,本發(fā)明提供一種應(yīng)用程序重定位加載的方法,簡化了應(yīng)用程序的動態(tài)加載,使編譯在同一地址的應(yīng)用程序可以同時在操作系統(tǒng)上同時運行。本發(fā)明提供一種支持應(yīng)用程序可重定位加載的地址重定位裝置,簡化了應(yīng)用程序的動態(tài)加載,使編譯在同一地址的應(yīng)用程序可以同時在操作系統(tǒng)上同時運4亍。為達(dá)到上述目的,本發(fā)明實施例的技術(shù)方案是這樣實現(xiàn)的一種應(yīng)用程序可重定位加載的方法,包括調(diào)用應(yīng)用程序,查詢該應(yīng)用程序的代碼偏移及應(yīng)用長度;根據(jù)內(nèi)存分配情況為該應(yīng)用程序分配長度大于或等于所述應(yīng)用長度的空閑內(nèi)存;為該應(yīng)用程序創(chuàng)建進(jìn)程控制塊,保存所述空閑內(nèi)存的起始地址、代碼偏移及應(yīng)用長度;將該應(yīng)用程序代碼復(fù)制到所述空閑內(nèi)存。所述將該應(yīng)用程序代碼復(fù)制到空閑內(nèi)存之后,該方法可進(jìn)一步包括在進(jìn)程切換的觸發(fā)條件下,將進(jìn)程控制塊中保存的起始地址、代碼偏移及應(yīng)用長度設(shè)置到相應(yīng)的硬件寄存器中;在應(yīng)用程序指令執(zhí)行時,將應(yīng)用程序的虛擬地址與硬件寄存器的起始地址相加;再減去應(yīng)用程序的代碼偏移得到應(yīng)用程序的內(nèi)存物理地址。所述調(diào)用應(yīng)用程序之前,該方法還可以進(jìn)一步包括將操作系統(tǒng)的內(nèi)存起始地址和代碼偏移保存到暫存式存儲器一中;所述將該應(yīng)用程序代碼復(fù)制到空閑內(nèi)存之后,該方法進(jìn)一步包括在進(jìn)程切換的觸發(fā)條件下,將進(jìn)程控制塊中保存的應(yīng)用程序內(nèi)存起始地址和代碼偏移設(shè)置到暫存式存儲器二中;在核心態(tài)切換到用戶態(tài)執(zhí)行應(yīng)用程序時,將保存在暫存式存儲器二中的內(nèi)容設(shè)置到應(yīng)用寄存器組中;將應(yīng)用程序的虛擬地址與應(yīng)用程序內(nèi)存起始相加,減去應(yīng)用程序的代碼偏移得到應(yīng)用程序的內(nèi)存物理地址;在用戶態(tài)切換到核心態(tài)執(zhí)行操作系統(tǒng)指令時,將保存在暫存式存儲器一中的內(nèi)容設(shè)置到應(yīng)用寄存器組中;將操作系統(tǒng)的虛擬地址與操作系統(tǒng)的內(nèi)存起始地址相加,減去操作系統(tǒng)的代碼偏移得到操作系統(tǒng)的內(nèi)存物理地址。所述得到應(yīng)用程序的內(nèi)存物理地址之后,該方法進(jìn)一步包括判斷所述物理地址是否在根據(jù)所述空閑內(nèi)存的起始地址、代碼偏移及應(yīng)用長度得到的應(yīng)用程序運行的地址范圍,如果在則繼續(xù)執(zhí)行指令;否則執(zhí)行越界中斷處理。一種地址重定位裝置,包括中央處理單元CPU核、地址加法器、應(yīng)用基址寄存器和代碼偏移寄存器,所述CPU核,用于將虛擬地址輸出到地址加法器;所述應(yīng)用基址寄存器,用于保存應(yīng)用基址,所述應(yīng)用基址為根據(jù)內(nèi)存的分配情況為應(yīng)用程序分配的空閑內(nèi)存的起始地址;將所述應(yīng)用基址發(fā)送并保持到與所述地址加法器相連的總線上;所述代碼偏移寄存器,用于保存代碼偏移;將所述代碼偏移發(fā)送并保持到與所述地址加法器相連的總線上;所述地址加法器,用于將接收到的CPU核發(fā)送的虛擬地址與所述應(yīng)用基址寄存器發(fā)送的應(yīng)用基址相加,再減去所述代碼偏移寄存器發(fā)送的代碼偏移,得到內(nèi)存的物理地址。該裝置進(jìn)一步包括應(yīng)用長度寄存器,用于保存應(yīng)用程序的應(yīng)用長度;將該應(yīng)用長度發(fā)送到CPU核;所述應(yīng)用基址寄存器,進(jìn)一步用于將保存的應(yīng)用程序的應(yīng)用基址發(fā)送到CPU核;所述代碼偏移寄存器,進(jìn)一步用于將保存的應(yīng)用程序的代碼偏移發(fā)送到CPU核;所述地址加法器,進(jìn)一步用于將得到的應(yīng)用程序的物理地址發(fā)送到CPU核;所述CPU核,進(jìn)一步用于根據(jù)接收到的應(yīng)用基址、代碼偏移和應(yīng)用長度,得到應(yīng)用程序運行的地址范圍;判斷所述接收到的物理地址是否在所述應(yīng)用程序運行的地址范圍之內(nèi),如果是,則執(zhí)行應(yīng)用程序;否則,執(zhí)行越界中斷處理。所述應(yīng)用基址寄存器與所述代碼偏移寄存器為一個寄存器,用于保存應(yīng)用基址與代碼偏移之差;將該應(yīng)用基址與代碼偏移之差發(fā)送并保存到與所述地址加法器相連的總線上;所述地址加法器,進(jìn)一步用于接收所述寄存器發(fā)送的應(yīng)用基址與代碼偏移之差,將該應(yīng)用基址與代碼偏移之差與CPU核發(fā)送的虛擬地址相加,得到內(nèi)存物理地址。該裝置進(jìn)一步包括暫存式存儲器一和暫存式存儲器二,所述暫存式存儲器一,用于在系統(tǒng)初始化的時候,保存操作系統(tǒng)的應(yīng)用基址與代碼偏移;當(dāng)由用戶態(tài)向核心態(tài)切換時,在CPU核發(fā)送的觸發(fā)信號的控制下,將保存的操作系統(tǒng)應(yīng)用基址與代碼偏移分別發(fā)送到所述應(yīng)用基址寄存器和代碼偏移寄存器;所述暫存式存儲器二,用于在進(jìn)程切換的時候,保存應(yīng)用程序的進(jìn)程控制塊中的應(yīng)用基址與代碼偏移;當(dāng)由核心態(tài)切換到用戶態(tài)的時候,在CPU核發(fā)送的觸發(fā)信號的控制下,將保存的應(yīng)用程序應(yīng)用基址與代碼偏移分別發(fā)送到所述應(yīng)用基址寄存器和代碼偏移寄存器;所述應(yīng)用基址寄存器,進(jìn)一步用于接收并保存所述暫存式存儲器一發(fā)送的操作系統(tǒng)應(yīng)用基址與代碼偏移;或接收并保存所述暫存式存儲器二發(fā)送的應(yīng)用程序應(yīng)用基址與代碼偏移;所述CPU核,進(jìn)一步用于向暫存式存儲器一和暫存式存儲器二發(fā)送觸發(fā)信號。所述暫存式存儲器一包括操作系統(tǒng)應(yīng)用基址寄存器和操作系統(tǒng)代碼偏移寄存器;所述暫存式存儲器二包括應(yīng)用程序應(yīng)用基址寄存器和應(yīng)用程序代碼偏移寄存器,所述操作系統(tǒng)應(yīng)用基址寄存器,用于保存操作系統(tǒng)的應(yīng)用基址,當(dāng)由戶態(tài)切換到核心態(tài)的時候,在CPU核發(fā)送的觸發(fā)信號的控制下,將所述操作系統(tǒng)的應(yīng)用基址發(fā)送到所述應(yīng)用基址寄存器;所述操作系統(tǒng)代碼偏移寄存器,用于保存操作系統(tǒng)的代碼偏移,當(dāng)由戶態(tài)切換到核心態(tài)的時候,在CPU核發(fā)送的觸發(fā)信號的控制下,將所述操作系統(tǒng)的代碼偏移發(fā)送到所述代碼偏移寄存器;所述應(yīng)用程序應(yīng)用基址寄存器,用于保存應(yīng)用程序的應(yīng)用基址,當(dāng)由核心態(tài)切換到用戶態(tài)的時候,在CPU核發(fā)送的觸發(fā)信號的控制下,將所述應(yīng)用程序的應(yīng)用基址發(fā)送到所述應(yīng)用基址寄存;所述應(yīng)用程序代碼偏移寄存器,用于保存應(yīng)用程序的代碼偏移,當(dāng)由核心態(tài)切換到用戶態(tài)的時候,在CPU核發(fā)送的觸發(fā)信號的控制下,將所述應(yīng)用程序的代碼偏移發(fā)送到所述代碼偏移寄存器;所述應(yīng)用基址寄存器,進(jìn)一步用于接收所述操作系統(tǒng)應(yīng)用基址寄存器發(fā)送的操作系統(tǒng)的應(yīng)用基址;或接收所述應(yīng)用程序應(yīng)用基址寄存發(fā)送的應(yīng)用程序的應(yīng)用基址;所述代碼偏移寄存器,進(jìn)一步用于接收所述操作系統(tǒng)代碼偏移寄存器發(fā)送的操作系統(tǒng)代碼偏移;或接收所述應(yīng)用程序代碼偏移寄存器發(fā)送的應(yīng)用程序的代碼偏移;所述CPU核,進(jìn)一步用于向操作系統(tǒng)應(yīng)用基址寄存器、操作系統(tǒng)代碼偏移寄存器、應(yīng)用程序應(yīng)用基址寄存器和應(yīng)用程序代碼偏移寄存器發(fā)送觸發(fā)信號。所述暫存式存儲器包括寄存器一和存儲操作系統(tǒng)應(yīng)用基址及代碼偏移的內(nèi)存空間;所述暫存式存儲器二包括寄存器二和存儲應(yīng)用程序應(yīng)用基址及代碼偏移的內(nèi)存空間,所述寄存器一,用于保存指向存儲操作系統(tǒng)應(yīng)用基址和代碼偏移的內(nèi)存地址的指針;所述寄存器二,用于保存指向存儲應(yīng)用程序應(yīng)用基址和代碼偏移的內(nèi)存地址的指針;所述CPU核,進(jìn)一步用于當(dāng)由戶態(tài)切換到核心態(tài)的時候,通過寄存器一中的指針調(diào)用保存在指針?biāo)竷?nèi)存地址中的操作系統(tǒng)的應(yīng)用基址和代碼偏移,分別保存到所述應(yīng)用基址寄存器及代碼偏移寄存器;當(dāng)由核心態(tài)切換到用戶態(tài)的時候,通過寄存器二中的指針調(diào)用保存在指針?biāo)竷?nèi)存地址中的應(yīng)用程序的應(yīng)用基址及代碼偏移,分別保存到所述應(yīng)用基址寄存器和代碼偏移寄存器。所述用于保存應(yīng)用基址和代碼偏移的內(nèi)存空間為只有核心態(tài)才能訪問的內(nèi)存空間。與現(xiàn)有技術(shù)相比,本發(fā)明實施例所提供的應(yīng)用程序可重定位加栽的方法及支持應(yīng)用程序可重定位加載的地址重定位裝置,有以下效果第一,通過將應(yīng)用程序編譯得到的代碼偏移地址、應(yīng)用程序虛擬地址以及當(dāng)前操作系統(tǒng)檢測到的空閑內(nèi)存的起始地址進(jìn)行相加減,得到應(yīng)用程序執(zhí)行時的內(nèi)存物理地址,從而可以很方便的根據(jù)實際內(nèi)存使用情況加栽應(yīng)用程序,實現(xiàn)了應(yīng)用程序的動態(tài)加載;且使得操作系統(tǒng)不需要維護(hù)頁面對照表,不需要解析應(yīng)用程序中的符號信息和地址重定位信息,從而簡化了應(yīng)用程序的動態(tài)加載,提高了操作系統(tǒng)的運行速度。第二,通過操作系統(tǒng)根據(jù)當(dāng)前內(nèi)存的分配情況為應(yīng)用程序的加栽分配內(nèi)存地址空間,操作系統(tǒng)可以為應(yīng)用程序分配自身運行地址空間之外的內(nèi)存地址空間,從而使應(yīng)用程序與操作系統(tǒng)各自運行在自身獨立的內(nèi)存空間,實現(xiàn)操作系統(tǒng)的保護(hù)。第三,由于操作系統(tǒng)可以靈活地為應(yīng)用程序分配加載的地址空間,因此所有應(yīng)用程序可以編譯在同一個起始地址,簡化了應(yīng)用程序的編譯過程;并且多個應(yīng)用程序可以同時運行。第四,由操作系統(tǒng)為應(yīng)用程序加載分配內(nèi)存空間,因此,操作系統(tǒng)只需要修改應(yīng)用基址就可以完成代碼在物理空間的重定位,使得應(yīng)用程序可以在整個物理內(nèi)存中靈活移動,。同時,本發(fā)明的設(shè)計方案中硬件開銷及操作系統(tǒng)維護(hù)開銷很小,尤其適合應(yīng)用于嵌入式系統(tǒng)中。圖1為本發(fā)明應(yīng)用程序可重定位加栽的方法流程圖;圖2為本發(fā)明當(dāng)前內(nèi)存分配情況與應(yīng)用程序A和應(yīng)用程序B的編譯情況示意圖;圖3為本發(fā)明當(dāng)前內(nèi)存分配情況與應(yīng)用程序A的加載情況示意圖;圖4為本發(fā)明當(dāng)前內(nèi)存分配情況與應(yīng)用程序B的加載情況示意圖;圖5為本發(fā)明應(yīng)用程序A與應(yīng)用程序B切換的方法流程圖;圖6為本發(fā)明實施例一支持應(yīng)用程序可重定位加載的地址重定位裝置結(jié)構(gòu)示意圖;圖7為本發(fā)明操作系統(tǒng)與應(yīng)用程序運行情況示意圖;圖8為本發(fā)明實施例二支持應(yīng)用程序可重定位加栽的地址重定位裝置結(jié)構(gòu)示意圖;圖9為本發(fā)明實施例三支持應(yīng)用程序可重定位加栽的地址重定位裝置結(jié)構(gòu)示意圖。具體實施方式下面結(jié)合附圖及具體實施例對本發(fā)明進(jìn)行詳細(xì)說明。本發(fā)明應(yīng)用程序可重定位加載的方法提供了CPU的一種內(nèi)存存取模式。在該模式下,所有的應(yīng)用程序及編譯器不需要知道應(yīng)用基址寄存器的存在。編譯器只需要將應(yīng)用程序編譯在相同的地址空間,操作系統(tǒng)在加載應(yīng)用程序時根據(jù)當(dāng)前內(nèi)存分配情況,為應(yīng)用程序分配空閑內(nèi)存,即根據(jù)當(dāng)前內(nèi)存的分配情況,對應(yīng)用基址寄存器的內(nèi)容進(jìn)行調(diào)整;執(zhí)行應(yīng)用程序時的內(nèi)存物理地址則由應(yīng)用程序運行的虛擬地址與操作系統(tǒng)為應(yīng)用程序分配的應(yīng)用基址相加,再減去應(yīng)用程序編譯時確定的代碼偏移得到,也就是說通過修改指令的執(zhí)行方式,可以使應(yīng)用程序的編譯地址和執(zhí)行地址得到統(tǒng)一。因此,所有的應(yīng)用程序可以編譯在同一起始地址,只要由操作系統(tǒng)根據(jù)內(nèi)存的分配情況,分配應(yīng)用程序的加載空間即可。這樣,在簡化了應(yīng)用程序編譯的同時,由于為應(yīng)用程序分配的內(nèi)存空間由操作系統(tǒng)根據(jù)內(nèi)存使用情況動態(tài)分配,操作系統(tǒng)在每次啟動時可以將應(yīng)用程序代碼加載到物理內(nèi)存的不同地址,從而實現(xiàn)了應(yīng)用程序代碼段在物理內(nèi)存中的動態(tài)加栽;操作系統(tǒng)還可以通過修改應(yīng)用程序代碼在物理內(nèi)存中的整體移動;操作系統(tǒng)通過為不同的應(yīng)用程序分配不同的空閑內(nèi)存的起始地址,還可以將不同的應(yīng)用程序加載到不同的物理內(nèi)存,使得多個應(yīng)用程序可以同時運行。圖1所示為本發(fā)明應(yīng)用程序可重定位加載的方法流程圖,如圖l所示,該方法包括以下步驟步驟100:調(diào)用應(yīng)用程序。步驟101:查詢該應(yīng)用程序的代碼偏移(offset)和應(yīng)用長度(len)。步驟102:為該應(yīng)用程序分配起始地址為應(yīng)用基址(base),長度為len的空閑內(nèi)存。步驟103:為應(yīng)用程序建立進(jìn)程控制塊,用于保存相應(yīng)的應(yīng)用基址、代碼偏移和應(yīng)用長度。步驟104:將應(yīng)用程序復(fù)制到從應(yīng)用基址開始的空閑內(nèi)存。該方法進(jìn)一步包括步驟105:在切換至應(yīng)用程序進(jìn)程的觸發(fā)條件下,將進(jìn)程控制塊中保存的起始地址、代碼偏移及應(yīng)用長度直接或通過暫存式存儲器間接的設(shè)置到相應(yīng)的應(yīng)用寄存器組中;在應(yīng)用程序的指令執(zhí)行時,將應(yīng)用程序的虛擬地址與應(yīng)用寄存器組中的起始地址相加,再減去應(yīng)用程序的代碼偏移得到應(yīng)用程序的內(nèi)存物理地址。本方法還可以包括,在執(zhí)行應(yīng)用程序過程中,判斷根據(jù)應(yīng)用程序虛擬地址得到的實際內(nèi)存物理地址,是否在根據(jù)應(yīng)用程序代碼偏移及應(yīng)用長度得到的內(nèi)存物理地址范圍內(nèi),如果在,則繼續(xù)執(zhí)行指令;如果不在,則確定該應(yīng)用程序越界,按照現(xiàn)有技術(shù)中的方法執(zhí)行越界中斷處理,以實現(xiàn)對操作系統(tǒng)及其它應(yīng)用程序的保護(hù)。以下以應(yīng)用程序A和應(yīng)用程序B的加載為例對本發(fā)明支持應(yīng)用程序動態(tài)加載的方法進(jìn)4亍詳細(xì)i兌明。圖2為本發(fā)明當(dāng)前內(nèi)存分配情況與應(yīng)用程序A和應(yīng)用程序B的編譯情況示意圖,如圖2所示,應(yīng)用程序A編譯后的起始地址,即代碼偏移為0x0,3000,應(yīng)用長度為Oxl,0000;應(yīng)用程序B編譯后代碼偏移為0x0,3000,應(yīng)用長度為0x2,0000;當(dāng)前物理內(nèi)存中,操作系統(tǒng)分配從OxOOOO,OOOO到OxOOOD,OOOO的內(nèi)存,當(dāng)前可為應(yīng)用程序分配的內(nèi)存為從OxOOOD,OOOO到0x0100,0000中的空閑物理內(nèi)存。圖3為本發(fā)明當(dāng)前內(nèi)存分配情況與應(yīng)用程序A的加栽情況示意圖,如圖3所示,操作系統(tǒng)根據(jù)當(dāng)前內(nèi)存的分配情況,檢測到在物理內(nèi)存0x0010,0000處存在空閑,且其空閑區(qū)的長度大于應(yīng)用程序A的應(yīng)用長度,所以操作系統(tǒng)將應(yīng)用程序A加載到從OxOOlO,OOOO開始的空用物理內(nèi)存,并為A分配長度為Oxl,OOOO的內(nèi)存地址空間,即在內(nèi)存0x0010,0000到0x0011,0000的空間加載應(yīng)用程序A的代碼;并創(chuàng)建應(yīng)用程序A的進(jìn)程控制塊,除其他必需的進(jìn)程信息外,還要保存應(yīng)用程序A的應(yīng)用基址OxOOlO,OOOO、代碼偏移0x0,3000以及應(yīng)用長度Oxl,OOOO。完成應(yīng)用程序A的加載后,當(dāng)從工作在核心態(tài)下的操作系統(tǒng)換到工作在用戶態(tài)下的應(yīng)用進(jìn)程A時在收到進(jìn)程切換的觸發(fā)條件下,將應(yīng)用程序A的進(jìn)程控制塊中保存的起始地址、代碼偏移及應(yīng)用長度保存到相應(yīng)的硬件寄存器中;操作系統(tǒng)在應(yīng)用程序的指令執(zhí)行時將產(chǎn)生的虛擬地址,包括應(yīng)用程序的指令地址和應(yīng)用程序指令執(zhí)行中的數(shù)據(jù)存取地址,與硬件寄存器中的起始地址相加,再減去應(yīng)用程序的代碼偏移得到應(yīng)用程序的內(nèi)存物理地址;在應(yīng)用程序A運行過程中,判斷根據(jù)應(yīng)用程序A運行時的虛擬地址計算出的實際內(nèi)存物理地址,是否在根據(jù)應(yīng)用程序A的代碼偏移及應(yīng)用長度i十算出6令if勿J里地i止0x0010,0000至'J0x0011,00006々圍內(nèi),是貝'J纟速續(xù)才丸4亍應(yīng)用程序A的指令;否則確定應(yīng)用程序A越界,按照現(xiàn)有技術(shù)中的方法執(zhí)行越界中斷程序,以實現(xiàn)對操作系統(tǒng)及其它應(yīng)用程序的保護(hù)。假設(shè)此時操作系統(tǒng)在運行應(yīng)用程序A的同時,需要加載應(yīng)用程序B,且切換到應(yīng)用程序B運行,則加載應(yīng)用程序B的情況如圖4所示。圖4為本發(fā)明當(dāng)前內(nèi)存分配情況與應(yīng)用程序B的加載情況示意圖,操作系統(tǒng)根據(jù)當(dāng)前內(nèi)存分配情況,檢測到在物理內(nèi)存0x0018,0000處存在空閑,且空閑區(qū)長度大于應(yīng)用程序B的應(yīng)用長度,所以操作系統(tǒng)將應(yīng)用程序B加栽到從0x0018,0000的開始的物理內(nèi)存,并為應(yīng)用程序B分配長度為0x2,0000的內(nèi)存,即在內(nèi)存0x0018,0000到0x001A,0000的空間加栽應(yīng)用程序B的代碼;并創(chuàng)建應(yīng)用程序B的進(jìn)程控制塊,除其他必需的進(jìn)程信息外,還要保存應(yīng)用程序B的應(yīng)用基址為0x0018,0000,代碼偏移為0x0,3000,應(yīng)用長度為0x2,0000。應(yīng)用程序B加載完成后,操作系統(tǒng)由應(yīng)用程序A切換到應(yīng)用程序B運行,切換的方法流程如圖5所示,包括以下步驟步驟500:操作系統(tǒng)將應(yīng)用程序A的現(xiàn)場保存到應(yīng)用程序A的進(jìn)程控制塊中。本步驟中,應(yīng)用程序A的現(xiàn)場包括系統(tǒng)上下文、各通用寄存器以及控制寄存器等的內(nèi)容。步驟501:操作系統(tǒng)從應(yīng)用程序B的進(jìn)程控制塊恢復(fù)應(yīng)用程序B的現(xiàn)場。步驟502:操作系統(tǒng)從應(yīng)用程序B的進(jìn)程控制塊中將應(yīng)用基址、代碼偏移和應(yīng)用長度恢復(fù)到相應(yīng)的硬件寄存器中。以下以三個實施例對本發(fā)明支持應(yīng)用程序可重定位加栽的地址重定位裝置進(jìn)行詳細(xì)說明。實施例一本實施例對操作系統(tǒng)運行在除本發(fā)明提供的內(nèi)存存取模式之外的其它模式下時,支持應(yīng)用程序可重定位加載的地址重定位裝置進(jìn)行詳細(xì)說明。圖6為本發(fā)明實施例一支持應(yīng)用程序可重定位加栽的地址重定位裝置結(jié)構(gòu)示意圖,如圖6所示,該裝置包括CPU核、地址加法器和應(yīng)用寄存器組。其中,CPU核用于將應(yīng)用程序的虛擬地址輸出到地址加法器。該虛擬地址為應(yīng)用程序執(zhí)行時的指令地址或數(shù)據(jù)存取地址。應(yīng)用寄存器組包括應(yīng)用基址寄存器和代碼偏移寄存器,應(yīng)用基址寄存器用于保存CPU在運行時,檢測到的可以用于加載應(yīng)用程序的空閑內(nèi)存的起始地址,即應(yīng)用基址,將該應(yīng)用基址輸出到地址加法器,并保持在與地址加法器相連的總線上;代碼偏移寄存器,用于保存應(yīng)用程序在編譯時確定的起始地址,即代碼偏移,將該代碼偏移輸出到地址加法器,并保持在與地址加法器相連的總線上。地址加法器,用于將接收到的CPU核發(fā)送的應(yīng)用程序的虛擬地址和應(yīng)用基址寄存器輸出的應(yīng)用基址相加,再與接收到的代碼偏移寄存器發(fā)送的代碼偏移相減,得到應(yīng)用程序的內(nèi)存物理地址,并輸出到外部。此時執(zhí)行步驟105的過程包括在切換至應(yīng)用程序進(jìn)程時,將為應(yīng)用程寄存器和代碼偏移寄存器中;然后在應(yīng)用程序指令執(zhí)行時,由加法器將應(yīng)用程序虛擬地址與應(yīng)用基址寄存器的內(nèi)容相加,再與代碼偏移寄存器中的內(nèi)容相減,得到應(yīng)用程序的內(nèi)存物理地址。本實施例的裝置還可以在應(yīng)用寄存器組中增加應(yīng)用長度寄存器,用于保存應(yīng)用程序在編譯時確定的應(yīng)用長度;將該應(yīng)用長度輸出到CPU核;此時,應(yīng)用基址寄存器和代碼偏移寄存器進(jìn)一步用于將自身保存的內(nèi)容輸入到CPU核;地址加法器進(jìn)一步用于將得出的物理地址輸入到CPU核;CPU核進(jìn)一步用于接收應(yīng)用長度寄存器輸出的應(yīng)用長度、應(yīng)用基址寄存器輸出的應(yīng)用基址、代碼偏移寄存器輸出的代碼偏移和地址加法器輸入的物理地址,根據(jù)應(yīng)用長度、應(yīng)用基址和代碼偏移計算出應(yīng)用程序運行的內(nèi)存物理地址范圍,并判斷地址加法器得到的物理地址是否在該范圍內(nèi),如果是,則執(zhí)行應(yīng)用程序,否則按照現(xiàn)有技術(shù)中的方法執(zhí)行越界中斷處理。由于操作系統(tǒng)在加載應(yīng)用程序時為應(yīng)用程序分配的應(yīng)用基址和應(yīng)用程序編譯時確定的代碼偏移,在應(yīng)用程序啟動后不需要再修改,因此,實際應(yīng)用中可以將應(yīng)用基址寄存器與代碼偏移寄存器合為一個寄存器,用于保存應(yīng)用基址與代碼偏移之差。當(dāng)應(yīng)用基址寄存器和代碼偏移寄存器合設(shè)為一個寄存器時,執(zhí)行步驟105的過程包括將為應(yīng)用程序分配的空閑內(nèi)存的應(yīng)用基址與應(yīng)用程序的代碼偏移之差設(shè)置到該寄存器中;然后,由加法器將應(yīng)用程序的虛擬地址與該寄存器中的內(nèi)容相加,得到應(yīng)用程序的內(nèi)存物理地址。以上所述的應(yīng)用寄存器組可以選用CPU中任何能夠?qū)⑵渥陨肀4娴膬?nèi)容保持在輸入到地址加法器的總線上的硬件寄存器,例如段基址寄存器。本發(fā)明提供的內(nèi)存存取模式也可以采用外接協(xié)議處理器的方法實現(xiàn),以方便硬件功能的裁減。另外,為了保護(hù)操作系統(tǒng),防止應(yīng)用程序?qū)Σ僮飨到y(tǒng)的破壞,在本發(fā)明實施例中,應(yīng)用程序運行在CPU的用戶態(tài),操作系統(tǒng)則運行在CPU的核心態(tài)下。在執(zhí)行應(yīng)用程序時,系統(tǒng)需要在核心態(tài)與用戶態(tài)之間不斷切換。如圖7所示,用戶態(tài)和核心態(tài)之間通過指令進(jìn)行切換,指令包括系統(tǒng)調(diào)用、中斷、例外以及返回指令。用戶態(tài)到核心態(tài)的切換通過中斷、例外和系統(tǒng)調(diào)用指令實現(xiàn);核心態(tài)到用戶態(tài)的切換通過返回指令實現(xiàn)。操作系統(tǒng)核心態(tài)的應(yīng)用基址可以固定,也可以在操作系統(tǒng)啟動時設(shè)定,因此本實施例提供的裝置還可以包括內(nèi)存存取模式寄存器,用于保存操作系統(tǒng)采用的內(nèi)存存取模式,由操作系統(tǒng)在啟動時設(shè)置完相應(yīng)寄存器后,將保存的內(nèi)存存取模式發(fā)送到CPU核。如表1所示,可利用OO來標(biāo)識內(nèi)存連續(xù)存取模式,以01來標(biāo)識本發(fā)明的內(nèi)存存取模式,以IO標(biāo)識內(nèi)存分頁存取模式。<table>tableseeoriginaldocumentpage19</column></row><table><table>tableseeoriginaldocumentpage20</column></row><table>表lCPU可使用的內(nèi)存存取模式CPU核根據(jù)內(nèi)存存取模式寄存器中的內(nèi)容決定操作系統(tǒng)使用的內(nèi)存存取模式。當(dāng)操作系統(tǒng)不使用本發(fā)明提供的內(nèi)存存取模式時,在應(yīng)用程序產(chǎn)生中斷、例外或系統(tǒng)調(diào)用時,CPU切換到核心態(tài)運行操作系統(tǒng)。操作系統(tǒng)的運行只需要按照現(xiàn)有技術(shù)的方式即可。由于本發(fā)明操作系統(tǒng)與應(yīng)用程序運行在自己獨立的地址空間,因此采用本發(fā)明提供的方法使得應(yīng)用程序不可以存取自己段空間之外的內(nèi)存,從而實現(xiàn)了對操作系統(tǒng)運行空間的保護(hù)。當(dāng)操作系統(tǒng)使用本發(fā)明提供的內(nèi)存存取模式時,需要將操作系統(tǒng)和應(yīng)用程序使用的應(yīng)用基址、代碼偏移和應(yīng)用長度等地址長度信息暫存于某一暫存式存儲器中,例如內(nèi)存空間或硬件寄存器中,以便在用戶態(tài)和核心態(tài)進(jìn)行切換時,能夠?qū)⒌刂烽L度信息賦給在執(zhí)行指令時能夠?qū)⑵鋬?nèi)容保持到地址總線上的應(yīng)用寄存器組中。此時,本發(fā)明支持應(yīng)用程序可重定位加載的地址重定位裝置還包括用于保存操作系統(tǒng)的應(yīng)用基址與代碼偏移的暫存式存儲器一和用于保存應(yīng)用程序的應(yīng)用基址與代碼偏移的暫存式存儲器二。以下以實施例二和實施例三對本發(fā)明提供的地址重定位裝置進(jìn)行詳細(xì)說明。實施例二本實施例對操作系統(tǒng)運行于本發(fā)明提供的內(nèi)存存取模式下,支持應(yīng)用程序可重定位加載的裝置進(jìn)行詳細(xì)說明。本實施例中的暫存式存儲器為暫存式寄存器。圖8為本發(fā)明實施例二支持應(yīng)用程序可重定位加栽的地址重定位裝置結(jié)構(gòu)示意圖,如圖8所示,該裝置包括暫存式寄存器組一、暫存式寄存器組二、應(yīng)用寄存器組、CPU核和地址加法器。本實施例提供的裝置在實施例一提供的裝置的基礎(chǔ)上增加了暫存式寄存器一和暫存式寄存器二。其中,暫存式寄存器組一包括操作系統(tǒng)應(yīng)用基址寄存器和操作系統(tǒng)代碼偏移寄存器,用于在系統(tǒng)初始化的時候,分別保存操作系統(tǒng)的應(yīng)用基址和代碼偏移,當(dāng)由用戶態(tài)向核心態(tài)切換時,在CPU核發(fā)送的觸發(fā)信號的控制下,將各自保存的操作系統(tǒng)應(yīng)用基址和操作系統(tǒng)代碼偏移發(fā)送到應(yīng)用寄存器組的對應(yīng)寄存器中。暫存式寄存器組二包括應(yīng)用程序應(yīng)用基址寄存器和應(yīng)用程序代碼偏移寄存器,用于在切換到某個加載的應(yīng)用程序進(jìn)程時,分別保存在該應(yīng)用程序的進(jìn)程控制塊中保存的應(yīng)用基址和代碼偏移;當(dāng)由核心態(tài)向用戶態(tài)切換時,在CPU核發(fā)送的觸發(fā)信號的控制下,將各自保存的應(yīng)用程序應(yīng)用基址和應(yīng)用程序代碼偏移發(fā)送到應(yīng)用寄存器組中的對應(yīng)寄存器中。應(yīng)用寄存器組包括應(yīng)用基址寄存器和代碼偏移寄存器,分別用于保存當(dāng)前正在運行的操作系統(tǒng)或應(yīng)用程序的應(yīng)用基址和代碼偏移,并將各自保存的應(yīng)用基址和代碼偏移發(fā)送到地址加法器,并保持在與地址加法器相連的總線上。CPU核用于將應(yīng)用程序的虛擬地址以及操作系統(tǒng)的虛擬地址發(fā)送到地址加法器;并向暫存式寄存器組一和暫存式寄存器組二發(fā)送觸發(fā)信號。地址加法器用于將CPU核發(fā)送的應(yīng)用程序或操作系統(tǒng)的虛擬地址與應(yīng)用基址寄存器發(fā)送的應(yīng)用基址相加,然后與代碼偏移寄存器發(fā)送的代碼偏移相減,得到應(yīng)用程序或操作系統(tǒng)執(zhí)行時的內(nèi)存物理地址。本實施例執(zhí)行步驟105的過程包括在進(jìn)程切換的觸發(fā)條件下,即在核心態(tài)向用戶態(tài)進(jìn)行切換的時候,將應(yīng)用程序的進(jìn)程控制塊中的內(nèi)容設(shè)置到暫存式寄存器組二的相應(yīng)寄存器中;在調(diào)用應(yīng)用程序之前預(yù)先將操作系統(tǒng)的應(yīng)用基址、代碼偏移保存在暫存式寄存器組一的相應(yīng)寄存器中;在核心態(tài)切換到用戶態(tài)執(zhí)行應(yīng)用程序時,CPU核觸發(fā)暫存式寄存器組二將其自身保存的內(nèi)容,包括應(yīng)用基址寄存器和代碼偏移寄存器中的內(nèi)容復(fù)制到應(yīng)用寄存器組的對應(yīng)寄存器中;加法器將CPU核發(fā)送的應(yīng)用程序的虛擬地址與應(yīng)用基址寄存器中的應(yīng)用基址相加,再與代碼偏移寄存器中的代碼偏移相減后,得到應(yīng)用程序運行時的內(nèi)存物理地址;當(dāng)發(fā)生中斷、例外或系統(tǒng)調(diào)用時,系統(tǒng)需要從用戶態(tài)切換到核心態(tài)執(zhí)行操作系統(tǒng)指令,此時切換的過程包括CPU核觸發(fā)暫存式寄存器組一將其自身保存的內(nèi)容,包括應(yīng)用基址寄存器中的操作系統(tǒng)應(yīng)用基址和代碼偏移寄存器中的操作系統(tǒng)代碼偏移,復(fù)制到應(yīng)用寄存器組中的對應(yīng)寄存器中;在核心態(tài)下執(zhí)行操作系統(tǒng)指令的時候,加法器將CPU核發(fā)送的虛擬地址與應(yīng)用基址寄存器中的應(yīng)用基址相加,再與代碼偏移寄存器中的代碼偏移相減,得到核心態(tài)下指令執(zhí)行時的內(nèi)存物理地址;當(dāng)運行返回指令時,系統(tǒng)需要由核心態(tài)切換到用戶態(tài)執(zhí)行應(yīng)用程序。在得到應(yīng)用程序的內(nèi)存物理之后,還包括判斷該應(yīng)用程序的物理地址是否在根據(jù)應(yīng)用程序的應(yīng)用基址、代碼偏移及應(yīng)用長度得到的應(yīng)用程序運行的地址范圍,如果在則繼續(xù)執(zhí)行指令;否則執(zhí)行越界中斷處理。實施例三本實施例中,操作系統(tǒng)運行于本發(fā)明提供的內(nèi)存存取方式下,將操作系統(tǒng)和應(yīng)用程序的應(yīng)用基址與代碼偏移保存到內(nèi)存空間中,并將指向存儲以上信息的內(nèi)存地址的指針存儲到寄存器中。本實施例中的暫存式存儲器一為用于保存操作系統(tǒng)應(yīng)用基址和代碼偏移的內(nèi)存空間和保存指針的寄存器一;暫存式存儲器二為用于保存應(yīng)用程序應(yīng)用基址和代碼偏移的內(nèi)存空間和保存指針的寄存器二。圖9為本發(fā)明實施例三支持應(yīng)用程序可重定位加載的地址重定位裝置結(jié)構(gòu)示意圖,如圖9所示,該裝置包括寄存器一、寄存器二、內(nèi)存、應(yīng)用寄存器組、CPU核和地址加法器。其中寄存器一用于保存指向存儲操作系統(tǒng)的應(yīng)用基址與代碼偏移的內(nèi)存地址的指針。寄存器二用于保存指向存儲應(yīng)用程序的應(yīng)用基址與代碼偏移的內(nèi)存地址的指針。應(yīng)用寄存器組包括應(yīng)用基址寄存器和代碼偏移寄存器,應(yīng)用基址寄存器用于保存操作系統(tǒng)或應(yīng)用程序的應(yīng)用基址,并將應(yīng)用基址輸出到地址加法器;代碼偏移寄存器用于保存操作系統(tǒng)或應(yīng)用程序的代碼偏移,并將代碼偏移輸出到地址加法器。CPU核用于將操作系統(tǒng)或應(yīng)用程序的虛擬地址輸出到地址加法器;當(dāng)用戶態(tài)切換到核心態(tài)時,通過寄存器一中的指針調(diào)用在指針?biāo)傅膬?nèi)存地址中的操作系統(tǒng)的應(yīng)用基址及代碼偏移,分別保存到所述應(yīng)用基址寄存器和代碼偏移寄存器;當(dāng)由核心態(tài)切換到用戶態(tài)時,通過寄存器二中的指針調(diào)用保存在指針?biāo)竷?nèi)存地址中的應(yīng)用程序的應(yīng)用基址及代碼偏移,分別保存到應(yīng)用寄存器組的應(yīng)用基址寄存器和代碼偏移寄存器中。地址加法器用于將CPU核發(fā)送的虛擬地址與應(yīng)用基址寄存器發(fā)送的應(yīng)用基址相加,并與代碼偏移寄存器發(fā)送的代碼偏移相減,得到操作系統(tǒng)或應(yīng)用程序執(zhí)行時的內(nèi)存物理地址。本實施例執(zhí)行步驟105的過程包括將應(yīng)用程序進(jìn)程控制塊中的地址信息復(fù)制到內(nèi)存中,將指向保存應(yīng)用程序地址信息的內(nèi)存地址的指針保存到寄存器二中;在系統(tǒng)初始化的時候預(yù)先將操作系統(tǒng)的應(yīng)用基址、代碼偏移復(fù)制到內(nèi)存中,將指向保存操作系統(tǒng)地址信息的內(nèi)存地址的措針保存到寄存器一中;當(dāng)從核心態(tài)切換到用戶態(tài)執(zhí)行應(yīng)用程序時,CPU核通過存儲在寄存器二中的指針調(diào)用存儲在相應(yīng)內(nèi)存地址的應(yīng)用程序的地址信息,并將地址信息復(fù)制到應(yīng)用寄存器組中的相應(yīng)寄存器中;加法器將CPU核發(fā)送的應(yīng)用程序的虛擬地址與應(yīng)用基址寄存器中的應(yīng)用基址相加,再與代碼偏移寄存器中的代碼偏移相減后,得到應(yīng)用程序運行時的內(nèi)存物理地址;當(dāng)發(fā)生中斷、例外或系統(tǒng)調(diào)用時,系統(tǒng)需要從用戶態(tài)切換到核心態(tài),切換的方法流程包括CPU核通過存儲在寄存器一中的指針調(diào)用存儲在內(nèi)存相應(yīng)地址的操作系統(tǒng)的地址信息,并將該地址信息復(fù)制到應(yīng)用寄存器組的相應(yīng)寄存器中;在核心態(tài)下執(zhí)行操作系統(tǒng)指令的時候,加法器將CPU核發(fā)送的虛擬地址與應(yīng)用基址寄存器中的應(yīng)用基址相加,再與代碼偏移寄存器中的代碼偏移相減,得到核心態(tài)下指令執(zhí)行時的內(nèi)存物理地址;當(dāng)運行返回指令時,系統(tǒng)需要由核心態(tài)切換到用戶態(tài)下繼續(xù)執(zhí)行應(yīng)用程序。本實施例所述的用于保存操作系統(tǒng)和應(yīng)用程序的應(yīng)用基址和代碼偏移的內(nèi)存空間為只有在核心態(tài)才能訪問的內(nèi)存空間。在本發(fā)明實施例二和實施例三所述的所有需要保存應(yīng)用基址和代碼偏移的暫存式寄存器或內(nèi)存地址空間中,還可以增加保存應(yīng)用長度的應(yīng)用長度寄存器或內(nèi)存地址空間,供CPU核用于越界檢測。由以上所述可以看出,本發(fā)明所提供的應(yīng)用程序可重定位加載的方法及地址重定位裝置具有以下優(yōu)點第一,操作系統(tǒng)可以根據(jù)內(nèi)存的實際分配情況動態(tài)加載應(yīng)用程序,簡化了應(yīng)用程序的編譯及動態(tài)加載過程,使得操作系統(tǒng)不需要維護(hù)頁面對照表和解析符號信息表及地址重定位信息,從而當(dāng)應(yīng)用于嵌入式系統(tǒng)中時,顯著提高了嵌入式系統(tǒng)的運行速度。第二,應(yīng)用程序與操作系統(tǒng)各自運行在自己獨立的內(nèi)存空間,實現(xiàn)操作系統(tǒng)的保護(hù)。第三,所有應(yīng)用程序可以編譯在同一個起始地址,由操作系統(tǒng)加栽到不同的物理內(nèi)存位置,不需要硬件MMU的支持。簡化了應(yīng)用程序的編譯;并且可以同時運行多個應(yīng)用程序。第四,可以將應(yīng)用程序的代碼在物理內(nèi)存中整體移動,搮作系統(tǒng)只需要修改應(yīng)用基址就可以完成應(yīng)用程序代碼在物理空間的重定位。以上所述僅為本發(fā)明的較佳實施例而已,并非用于限定本發(fā)明的保護(hù)范圍。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。權(quán)利要求1.一種應(yīng)用程序可重定位加載的方法,其特征在于,該方法包括調(diào)用應(yīng)用程序,查詢該應(yīng)用程序的代碼偏移及應(yīng)用長度;根據(jù)內(nèi)存分配情況為該應(yīng)用程序分配長度大于或等于所述應(yīng)用長度的空閑內(nèi)存;為該應(yīng)用程序創(chuàng)建進(jìn)程控制塊,保存所述空閑內(nèi)存的起始地址、代碼偏移及應(yīng)用長度;將該應(yīng)用程序代碼復(fù)制到所述空閑內(nèi)存。2、如權(quán)利要求l所述的方法,其特征在于,所述將該應(yīng)用程序代碼復(fù)制到空閑內(nèi)存之后,該方法進(jìn)一步包括在進(jìn)程切換的觸發(fā)條件下,將進(jìn)程控制塊中保存的起始地址及代碼偏移設(shè)置到應(yīng)用寄存器組中;在應(yīng)用程序指令執(zhí)行時,將應(yīng)用程序的虛擬地址與應(yīng)用寄存器組中的起始地址相加,再減去應(yīng)用程序的代碼偏移得到應(yīng)用程序的內(nèi)存物理地址。3、如權(quán)利要求l所述的方法,其特征在于,所述調(diào)用應(yīng)用程序之前,該方法進(jìn)一步包括將操作系統(tǒng)的內(nèi)存起始地址和代碼偏移保存到暫存式存儲器一中;所述將該應(yīng)用程序代碼復(fù)制到空閑內(nèi)存之后,該方法進(jìn)一步包括在進(jìn)程切換的觸發(fā)條件下,將進(jìn)程控制塊中保存的應(yīng)用程序內(nèi)存起始地址和代碼偏移設(shè)置到暫存式存儲器二中;在核心態(tài)切換到用戶態(tài)執(zhí)行應(yīng)用程序時,將保存在暫存式存儲器二中的內(nèi)容設(shè)置到應(yīng)用寄存器組中;將應(yīng)用程序的虛擬地址與應(yīng)用程序內(nèi)存起始相加,減去應(yīng)用程序的代碼偏移得到應(yīng)用程序的內(nèi)存物理地址;在用戶態(tài)切換到核心態(tài)執(zhí)行操作系統(tǒng)指令時,將保存在暫存式存儲器一中的內(nèi)容設(shè)置到應(yīng)用寄存器組中;將操作系統(tǒng)的虛擬地址與操作系統(tǒng)的內(nèi)存起始地址相加,減去操作系統(tǒng)的代碼偏移得到操作系統(tǒng)的內(nèi)存物理地址。4、如權(quán)利要求2或3所述的方法,其特征在于,所述得到應(yīng)用程序的內(nèi)存物理地址之后,該方法進(jìn)一步包括判斷所述物理地址是否在根據(jù)所述空閑內(nèi)存的起始地址、代碼偏移及應(yīng)用長度得到的應(yīng)用程序運行的地址范圍,如果在則繼續(xù)執(zhí)行指令;否則執(zhí)行越界中斷處理。5、一種地址重定位裝置,其特征在于,該裝置包括中央處理單元CPU核、地址加法器、應(yīng)用基址寄存器和代碼位移寄存器,所述CPU核,用于將虛擬地址輸出到地址加法器;所述應(yīng)用基址寄存器,用于保存應(yīng)用基址,所述應(yīng)用基址為根據(jù)內(nèi)存的分配情況為應(yīng)用程序分配的空閑內(nèi)存的起始地址;將所述應(yīng)用基址發(fā)送并保持到與所述地址加法器相連的總線上;所述代碼偏移寄存器,用于保存代碼偏移;將所述代碼偏移發(fā)送并保持到與所述地址加法器相連的總線上;所述地址加法器,用于將接收到的CPU核發(fā)送的虛擬地址與所述應(yīng)用基址寄存器發(fā)送的應(yīng)用基址相加,再減去所述代碼偏移寄存器發(fā)送的代碼偏移,得到內(nèi)存的物理地址。6、如權(quán)利要求5所述的裝置,其特征在于,該裝置進(jìn)一步包括應(yīng)用長度寄存器,用于保存應(yīng)用程序的應(yīng)用長度;將該應(yīng)用長度發(fā)送到CPU核;所述應(yīng)用基址寄存器,進(jìn)一步用于將保存的應(yīng)用程序的應(yīng)用基址發(fā)送到CPU核;所述代碼偏移寄存器,進(jìn)一步用于將保存的應(yīng)用程序的代碼偏移發(fā)送到CPU核;所述地址加法器,進(jìn)一步用于將得到的應(yīng)用程序的物理地址發(fā)送到CPU核;所述CPU核,進(jìn)一步用于根據(jù)接收到的應(yīng)用基址、代碼偏移和應(yīng)用長度,得到應(yīng)用程序運行的地址范圍;判斷所述接收到的物理地址是否在所述應(yīng)用程序運行的地址范圍之內(nèi),如果是,繼續(xù)執(zhí)行指令;否則,執(zhí)行越界中斷處理。7、如權(quán)利要求5所述的裝置,其特征在于,所述應(yīng)用基址寄存器與所述代碼偏移寄存器為一個寄存器,用于保存應(yīng)用基址與代碼偏移之差;將該應(yīng)用基址與代碼偏移之差發(fā)送并保持到與所述地址加法器相連的總線上;所述地址加法器,進(jìn)一步用于接收所述寄存器發(fā)送的應(yīng)用基址與代碼偏移之差,將該應(yīng)用基址與代碼偏移之差與CPU核發(fā)送的虛擬地址相加,得到內(nèi)存物理i也址。8、如權(quán)利要求5所述的裝置,其特征在于,該裝置進(jìn)一步包括暫存式存儲器一和暫存式存儲器二,所述暫存式存儲器一,用于在系統(tǒng)初始化的時候,保存操作系統(tǒng)的應(yīng)用基址與代碼偏移;當(dāng)由用戶態(tài)向核心態(tài)切換時,在CPU核發(fā)送的觸發(fā)信號的控制下,將保存的操作系統(tǒng)應(yīng)用基址與代碼偏移分別發(fā)送到所述應(yīng)用基址寄存器和代碼偏移寄存器;所述暫存式存儲器二,用于在進(jìn)程切換的時候,保存應(yīng)用程序的進(jìn)程控制塊中的應(yīng)用基址與代碼偏移;當(dāng)由核心態(tài)切換到用戶態(tài)的時候,在CPU核發(fā)送的觸發(fā)信號的控制下,將保存的應(yīng)用程序應(yīng)用基址與代碼偏移分別發(fā)送到所述應(yīng)用基址寄存器和代碼偏移寄存器;所述應(yīng)用基址寄存器,進(jìn)一步用于接收并保存所述暫存式存儲器一發(fā)送的操作系統(tǒng)應(yīng)用基址與代碼偏移;或接收并保存暫存式存儲器二發(fā)送的應(yīng)用程序應(yīng)用基址與代碼偏移;所述CPU核,進(jìn)一步用于向暫存式存儲器一和暫存式存儲器二發(fā)送觸發(fā)信號。9、如權(quán)利要求8所述的裝置,其特征在于,所述暫存存儲器一包括操作系統(tǒng)應(yīng)用基址寄存器和操作系統(tǒng)代碼偏移寄存器;所述暫存式存儲器二包括應(yīng)用程序應(yīng)用基址寄存器和應(yīng)用程序代碼偏移寄存器,所述操作系統(tǒng)應(yīng)用基址寄存器,用于保存操作系統(tǒng)的應(yīng)用基址,當(dāng)由戶態(tài)切換到核心態(tài)的時候,在CPU核發(fā)送的觸發(fā)信號的控制下,將所述操作系統(tǒng)的應(yīng)用基址發(fā)送到所述應(yīng)用基址寄存器;所述操作系統(tǒng)代碼偏移寄存器,用于保存操作系統(tǒng)的代碼偏移,當(dāng)由用戶態(tài)切換到核心態(tài)的時候,在CPU核發(fā)送的觸發(fā)信號的控制下,將所述操作系統(tǒng)的代碼偏移發(fā)送到所述代碼偏移寄存器;所述應(yīng)用程序應(yīng)用基址寄存器,用于保存應(yīng)用程序的應(yīng)用基址,當(dāng)由核心態(tài)切換到用戶態(tài)的時候,在CPU核發(fā)送的觸發(fā)信號的控制下,將所述應(yīng)用程序的應(yīng)用基址發(fā)送到所述應(yīng)用基址寄存器;所述應(yīng)用程序代碼偏移寄存器,用于保存應(yīng)用程序的代碼偏移,當(dāng)由核心態(tài)切換到用戶態(tài)的時候,在CPU核發(fā)送的觸發(fā)信號的控制下,將所述應(yīng)用程序的代碼偏移發(fā)送到所述代碼偏移寄存器;所述應(yīng)用基址寄存器,進(jìn)一步用于接收所述操作系統(tǒng)應(yīng)用基址寄存器發(fā)送的操作系統(tǒng)的應(yīng)用基址;或接收所述應(yīng)用程序應(yīng)用基址寄存發(fā)送的應(yīng)用程序的應(yīng)用基址;所述代碼偏移寄存器,進(jìn)一步用于接收所述操作系統(tǒng)代碼偏移寄存器發(fā)送的操作系統(tǒng)代碼偏移;或接收所述應(yīng)用程序代碼偏移寄存器發(fā)送的應(yīng)用程序的代碼偏移;所述CPU核,進(jìn)一步用于向操作系統(tǒng)應(yīng)用基址寄存器、操作系統(tǒng)代碼偏移寄存器、應(yīng)用程序應(yīng)用基址寄存器和應(yīng)用程序代碼偏移寄存器發(fā)送觸發(fā)信號。10、如權(quán)利要求8所述的裝置,其特征在于,所述暫存式存儲器一包括寄存器一和存儲操作系統(tǒng)應(yīng)用基址及代碼偏移的內(nèi)存空間;所述暫存式存儲器二包括寄存器二和存儲應(yīng)用程序應(yīng)用基址及代碼偏移的內(nèi)存空間,所述寄存器一,用于保存指向存儲操作系統(tǒng)應(yīng)用基址及代碼偏移的內(nèi)存地址的指針;所述寄存器二,用于保存指向存儲應(yīng)用程序應(yīng)用基址及代碼偏移的內(nèi)存地址的指針;所述CPU核,進(jìn)一步用于當(dāng)由戶態(tài)切換到核心態(tài)的時候,通過寄存器一中的指針調(diào)用保存在指針?biāo)竷?nèi)存地址中的操作系統(tǒng)的應(yīng)用基址及代碼偏移,分別保存到所述應(yīng)用基址寄存器和代碼偏移寄存器;當(dāng)由核心態(tài)切換到用戶態(tài)的時候,通過寄存器二中的指針調(diào)用保存在指針?biāo)竷?nèi)存地址中的應(yīng)用程序的應(yīng)用基址及代碼偏移,分別保存到所述應(yīng)用基址寄存器和代碼偏移寄存器。11、如權(quán)利要求IO所述的裝置,其特征在于,所述用于保存應(yīng)用基址和代碼偏移的內(nèi)存空間為只有核心態(tài)才能訪問的內(nèi)存空間。全文摘要本發(fā)明公開了一種應(yīng)用程序可重定位加載的方法,該方法包括調(diào)用應(yīng)用程序;查詢該應(yīng)用程序的代碼偏移和應(yīng)用長度;根據(jù)內(nèi)存的分配情況為應(yīng)用程序分配長度大于或等于所述應(yīng)用長度的空閑內(nèi)存;創(chuàng)建進(jìn)程控制塊,保存所述空閑內(nèi)存的起始地址、代碼偏移和應(yīng)用長度;將該應(yīng)用程序的代碼復(fù)制到所述空閑內(nèi)存。本發(fā)明還公開了一種支持應(yīng)用程序可重定位加載的地址重定位裝置。使用本發(fā)明使得操作系統(tǒng)能夠根據(jù)當(dāng)前內(nèi)存的分配情況加載應(yīng)用程序,避免了對應(yīng)用程序的頁面的管理及對符號信息和地址重定位信息的解析,從而簡化了應(yīng)用程序的動態(tài)加載,使編譯在同一地址的應(yīng)用程序可以同時在操作系統(tǒng)上同時運行。文檔編號G06F12/08GK101246427SQ20071008025公開日2008年8月20日申請日期2007年2月15日優(yōu)先權(quán)日2007年2月15日發(fā)明者陳立勤申請人:凌陽科技股份有限公司;北京北陽電子技術(shù)有限公司