專利名稱:局部缺陷內(nèi)存的處理方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明是有關(guān)于一種局部缺陷內(nèi)存的處理方法和系統(tǒng),特別涉及一種處理方法和系統(tǒng),能夠針對(duì)還未加載內(nèi)存或是已存在于內(nèi)存內(nèi)的程序代碼加以調(diào)整,而使得此程序代碼仍可以加載至具有局部缺陷存儲(chǔ)單元的內(nèi)存內(nèi)并且加以執(zhí)行。
以往如果內(nèi)存IC內(nèi)存在任何缺陷存儲(chǔ)單元(defective memorycell)時(shí),一般是不會(huì)將這樣的內(nèi)存IC在市面上販?zhǔn)?。為了減少因單一或少數(shù)缺陷而廢棄整個(gè)IC的情況,目前有許多技術(shù)可以讓局部缺陷的內(nèi)存IC,在操作上如同完全正常的內(nèi)存IC。
例如,美國(guó)專利NO.4939694中即揭露一種能夠自我測(cè)試(self-testing)和自我修補(bǔ)(self-repairing)的內(nèi)存系統(tǒng)。此內(nèi)存系統(tǒng)可以在使用現(xiàn)場(chǎng)進(jìn)行自我測(cè)試,以便定位出其中的缺陷存儲(chǔ)單元。一旦發(fā)現(xiàn)任何缺陷存儲(chǔ)單元,此內(nèi)存系統(tǒng)便會(huì)使用一種稱為錯(cuò)誤修正碼引擎(error correction code engine)的裝置,對(duì)于這些缺陷存儲(chǔ)單元進(jìn)行修補(bǔ)。如果錯(cuò)誤修正碼引擎無(wú)法負(fù)荷,則內(nèi)存系統(tǒng)便會(huì)取代掉這些缺陷存儲(chǔ)單元。
另外在美國(guó)專利No.5644541中則是利用替換內(nèi)存(substitutionmemory)來(lái)處理含有缺陷存儲(chǔ)單元的半導(dǎo)體內(nèi)存。當(dāng)半導(dǎo)體內(nèi)存在數(shù)個(gè)已知位置的錯(cuò)誤位時(shí),則利用一映像邏輯(mapping logic)將所有需要存取到這些錯(cuò)誤位的存取請(qǐng)求,導(dǎo)向到替換內(nèi)存內(nèi)良好的存儲(chǔ)單元,借此取代原本的缺陷存儲(chǔ)單元。
美國(guó)專利No.5278847中則是揭露一種使用錯(cuò)誤偵測(cè)/修正碼(error detecting and correcting code,EDAC)的容錯(cuò)(fault-tolerating)記憶系統(tǒng)。儲(chǔ)存數(shù)據(jù)的可靠度可以利用對(duì)于每個(gè)數(shù)據(jù)字符加入EDAC編碼和增加備用位(spare-bit)而達(dá)成。
美國(guó)專利No.5579266中則是利用雷射修補(bǔ)技術(shù)和可程化熔絲修補(bǔ)技術(shù)來(lái)處理缺陷存儲(chǔ)單元,可以利用冗余內(nèi)存來(lái)取代缺陷內(nèi)存。
其中像是美國(guó)專利NO.4939694中所揭露的錯(cuò)誤檢測(cè)和修補(bǔ)技術(shù)、美國(guó)專利No.5278847中所揭露的編碼和備用位技術(shù),亦或是美國(guó)專利No.5644541中所揭露的存取導(dǎo)向技術(shù),不僅會(huì)增加硬件設(shè)計(jì)上的因難度,同時(shí)在可執(zhí)行機(jī)器碼每次執(zhí)行時(shí)也會(huì)造成程序執(zhí)行上的負(fù)擔(dān)。另外,如美國(guó)專利No.5579266所揭露的冗余內(nèi)存技術(shù),在硬件設(shè)計(jì)上或是在實(shí)際進(jìn)行修補(bǔ)的程序上也都十分復(fù)雜。
另一方面,一般可執(zhí)行的機(jī)器程序代碼是由計(jì)算機(jī)程序的原始碼(source code),利用編輯器(compiler)和連結(jié)器(linker)所產(chǎn)生。機(jī)器程序代碼則可以直接加載內(nèi)存中來(lái)執(zhí)行。第1圖表示一般單芯片計(jì)算機(jī)(single chip computer)或單芯片系統(tǒng)(system-on-a-chip)的系統(tǒng)配置圖。如圖所示,此系統(tǒng)包括CPU(central processing unit,或稱微處理器)1、RAM(random access memory,隨機(jī)存取內(nèi)存)3、ROM(read-only memory,只讀存儲(chǔ)器)5、I/O界面7以及外部?jī)?chǔ)存裝置9,例如硬盤機(jī)、軟盤機(jī)或CD-ROM等等。在正常操作情況下,CPU 1會(huì)通過(guò)數(shù)據(jù)/地址總線10,由I/O界面7或是外部?jī)?chǔ)存裝置9將預(yù)備執(zhí)行的機(jī)器程序代碼,加載到RAM 3中。一般機(jī)器程序代碼中包含了三個(gè)部分,分別為指令(instruction)、數(shù)據(jù)(data)和堆棧(stack)。CPU 1會(huì)從指令部分的程序進(jìn)入點(diǎn)(entry point)開(kāi)始執(zhí)行此機(jī)器程序代碼。
第2圖表示一般機(jī)器程序代碼在執(zhí)行(execution)時(shí)的流程圖。首先,取得程序進(jìn)入點(diǎn)(S1)。接著取得下一個(gè)指令的地址(address)(S2),并且根據(jù)此地址,讀取下一個(gè)指令中的操作碼(opcode)(S3)。接著將操作碼進(jìn)行譯碼(S4),并且根據(jù)指令形式來(lái)判斷是否需要操作數(shù)(operand)。如果此指令需要操作數(shù),則再?gòu)暮罄m(xù)地址中讀取操作數(shù)(S5)。最后根據(jù)操作碼所代表的指令動(dòng)作以及操作數(shù)所代表的數(shù)據(jù)內(nèi)容或參考地址,執(zhí)行該指令(S6)。如果此指令為程序終止指令(S7),則機(jī)器程序代碼執(zhí)行完成(S8),否則回到步驟S2取得下一個(gè)指令的地址。必須說(shuō)明的是,每個(gè)指令并不一定包含相同的位組長(zhǎng)度,這與所采用的CPU類型有關(guān)。一般CPU所采用的指令集可分為可變長(zhǎng)度碼字指令集和固定長(zhǎng)度碼字指令集。
在上述執(zhí)行流程中,主要是針對(duì)機(jī)器程序代碼中的指令部分。如果相同的執(zhí)行程序應(yīng)用于數(shù)據(jù)部分或是堆棧部分,其譯碼結(jié)果則會(huì)完全錯(cuò)亂。當(dāng)某個(gè)數(shù)據(jù)字節(jié)由CPU 1譯碼成某個(gè)錯(cuò)誤的操作碼后,則會(huì)根據(jù)錯(cuò)誤的操作碼讓后面數(shù)個(gè)數(shù)據(jù)被誤認(rèn)為操作數(shù)。一般CPU 1是無(wú)法通過(guò)標(biāo)準(zhǔn)的擷取和譯碼動(dòng)作來(lái)辨認(rèn)出何者為指令部分,何者為數(shù)據(jù)部分或堆棧部分。另外,程序代碼的指令部分和數(shù)據(jù)/堆棧部分亦不可以任意地加以分?jǐn)?,指令部分的分?jǐn)啾仨毟鶕?jù)各指令的格式而定,亦即各指令(包含操作數(shù)和操作碼)的位組長(zhǎng)度。而數(shù)據(jù)/堆棧部分一般是無(wú)法分?jǐn)嗟模@是因此在數(shù)據(jù)/堆棧部分中可能包含只有在執(zhí)行時(shí)才能判斷的數(shù)據(jù)關(guān)連性,例如數(shù)據(jù)結(jié)構(gòu)中的數(shù)組。
有鑒于此,本發(fā)明的主要目的,在于提供一種局部缺陷內(nèi)存的處理方法和系統(tǒng),能夠在不改變硬件配置和不增加軟件執(zhí)行負(fù)擔(dān)的前提下,分別可以在程序代碼未加載或是程序代碼已存在的情況中,修改程序代碼在此局部缺陷內(nèi)存中的儲(chǔ)存方式,以避免使用到缺陷存儲(chǔ)單元。
本發(fā)明的目的可以通過(guò)以下措施來(lái)達(dá)到一種將程序代碼加載內(nèi)存以供執(zhí)行的方法,適用于包含多個(gè)存儲(chǔ)單元的一內(nèi)存和待加載于上述內(nèi)存的一原始程序代碼,其包括下列步驟決定上述內(nèi)存是否包含缺陷存儲(chǔ)單元;當(dāng)上述內(nèi)存不包含缺陷存儲(chǔ)單元時(shí),則加載上述原始程序代碼至上述內(nèi)存;當(dāng)上述內(nèi)存包含至少一缺陷存儲(chǔ)單元時(shí),則執(zhí)行下列步驟掃描上述原始程序代碼,在上述缺陷存儲(chǔ)單元所對(duì)應(yīng)于上述原始程序代碼的一缺陷地址前后,決定第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn);移動(dòng)上述第一分?jǐn)帱c(diǎn)和上述第二分?jǐn)帱c(diǎn)之間的區(qū)段程序代碼,至第一地址和第二地址之間,上述第一地址和上述第二地址之間的地址皆不對(duì)應(yīng)于上述內(nèi)存的上述缺陷地址;當(dāng)上述區(qū)段程序代碼包含至少一可執(zhí)行的指令時(shí),連接移動(dòng)后的上述區(qū)段程序代碼與上述原始程序代碼中未移動(dòng)部分的執(zhí)行順序;以及加載上述原始程序代碼中未移動(dòng)部分、上述連接指令和移動(dòng)后的上述區(qū)段程序代碼至上述內(nèi)存中。
一種內(nèi)存處理系統(tǒng),用以處理一包含多個(gè)存儲(chǔ)單元的內(nèi)存,其包括一微處理器,耦接于上述內(nèi)存,用以加載一原始程序代碼,當(dāng)上述原始程序代碼被加載的存儲(chǔ)單元皆為良好存儲(chǔ)單元時(shí),則加載上述原始程序代碼于上述內(nèi)存,當(dāng)上述原始程序代碼被加載的存儲(chǔ)單元包含至少一缺陷存儲(chǔ)單元時(shí),則掃描上述原始程序代碼,在上述缺陷存儲(chǔ)單元所對(duì)應(yīng)于上述原始程序代碼的一缺陷地址前后,決定第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn),并且移動(dòng)上述第一分?jǐn)帱c(diǎn)和上述第二分?jǐn)帱c(diǎn)之間的區(qū)段程序代碼至第一地址和第二地址之間,并且當(dāng)上述區(qū)段程序代碼包含至少一可執(zhí)行的指令時(shí),連接上述區(qū)段程序代碼與上述原始程序代碼中未移動(dòng)部分的執(zhí)行順序,并且加載上述原始程序代碼中未移動(dòng)部分、上述連接指令和移動(dòng)后的上述區(qū)段程序代碼至上述內(nèi)存中,其中上述第一地址和上述第二地址之間的程序代碼所對(duì)應(yīng)的內(nèi)存地址不包含上述缺陷地址。
一種防治局部弱化內(nèi)存處理方法,適用于已載負(fù)一原始程序代碼的一內(nèi)存,其包括下列步驟檢查上述內(nèi)存,用以找出上述內(nèi)存中功能弱化的缺陷存儲(chǔ)單元;當(dāng)上述內(nèi)存中包含至少一功能弱化的存儲(chǔ)單元,則執(zhí)行下列步驟掃描上述原始程序代碼,在上述缺陷存儲(chǔ)單元對(duì)應(yīng)于上述原始程序代碼的一缺陷地址前后,決定第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn);移動(dòng)上述第一分?jǐn)帱c(diǎn)和上述第二分?jǐn)帱c(diǎn)之間的區(qū)段程序代碼,至上述內(nèi)存中的第一存儲(chǔ)單元和第二存儲(chǔ)單元之間,上述第一存儲(chǔ)單元和上述第二存儲(chǔ)單元之間不包含上述缺陷存儲(chǔ)單元;以及當(dāng)上述區(qū)段程序代碼包含至少一可執(zhí)行的指令時(shí),連接移動(dòng)后的上述區(qū)段程序代碼與上述原始程序代碼中未移動(dòng)部分的執(zhí)行順序。
一種內(nèi)存處理系統(tǒng),用以處理一包含多個(gè)存儲(chǔ)單元并且已儲(chǔ)存一原始程序代碼的內(nèi)存,其包括
一微處理器,耦接于上述內(nèi)存,用以檢查上述內(nèi)存的存儲(chǔ)單元是否有功能弱化的存儲(chǔ)單元,當(dāng)上述弱化的存儲(chǔ)單元存在并且已儲(chǔ)存上述原始程序代碼時(shí),則掃描上述原始程序代碼,在上述弱化的存儲(chǔ)單元對(duì)應(yīng)于上述原始程序代碼的一弱化地址前后,決定第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn),并且移動(dòng)上述第一分?jǐn)帱c(diǎn)和上述第二分?jǐn)帱c(diǎn)之間的區(qū)段程序代碼至上述內(nèi)存中的第一存儲(chǔ)單元和第二存儲(chǔ)單元之間,并且當(dāng)上述區(qū)段程序代碼包含至少一可執(zhí)行的指令時(shí),連接移動(dòng)后的上述區(qū)段程序代碼與上述原始程序代碼中未移動(dòng)部分的執(zhí)行順序,其中上述第一存儲(chǔ)單元和上述第二存儲(chǔ)單元之間不包含上述缺陷存儲(chǔ)單元。
一種內(nèi)存處理方法,適用于包含多個(gè)存儲(chǔ)單元的一內(nèi)存和待加載于上述內(nèi)存的一原始程序代碼,其包括下列步驟決定上述內(nèi)存是否包含缺陷存儲(chǔ)單元;當(dāng)上述內(nèi)存不包含缺陷存儲(chǔ)單元或上述原始程序代碼不被加載于上述內(nèi)存中缺陷存儲(chǔ)單元所對(duì)應(yīng)的缺陷地址時(shí),則加載上述原始程序代碼至上述內(nèi)存;當(dāng)上述原始程序代碼被加載上述內(nèi)存內(nèi)至少一缺陷存儲(chǔ)單元所對(duì)應(yīng)的缺陷地址時(shí),則執(zhí)行下列步驟掃描上述原始程序代碼,在上述缺陷存儲(chǔ)單元所對(duì)應(yīng)于上述原始程序代碼的一缺陷地址前后,決定第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn);加載上述原始程序代碼至上述內(nèi)存中;加載上述第一分?jǐn)帱c(diǎn)和上述第二分?jǐn)帱c(diǎn)之間的區(qū)段程序代碼,至第一存儲(chǔ)單元和第二存儲(chǔ)單元之間,上述第一存儲(chǔ)單元和上述第二存儲(chǔ)單元之間不包含上述缺陷存儲(chǔ)單元;以及當(dāng)上述區(qū)段程序代碼包含至少一可執(zhí)行的指令時(shí),連接位于上述第一存儲(chǔ)單元和第二存儲(chǔ)單元之間的上述區(qū)段程序代碼與上述原始程序代碼中其它部分的執(zhí)行順序。
一種內(nèi)存處理系統(tǒng),用以處理一包含多個(gè)存儲(chǔ)單元的內(nèi)存,其包括一微處理器,耦接于上述內(nèi)存,用以加載一原始程序代碼,當(dāng)上述原始程序代碼被加載的存儲(chǔ)單元包含至少一缺陷存儲(chǔ)單元時(shí),則該系統(tǒng)能掃描上述原始程序代碼,且在上述缺陷存儲(chǔ)單元所對(duì)應(yīng)于上述原始程序代碼的一缺陷地址前后,決定第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn),并且加載上述原始程序代碼至上述內(nèi)存中以及加載上述第一分?jǐn)帱c(diǎn)和上述第二分?jǐn)帱c(diǎn)之間的區(qū)段程序代碼至第一存儲(chǔ)單元和第二存儲(chǔ)單元之間,并且當(dāng)上述區(qū)段程序代碼包含至少一可執(zhí)行的指令時(shí),連接位于上述第一存儲(chǔ)單元和第二存儲(chǔ)單元之間的上述區(qū)段程序代碼與上述原始程序代碼中其它部分的執(zhí)行順序,其中上述第一存儲(chǔ)單元和上述第二存儲(chǔ)單元之間不包含上述缺陷存儲(chǔ)單元。
一種程序代碼掃描處理方法,用以決定一原始程序代碼的可分?jǐn)帱c(diǎn),上述程序代碼掃描處理方法包括下列步驟提供一第一數(shù)據(jù)表和一第二數(shù)據(jù)表,上述第一數(shù)據(jù)表用以記錄上述原始程序代碼中的條件分支指令相關(guān)的待掃描地址,上述第二數(shù)據(jù)表用以記錄已讀取的地址范圍;依序讀取上述原始程序代碼;當(dāng)所讀取的指令為一條件分支指令時(shí),記錄上述條件分支指令相關(guān)的待掃描地址于上述第一數(shù)據(jù)表,并且依上述條件分支指令的下一地址或分支目的地址繼續(xù)掃描;隨指令的讀取,更新上述第二數(shù)據(jù)表的地址范圍,并且當(dāng)完成讀取至少一完整指令時(shí),輸出可分?jǐn)帱c(diǎn);以及當(dāng)所讀取的指令為一結(jié)束指令或其地址在上述第二數(shù)據(jù)表的地址范圍內(nèi)時(shí),則根據(jù)上述第一數(shù)據(jù)表的一待掃描地址繼續(xù)讀取,并將該待掃描地址從上述第一數(shù)據(jù)表中除去。
本發(fā)明相比現(xiàn)有技術(shù)具有如下優(yōu)點(diǎn)根據(jù)上述的目的,本發(fā)明提出一種局部缺陷內(nèi)存的處理方法,可以適用在包含多個(gè)存儲(chǔ)單元的內(nèi)存和待加載此內(nèi)存的原始程序代碼之間。假設(shè)在此內(nèi)存中具有至少一缺陷存儲(chǔ)單元。首先,掃描此原始程序代碼,并且在缺陷存儲(chǔ)單元于原始程序代碼中所對(duì)應(yīng)的缺陷地址前后,決定出第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn)。接著移動(dòng)第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn)之間的區(qū)段程序代碼到第一地址和第二地址之間,其中第一地址和第二地址之間不包含上述缺陷地址。當(dāng)被移動(dòng)的區(qū)段程序代碼中包含至少一可執(zhí)行的指令時(shí)(亦即包含指令部分),則需要連接移動(dòng)后的區(qū)段程序代碼與原始程序代碼中未移動(dòng)部分的執(zhí)行順序。而當(dāng)移動(dòng)后的區(qū)段程序代碼與原始程序代碼中未移動(dòng)部分之間存在參考地址或是區(qū)段程序代碼本身的內(nèi)部存在參考地址,則視情況進(jìn)行調(diào)整。最后,便可以將原始程序代碼中未移動(dòng)部分、連接指令以及移動(dòng)后的區(qū)段程序代碼依序加載至內(nèi)存中。由于利用上述方式所加載的程序代碼為可執(zhí)行狀態(tài)并且不會(huì)儲(chǔ)存于已知的缺陷存儲(chǔ)單元之中,因此即使內(nèi)存中存在缺陷存儲(chǔ)單元,此內(nèi)存仍可以正常地使用。另外,上述處理過(guò)程中不涉及硬件電路的修改或變更,因此實(shí)施成本相當(dāng)?shù)汀?br>
另外,如果待加載的原始程序代碼本身已經(jīng)過(guò)模塊化處理,則在進(jìn)行程序代碼掃描時(shí)便可以直接決定所需要的分?jǐn)帱c(diǎn)。但是如果原始程序代碼并未預(yù)先加以模塊化處理,則依序讀取原始程序代碼,再依據(jù)原始程序代碼中各指令組成,輸出多個(gè)可分?jǐn)帱c(diǎn),最后便可以根據(jù)缺陷地址和待插入的連接指令長(zhǎng)度,決定出所需要的第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn)。要確定掃描到完整的原始程序代碼,本發(fā)明則提供下列方法。首先,提供第一數(shù)據(jù)表和第二數(shù)據(jù)表,其中第一數(shù)據(jù)表用來(lái)記錄原始程序代碼中條件分支指令的分支目的地址,而第二數(shù)據(jù)表則用來(lái)記錄已讀取的地址范圍。當(dāng)所讀取的指令為一條件分支指令時(shí),便在第一數(shù)據(jù)表中記錄下條件分支指令的分支目的地址;當(dāng)完成一指令的讀取時(shí),則更新第二數(shù)據(jù)表的地址范圍。當(dāng)所讀取的指令為一結(jié)束指令或是其地址在第二數(shù)據(jù)表的地址范圍內(nèi)時(shí),則只要第一數(shù)據(jù)表的分支目的地址不屬于第二數(shù)據(jù)表的地址范圍內(nèi),便可以根據(jù)第一數(shù)據(jù)表的分支目的地址繼續(xù)讀取。通過(guò)上述處理分支和循環(huán)的方式,便可以確保掃描到所有的指令。
另外,要連接移動(dòng)后的區(qū)段程序代碼和原始程序代碼中未移動(dòng)部分,可以插入兩個(gè)無(wú)條件分支指令來(lái)完成。第一個(gè)無(wú)條件分支指令插入在第一分?jǐn)帱c(diǎn)的地址上,其目的地址為區(qū)段程序代碼移動(dòng)后的第一地址;第二個(gè)無(wú)條件分支指令插入在區(qū)段程序代碼移動(dòng)后的第二地址,其目的地址則為第二分?jǐn)帱c(diǎn)。
上述處理方式在實(shí)用上亦可以略加變更。緣此,本發(fā)明另外提出了一種局部缺陷內(nèi)存處理方法,其程序與上述方式有少量不同。首先,掃描原始程序代碼并且在缺陷存儲(chǔ)單元對(duì)應(yīng)的缺陷地址前后,決定第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn)。接著,先將原始程序代碼整個(gè)加載到內(nèi)存中,而另外在不包含缺陷存儲(chǔ)單元的第一存儲(chǔ)單元和第二存儲(chǔ)單元之間,再次加載位于第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn)之間的區(qū)段程序代碼。接著則與前述方式相同連接再加載的區(qū)段程序代碼與原始程序代碼中其它部分的執(zhí)行順序、修正彼此間的參考地址。通過(guò)此方式,除了可以達(dá)到前一方式的目的外,由于程序代碼先被加載到內(nèi)存中,還可以加快后續(xù)處理步驟的速度,例如修正參考地址的處理。
另外,本發(fā)明另提供一種局部缺陷內(nèi)存的處理方法,可以適用于原始程序代碼已存在于內(nèi)存中的情況。首先,檢查內(nèi)存并且找出內(nèi)存中功能弱化的至少一缺陷存儲(chǔ)單元。接著掃描原始程序代碼,以便在缺陷存儲(chǔ)單元所對(duì)應(yīng)的缺陷地址前后,決定出第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn)。接著將第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn)之間的區(qū)段程序代碼,移動(dòng)到至內(nèi)存中不包含上述缺陷存儲(chǔ)單元的第一存儲(chǔ)單元和第二存儲(chǔ)單元之間。接著則與前述方式相同連接移動(dòng)后的區(qū)段程序代碼與原始程序代碼中未移動(dòng)部分的執(zhí)行順序、修正彼此間的參考地址。由于此方式可以適用于使用中的內(nèi)存,因此在應(yīng)用上更為方便。
綜合以上所述,本發(fā)明的局部缺陷內(nèi)存的處理方法和系統(tǒng)具有下列優(yōu)點(diǎn)1.本發(fā)明中解決局部缺陷存儲(chǔ)單元的方式,并不需要變更硬件(內(nèi)存配置)上的設(shè)計(jì)或是增加硬件線路,而是通過(guò)修改程序代碼的方式來(lái)避免使用到缺陷存儲(chǔ)單元;而程序代碼在執(zhí)行時(shí)所增加的負(fù)擔(dān)也不嚴(yán)重,在最佳情況下只需要加入兩個(gè)無(wú)條件分支命令(即JMP)即可。因此在實(shí)現(xiàn)復(fù)雜度以及成本上,本發(fā)明的確具有極佳的產(chǎn)業(yè)利用價(jià)值。
2.本發(fā)明不僅可以適用于已知缺陷內(nèi)存的情況,也可以適用于正在使用中的內(nèi)存,如第三實(shí)施例所述?,F(xiàn)有技術(shù)中的硬件修正方式通常在執(zhí)行時(shí)都必須將內(nèi)存抽出單獨(dú)加以修改,而本發(fā)明則可以對(duì)于使用中的內(nèi)存調(diào)整其中的程序代碼,因此應(yīng)用上更為方便。
為使本發(fā)明的上述目的、特征和優(yōu)點(diǎn)能更明顯易懂,下文特舉一較佳實(shí)施例,并配合所附圖
式,作詳細(xì)說(shuō)明如下第1圖表示一般單芯片計(jì)算機(jī)(single chip computer)或單芯片系統(tǒng)(system-on-a-chip)的系統(tǒng)配置圖。
第2圖表示一般機(jī)器程序代碼在執(zhí)行(execution)時(shí)的流程圖。
第3圖表示本發(fā)明第一實(shí)施例的局部缺陷內(nèi)存處理系統(tǒng)的配置圖。
第4圖表示本發(fā)明第一實(shí)施例的局部缺陷內(nèi)存處理方法的流程圖。
第5圖表示在本發(fā)明中程序代碼掃描方法的流程圖。
第6圖表示根據(jù)本發(fā)明的程序代碼掃描方法處理一程序代碼范例的示意圖。
第7圖表示在本發(fā)明中連接移動(dòng)后區(qū)段程序代碼和原始程序代碼未移動(dòng)部分的示意圖。
第8圖表示在本發(fā)明中修正參考地址的示意圖。
第9圖表示本發(fā)明第二實(shí)施例的局部缺陷內(nèi)存處理方法的流程圖。
第10圖表示本發(fā)明第三實(shí)施例的局部缺陷內(nèi)存處理系統(tǒng)的配置圖。
第11圖表示本發(fā)明第三實(shí)施例的局部缺陷內(nèi)存處理方法的流程圖。
符號(hào)說(shuō)明1~CPU;3~RAM(內(nèi)存);5~ROM;7~I/O界面;9~外部?jī)?chǔ)存裝置;10~數(shù)據(jù)/地址總線;20~原始程序代碼;30~第一數(shù)據(jù)表;40~第二數(shù)據(jù)表;C1-C7~指令段部分;D1-D3~數(shù)據(jù)/堆棧部分;21~缺陷地址;51、52~連接指令;50~移動(dòng)區(qū)段程序代碼后的程序代碼;60~完成參考地址修正的程序代碼;R1-R3、R1’-R3’~參考地址。
本發(fā)明的局部缺陷內(nèi)存處理方法和系統(tǒng),主要是修正待加載或已存在的原始程序代碼,以避開(kāi)發(fā)生缺陷的存儲(chǔ)單元,借此讓具有局部缺陷存儲(chǔ)單元的內(nèi)存IC仍可以正常運(yùn)作。修正原始程序代碼的處理方式,主要是通過(guò)辨識(shí)機(jī)器程序代碼的可分?jǐn)帱c(diǎn)(break point)和移動(dòng)區(qū)段程序代碼的方式來(lái)達(dá)成。亦即,先辨識(shí)出原始程序代碼中的可分?jǐn)帱c(diǎn),再根據(jù)實(shí)際發(fā)生缺陷的存儲(chǔ)單元所對(duì)應(yīng)到的程序位置,決定出可以移動(dòng)的區(qū)段程序代碼;將此區(qū)段程序代碼移動(dòng)到可以正常工作的內(nèi)存單元后,再利用連接指令,維持移動(dòng)后的區(qū)段程序代碼和原始程序代碼之間的執(zhí)行順序,便可以避開(kāi)使用到缺陷存儲(chǔ)單元。由于本發(fā)明并不需要變更或重新設(shè)計(jì)硬件電路,并且在軟件執(zhí)行上所增加的額外負(fù)擔(dān)也非常有限(僅增加連接指令),因此可以達(dá)到本發(fā)明的目的。以下配合圖式,詳細(xì)說(shuō)明本發(fā)明各實(shí)施例的技術(shù)內(nèi)容。
第一實(shí)施例第3圖表示第一實(shí)施例的局部缺陷內(nèi)存處理系統(tǒng)的配置圖。在第3圖中,內(nèi)存3包含至少一個(gè)缺陷存儲(chǔ)單元,而在以下的描述中,除了特別指出外,均以單一缺陷存儲(chǔ)單元或相鄰的一組缺陷存儲(chǔ)單元為預(yù)設(shè)條件。CPU 1則是預(yù)備通過(guò)數(shù)據(jù)/地址總線10將原始程序代碼20加載到內(nèi)存3,而原始程序代碼20原本預(yù)備加載的存儲(chǔ)單元中就包括上述的缺陷存儲(chǔ)單元。因此,在CPU 1中所執(zhí)行的加載器(loader),必須執(zhí)行一些前置處理動(dòng)作,才能夠保證加載后的原始程序代碼20不會(huì)占用到缺陷存儲(chǔ)單元,同時(shí)原始程序代碼20本身仍可以正常的執(zhí)行。在本實(shí)施例中,CPU 1和內(nèi)存3可以共存于同一集成電路中,例如單芯片系統(tǒng)(system on a chip)的應(yīng)用,另外,亦可以是個(gè)別獨(dú)立的集成電路,此時(shí)CPU 1與內(nèi)存3通過(guò)特定的IC接腳相連接,用來(lái)執(zhí)行后續(xù)所描述的缺陷檢查、處理等等步驟。
第4圖表示第一實(shí)施例的局部缺陷內(nèi)存處理方法的流程圖,其中詳述CPU 1在加載原始程序代碼20前所必須執(zhí)行的各種步驟。首先,CPU 1必須決定在內(nèi)存3中缺陷存儲(chǔ)單元的位置(S10)。亦即,需要對(duì)于內(nèi)存3進(jìn)行缺陷測(cè)試,以便檢查出其中是否包含有缺陷存儲(chǔ)單元以及其實(shí)體位置。一種檢查存儲(chǔ)單元是否為缺陷的例子,是將數(shù)據(jù)”1”和”0”寫入每個(gè)存儲(chǔ)單元,再讀出其數(shù)據(jù)是否正確,如果寫入數(shù)據(jù)和讀出數(shù)據(jù)不吻合,即表示該存儲(chǔ)單元有缺陷。實(shí)際執(zhí)行測(cè)試的裝置可以是CPU 1本身,亦可以由外部的測(cè)試器或計(jì)算機(jī)來(lái)執(zhí)行。
根據(jù)經(jīng)測(cè)試所得到的缺陷存儲(chǔ)單元實(shí)體地址以及原始程序代碼20的加載訊息(例如加載開(kāi)始點(diǎn)地址),便可以決定出此缺陷存儲(chǔ)單元在原始程序代碼20中所對(duì)應(yīng)的缺陷地址(S11),亦即此缺陷存儲(chǔ)單元在原始程序代碼20所代表的絕對(duì)參考地址。由于缺陷存儲(chǔ)單元無(wú)法正常操作,因此CPU 1所執(zhí)行的加載器必須讓原本預(yù)定儲(chǔ)存于此缺陷存儲(chǔ)單元的程序代碼部分,變更加載到其它的存儲(chǔ)單元,以避免數(shù)據(jù)的流失。然而,根據(jù)前述對(duì)于一般機(jī)器程序代碼的描述可知,機(jī)器程序代碼是不可以任意分?jǐn)嗟?,某一個(gè)字節(jié)可能僅是某個(gè)指令的一部分,不可以單獨(dú)加以移動(dòng),以避免指令和數(shù)據(jù)的錯(cuò)亂。因此,CPU 1必須在原始程序代碼20中找出適當(dāng)?shù)姆謹(jǐn)帱c(diǎn),才能正確地移動(dòng)原本占用到缺陷存儲(chǔ)單元的字節(jié)。
接著,對(duì)于原始程序代碼20進(jìn)行掃描(S12),以便找出原始程序代碼20中的所有可分?jǐn)帱c(diǎn)。在一般機(jī)器程序代碼中,指令部分中的個(gè)別指令間均為可分?jǐn)帱c(diǎn),這是因?yàn)榧词箓€(gè)別指令被分?jǐn)?,在?zhí)行時(shí)CPU1仍可以正確譯碼出正確的指令訊息;相對(duì)地,數(shù)據(jù)部分和堆棧部分則不可分?jǐn)?,這是因?yàn)閿?shù)據(jù)和堆棧之間可能具有在執(zhí)行時(shí)才可能檢查出來(lái)的相關(guān)性,例如數(shù)組數(shù)據(jù)。另一方面,CPU 1無(wú)法直接分辨出機(jī)器程序代碼中的指令部分和其它部分。因此,CPU 1必須對(duì)原始程序代碼20中的指令部分整個(gè)進(jìn)行掃描,才可以決定出所有的可分?jǐn)帱c(diǎn)。
第5圖表示本實(shí)施例中原始程序代碼20的掃描方法流程圖。此處所謂的”掃描”,是包含擷取操作碼、譯碼、擷取操作數(shù)這些動(dòng)作,但是不需要執(zhí)行。為了掃描原始程序代碼20的整個(gè)指令部分,必須特別處理一般機(jī)器程序代碼中常見(jiàn)的兩種特殊型態(tài),即分支(branch)和循環(huán)(loop)。
分支型態(tài)會(huì)在原始程序代碼20中產(chǎn)生兩種不同的指令執(zhí)行順序,一般是由條件分支指令(conditional branch instruction)所造成,例如JNE、JE、JG等等。在掃描過(guò)程中,為了確定處理到所有的指令,因此兩種指令執(zhí)行順序都需要加以掃描。在本實(shí)施例中,掃描過(guò)程中會(huì)建立第一數(shù)據(jù)表30(如第5圖所示),當(dāng)遇到任何條件分支指令時(shí),會(huì)將該分支指令的下一地址或該分支指令的分支目的地址(branch-toaddress)儲(chǔ)存于第一數(shù)據(jù)表30中。借此,當(dāng)主要指令執(zhí)行順序完成掃描后,便可以根據(jù)第一數(shù)據(jù)表30進(jìn)行其它執(zhí)行順序的掃描。另外需要說(shuō)明的是,一般分支指令還包含一種無(wú)條件分支指令(unconditionalbranch instruction),例如JMP,但是由于這種指令并不會(huì)造成兩條不同的指令執(zhí)行順序,因此本實(shí)施例中的掃描可依其目的地址(branch-to address)繼續(xù)掃描。另一方面,循環(huán)型態(tài)則會(huì)造成掃描無(wú)法終止。而在本實(shí)施例中,則是在掃描過(guò)程中建立第二數(shù)據(jù)表40,用來(lái)記錄已經(jīng)被掃描過(guò)的地址范圍,而每掃描一個(gè)指令,即會(huì)更新第二數(shù)據(jù)表40。當(dāng)重復(fù)掃描到循環(huán)內(nèi)部時(shí),便可以根據(jù)第二數(shù)據(jù)表40判斷出已掃描過(guò)此部分,因此可以防止繼續(xù)掃描后續(xù)的指令。
以下詳細(xì)說(shuō)明第5圖中各步驟的動(dòng)作。首先取得程序進(jìn)入點(diǎn)(S110)。接著取得并指定下一個(gè)指令的地址(S111),并且根據(jù)此地址,讀取下一個(gè)指令中的操作碼并且進(jìn)行譯碼(S112)。如果此指令需要操作數(shù),則再?gòu)暮罄m(xù)地址中讀取操作數(shù)(S113)。此時(shí)所讀取者為一完整指令,因此可以記錄為一可分?jǐn)帱c(diǎn)。接著判斷此指令是否為條件分支指令(S114),如果是,則可(i)將此條件分支指令的分支目的地址加入到第一數(shù)據(jù)表30中(S115),而依該條件分支指令的下一地址繼續(xù)掃描;或(ii)將該條件分支指令的下一地址加入到第一數(shù)據(jù)表中,而依該條件分支指令的分支目的地址繼續(xù)掃描。接著決定出掃描的下一個(gè)地址(S116),判斷此地址的指令是否為返回指令(例如RET)或程序結(jié)束指令(例如END)(S117)。如果下一個(gè)地址的指令不是返回指令或是程序結(jié)束指令,則根據(jù)第二數(shù)據(jù)表40來(lái)判斷此一地址是否為已掃描地址范圍(S121)。如果此下一個(gè)地址亦非已掃描地址范圍,則修改第二數(shù)據(jù)表40以更新已掃描地址范圍之后(S122),繼續(xù)處理下一個(gè)指令。如果在步驟S117中下一個(gè)地址的指令的確是返回指令或是程序結(jié)束指令,亦或在步驟S121中下一個(gè)地址為已掃描過(guò)的地址范圍,則判斷第一數(shù)據(jù)表30中是否仍有待掃描地址(S118)。如果仍有,則從第一數(shù)據(jù)表30中取得一待掃描地址并且將其從第一數(shù)據(jù)表30中移去(S119),再修改第二數(shù)據(jù)表40中的已掃描地址范圍(S122),繼續(xù)處理此一待掃描地址的后續(xù)指令。如果第一數(shù)據(jù)表30中已經(jīng)沒(méi)有待掃描地址時(shí),則表示已經(jīng)掃描完成全部的指令(S120)。此時(shí)已經(jīng)得到所有的可分?jǐn)帱c(diǎn),并且可以判斷出原始程序代碼20中的指令部分和數(shù)據(jù)/堆棧部分。在第5圖中,虛線框P1表示處理分支型態(tài)的相關(guān)步驟,虛線框P2則表示處理循環(huán)型態(tài)的相關(guān)步驟。
上述掃描過(guò)程中的處理動(dòng)作,可以簡(jiǎn)要描述如下(1)當(dāng)所讀取的指令為一條件分支指令(例如JNE、JE、JG等等)時(shí),將條件分支指令的分支目地址或下一地址記錄于第一數(shù)據(jù)表30中;(2)當(dāng)完成讀取一指令時(shí),便更新第二數(shù)據(jù)表40的地址范圍并且輸出可分?jǐn)帱c(diǎn);(3)如果所讀取的指令為一結(jié)束指令或返回指令或者是其地址在第二數(shù)據(jù)表40的地址范圍內(nèi),只要第一數(shù)據(jù)表30的某個(gè)待掃描地址不屬于第二數(shù)據(jù)表40的地址范圍,便從第一數(shù)據(jù)表30的這個(gè)待掃描地址繼續(xù)讀取。
根據(jù)第5圖所述的掃描程序,以下以一實(shí)例來(lái)說(shuō)明其掃描的動(dòng)作。第6圖表示根據(jù)第5圖掃描方法來(lái)處理一程序代碼范例的示意圖。其中,程序進(jìn)入點(diǎn)為Q1。當(dāng)從Q1掃描至Q2,讀取到一個(gè)條件分支指令JNE,此時(shí)在第一數(shù)據(jù)表30中記錄此條件分支指令JNE的分支目的地址Q6。當(dāng)繼續(xù)掃描至Q3時(shí),則讀取到一個(gè)非條件分支指令JMP。對(duì)于非條件分支指令JMP不需要儲(chǔ)存其分支目的地址Q10,而是直接到其分支目的地址繼續(xù)進(jìn)行掃描。接著從Q10掃描到Q11,則依序讀取到兩個(gè)條件分支指令JG和JE。同樣的,在第一數(shù)據(jù)表30則記錄這兩個(gè)指令的分支目的地址Q4和Q8后,繼續(xù)進(jìn)行掃描。當(dāng)掃描到Q12時(shí),讀取到程序結(jié)束指令END,因此結(jié)束主程序段的掃描。此時(shí),已掃描的區(qū)域包括C1、C2、C6、C7,而第一數(shù)據(jù)表30中則記錄Q6、Q4和Q8的待掃描地址。接著,從第一個(gè)待掃描地址Q6繼續(xù)進(jìn)行掃描,直到Q7讀取到返回指令RET為止。接著再?gòu)牡诙€(gè)待掃描地址Q4繼續(xù)進(jìn)行掃描,直到掃描到Q5,雖然并未讀取到任何結(jié)束指令或是返回指令,不過(guò)其下一個(gè)地址Q6是屬于已掃描區(qū)域,因此仍結(jié)束掃描。接著再?gòu)牡谌齻€(gè)待掃描地址Q8繼續(xù)進(jìn)行掃描,直到掃描到Q9。同樣的,雖然并未讀取到任何結(jié)束指令或是返回指令,不過(guò)其下一個(gè)地址Q10是屬于已掃描區(qū)域,因此仍結(jié)束掃描。至此,第一數(shù)據(jù)表30中已經(jīng)沒(méi)有其它的待掃描地址,因此整個(gè)掃描工作完成。在掃描過(guò)程中,可以判斷出所有的可分?jǐn)帱c(diǎn)(即每一完整的指令的前后皆為可分?jǐn)帱c(diǎn)),而且判斷出C1-C7是屬于指令部分,而D1-D3則屬于數(shù)據(jù)或堆棧等非指令部分,并且當(dāng)掃描完成但仍未被掃描到的一連續(xù)程序代碼區(qū)段,可被視為一數(shù)據(jù)或堆棧等非指令區(qū)段。
回到第4圖,當(dāng)完成原始程序代碼20的掃描動(dòng)作,便可以根據(jù)所得到的可分?jǐn)帱c(diǎn),在缺陷存儲(chǔ)單元所對(duì)應(yīng)的缺陷地址前后分別決定第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn)(S13)。每一完整的指令之間或之前之后,皆為可分?jǐn)帱c(diǎn)。第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn)之間的指令部分(也可能包含數(shù)據(jù)/堆棧部分)稱為區(qū)段程序代碼,而區(qū)段程序代碼需要被移動(dòng)到其它的地址上,以避開(kāi)缺陷地址。在本實(shí)施例中,第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn)的決定方式,是選擇以最接近缺陷地址但是與缺陷地址之間仍存在數(shù)個(gè)字節(jié)的分?jǐn)帱c(diǎn)為準(zhǔn),亦即第一/第二分?jǐn)帱c(diǎn)與缺陷地址之間仍存在數(shù)個(gè)良好的存儲(chǔ)單元,可以用以儲(chǔ)存連接指令(此點(diǎn)稍后詳述)。在以下的描述中,均以此種情況為例進(jìn)行說(shuō)明。不過(guò)上述的分?jǐn)帱c(diǎn)選擇方式并非用以限定本發(fā)明。舉例來(lái)說(shuō),第一/第二分?jǐn)帱c(diǎn)也可以根據(jù)與缺陷地址間至少間隔數(shù)個(gè)可分?jǐn)帱c(diǎn)的方式來(lái)選擇。另外,如果后續(xù)的移動(dòng)方式是采用將缺陷地址后的所有程序代碼往下位移一定長(zhǎng)度字節(jié)的方式,此時(shí)第一分?jǐn)帱c(diǎn)可以根據(jù)在缺陷地址之前且與缺陷地址之間仍存在數(shù)個(gè)字節(jié)的方式來(lái)選擇,而第二分?jǐn)帱c(diǎn)則設(shè)在程序代碼的最后,即該程序代碼最后一個(gè)字節(jié)之后,而將缺陷地址附近及后方的程序代碼設(shè)為需要移動(dòng)的區(qū)段程序代碼,而將該區(qū)段程序代碼移至該缺陷地址之后,仍可以達(dá)到本發(fā)明的目的。
決定第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn)之間的區(qū)段程序代碼之后,接著則可以將此區(qū)段程序代碼移動(dòng)到第一地址和第二地址之間(S14)。必須注意的是,缺陷地址不應(yīng)該位于第一地址和第二地址之間,也就是區(qū)段程序代碼在加載后的存儲(chǔ)單元中不包含有缺陷存儲(chǔ)單元。在完成區(qū)段程序代碼的重新尋址后,如果被移動(dòng)的區(qū)段程序代碼包含指令部分,接著必須插入連接指令,讓原始程序代碼仍維持其程序執(zhí)行順序。在本實(shí)施例中,主要是插入兩個(gè)無(wú)條件分支指令(JMP)來(lái)達(dá)成連接的目的。第一個(gè)無(wú)條件分支指令是插入于第一分?jǐn)帱c(diǎn)的地址上,其分支目的地址是指向移動(dòng)后的區(qū)段程序代碼;第二個(gè)無(wú)條件分支指令是插入于移動(dòng)后區(qū)段程序代碼的后面,而其分支目的地址則是指向第二分?jǐn)帱c(diǎn)的地址,但如果第二分?jǐn)帱c(diǎn)的地址是設(shè)在程序代碼的最后,則不需要該第二個(gè)無(wú)條件分支指令。因此,當(dāng)程序代碼執(zhí)行到第一分?jǐn)帱c(diǎn)地址上的指令(其為區(qū)段程序代碼的開(kāi)始部分)時(shí),則會(huì)通過(guò)第一個(gè)無(wú)條件分支指令,跳到移動(dòng)后的區(qū)段程序代碼繼續(xù)執(zhí)行;當(dāng)完成移動(dòng)后區(qū)段程序代碼的指令后,則通過(guò)第二個(gè)無(wú)條件分支指令跳回到第二分?jǐn)帱c(diǎn)地址上的指令。另外,如果區(qū)段程序代碼只是單純的數(shù)據(jù)/堆棧部分,則不需要加入連接指令,只需要修改與其相關(guān)的參考地址即可。
第7圖表示本實(shí)施例中連接移動(dòng)后區(qū)段程序代碼和原始程序代碼未移動(dòng)部分的示意圖。如圖所示,原始程序代碼20包含了各程序代碼A-G,而缺陷地址21則位于程序代碼E內(nèi),在程序代碼E的前后則分別決定出第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn)。當(dāng)移動(dòng)程序代碼E至新的地址范圍內(nèi),即出現(xiàn)移動(dòng)后的程序代碼E’。符號(hào)51和52分別表示插入的第一個(gè)/第二個(gè)無(wú)條件分支指令。當(dāng)程序代碼D執(zhí)行完成后,即通過(guò)第一個(gè)無(wú)條件分支指令跳到程序代碼E’;當(dāng)程序代碼E’執(zhí)行完成后,則再通過(guò)第二個(gè)無(wú)條件分支指令跳回程序代碼F。因此,原始程序代碼的程序執(zhí)行順序可以維持,僅需要多執(zhí)行兩個(gè)無(wú)條件分支指令即可。
當(dāng)完成步驟S15的連接動(dòng)作后,CPU 1加載的前置動(dòng)作已經(jīng)大致完成,只剩下一般機(jī)器程序代碼中常見(jiàn)的參考地址(reference address)還未處理。如果在原始程序代碼20中的參考地址與移動(dòng)后的區(qū)段程序代碼有關(guān),則必須進(jìn)行檢查和修正。因此,CPU 1必須修正相關(guān)的參考地址(S16)。第8圖表示在本實(shí)施例中修正參考地址的示意圖。如圖所示,原始程序代碼20中有三種參考地址會(huì)與包含缺陷地址21的程序代碼E有關(guān),分別標(biāo)示為R1、R2、R3。R1表示程序代碼E中指令的參考地址指向程序代碼E中地址的情況;R2表示其它程序代碼(例如程序代碼B)中指令的參考地址指向程序代碼E中地址的情況;R3表示程序代碼E中指令的參考地址指向其它程序代碼(如程序代碼B)的情況。這些參考地址必須在程序代碼E移動(dòng)后為程序代碼E’后,修正其參考地址(如R1’,R2’,R3’),以便產(chǎn)生實(shí)際可以加載到內(nèi)存3的機(jī)器程序代碼60。
要修正參考地址,CPU 1可對(duì)于整個(gè)原始程序代碼20進(jìn)行再次掃描,以便找出與包含缺陷地址的區(qū)段程序代碼相關(guān)的參考地址。另外,一般參考地址又可以細(xì)分為兩種尋址模式(addressing mode),分別為相對(duì)地址尋址模式(relative addressing mode)和絕對(duì)地址尋址模式(absolute addressing mode)。如果與上述三種參考地址情況一并考慮,則共有六種類型。在R1的參考地址中,只有絕對(duì)地址尋址模式的參考地址才需要修正。在R3的參考地址中,只有相對(duì)地址尋址模式的參考地址才需要修正。而在R2的參考地址中則相對(duì)及絕對(duì)地址都需要修正。當(dāng)修正上述絕對(duì)地址尋址模式的參考地址時(shí)(均是指向區(qū)段程序代碼E),則在此參考地址中加入程序代碼E和移動(dòng)后程序代碼E’之間的相對(duì)位移量即可。若要修正上述相對(duì)地址尋址模式的參考地址,亦可以利用程序代碼E和移動(dòng)后程序代碼E’之間的相對(duì)位移量來(lái)達(dá)成。不過(guò)相對(duì)地址尋址模式一般在使用上有其限制,亦即相對(duì)地址通常會(huì)限定在一定范圍內(nèi),因此在處理相對(duì)地址尋址模式上會(huì)較為復(fù)雜。例如,本實(shí)施例中在缺陷地址21的前后都預(yù)留相當(dāng)數(shù)量的可用存儲(chǔ)單元,則可以利用此部分插入連接的指令而間接達(dá)到相同的效果;另外,也可以選擇將缺陷地址21后面的所有程序代碼往后方(即較高地址的方向)位移數(shù)個(gè)字節(jié),以便避開(kāi)缺陷存儲(chǔ)單元,如此也可以避免因一區(qū)段程序代碼移動(dòng)過(guò)遠(yuǎn)以致超過(guò)相對(duì)地址尋址模式范圍的困擾;另一種解決方式則是調(diào)整編輯器的編碼格式,例如盡量采用絕對(duì)地址而避免使用相對(duì)地址進(jìn)行編碼,或?qū)⒁蛞粎^(qū)段程序代碼移動(dòng)過(guò)遠(yuǎn)而受影響的相對(duì)地址的尋址碼改為絕對(duì)地址尋址碼。
當(dāng)完成上述的前置處理,CPU 1的加載器便可以將原始程序代碼、連接指令和移動(dòng)后的區(qū)段程序代碼加載到內(nèi)存3中,完成所有的步驟(S17)。由于原本會(huì)占用缺陷存儲(chǔ)單元的區(qū)段程序代碼已經(jīng)被移動(dòng),因此程序代碼可以正常的執(zhí)行和操作。
另外,上述說(shuō)明雖然是以單一缺陷存儲(chǔ)單元為例,但是對(duì)于熟習(xí)此技藝者而言,可以延伸應(yīng)用到多個(gè)缺陷存儲(chǔ)單元的情況,其基本處理模式仍然相同。另外,本實(shí)施例中雖然是以字節(jié)的掃描方式來(lái)決定出可分?jǐn)帱c(diǎn),但對(duì)于熟習(xí)此技藝者而言,也可以將原始程序代碼加以模塊化(modularized)以方便決定可分?jǐn)帱c(diǎn)。此時(shí)不需要執(zhí)行如本實(shí)施例中所描述的掃描動(dòng)作,便可以利用較簡(jiǎn)單的掃描程序決定出缺陷地址前后的第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn)。
以上所揭露的局部缺陷內(nèi)存的處理方法和系統(tǒng),雖是以一般計(jì)算機(jī)系統(tǒng)為例,不過(guò)其最佳的應(yīng)用范例應(yīng)是在單芯片系統(tǒng)(system-on-a-chip)或單芯片計(jì)算機(jī)(single chip computer)上。在這類系統(tǒng)中,內(nèi)存模塊一般是內(nèi)建的(embedded),無(wú)法任意替換。在發(fā)現(xiàn)部分存儲(chǔ)單元有缺陷的情況下,便可以利用本實(shí)施例中所揭露的方法,整個(gè)芯片在處理后仍然可以正常執(zhí)行程序代碼。另外,本實(shí)施例中所揭露的局部缺陷內(nèi)存亦可以適用在燒錄程序的應(yīng)用上,例如快擦寫存儲(chǔ)器(flash memory)或是電子可抹式PROM(electricallyerasable programmable read-only memory)的程序燒錄上,即使局部存儲(chǔ)單元有缺陷,仍然可以使用。最重要的是,本實(shí)施例在實(shí)施上并不會(huì)增加硬件設(shè)計(jì)的成本和復(fù)雜度,而對(duì)于軟件執(zhí)行時(shí)的負(fù)擔(dān)也比現(xiàn)有技術(shù)來(lái)得輕。由此可知,本發(fā)明具有極高的產(chǎn)業(yè)利用價(jià)值。
第二實(shí)施例雖然第一實(shí)施例中已揭露一定程序的處理方式,可以解決局部缺陷內(nèi)存的問(wèn)題,但是其間仍有部分程序可以變更。例如,本實(shí)施例則是對(duì)于第一實(shí)施例改變其原始程序代碼的掃描處理方式以及加載內(nèi)存的順序而產(chǎn)生。
第9圖表示第二實(shí)施例的局部缺陷內(nèi)存處理方法的流程圖。如第9圖所示,一方面CPU 1決定出缺陷存儲(chǔ)單元的實(shí)體位置(S20)并且決定出缺陷存儲(chǔ)單元在原始程序代碼20中所對(duì)應(yīng)的缺陷地址(S21),另一方面也對(duì)于原始程序代碼20進(jìn)行掃描(S22)。由步驟S20和步驟S21可以決定出缺陷存儲(chǔ)單元的缺陷地址,而由步驟S22則可以決定出原始程序代碼20中的可分?jǐn)帱c(diǎn)。此同步處理可以適用于具有多任務(wù)功能的CPU或是多重CPU的系統(tǒng)中。接著根據(jù)缺陷地址以及可分?jǐn)帱c(diǎn)的地址,便可以進(jìn)一步?jīng)Q定出第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn)(S23),也就是需要移動(dòng)的區(qū)段程序代碼范圍。
接著的步驟順序則與第一實(shí)施例不同。先將整個(gè)原始程序代碼20加載到內(nèi)存3中(S24),此時(shí)包含缺陷地址的區(qū)段程序代碼亦會(huì)加載到缺陷存儲(chǔ)單元相鄰的存儲(chǔ)單元中,不過(guò)由于其中包含缺陷存儲(chǔ)單元,因此這部分的區(qū)段程序代碼并不會(huì)實(shí)際使用。接著,再次加載此區(qū)段程序代碼到內(nèi)存3中的第一存儲(chǔ)單元和第二存儲(chǔ)單元之間(S25),而在第一存儲(chǔ)單元和第二存儲(chǔ)單元之間則不包含缺陷存儲(chǔ)單元。接著則與第一實(shí)施例相同,插入連接指令以便連接區(qū)段程序代碼和原始程序代碼20中的其它部分(S26),并且修正其中的參考地址(S27)。與第一實(shí)施例一樣,此時(shí)在內(nèi)存3中的程序代碼是可以正常執(zhí)行的,并且實(shí)際執(zhí)行的程序代碼不會(huì)儲(chǔ)存到缺陷存儲(chǔ)單元內(nèi)。
在第二實(shí)施例中,是先分別加載原始程序代碼20和移動(dòng)后的區(qū)段程序代碼,再進(jìn)行連接以及修正參考地址的處理。此樣的處理方式除了可以達(dá)到第一實(shí)施例相同的效果外,還可以得到較佳的處理效率。一般原始程序代碼的來(lái)源大都是外部?jī)?chǔ)存媒介,例如硬盤機(jī)、軟盤機(jī)等等。要執(zhí)行連接動(dòng)作以及修正參考地址等處理時(shí),在處理速度上較內(nèi)存3來(lái)得慢,特別是在修正參考地址時(shí),必須再次對(duì)于整個(gè)原始程序代碼3進(jìn)行掃描。而在本實(shí)施例中,所有待處理的程序代碼均已被加載于內(nèi)存3中,因此可以更快地完成上述的處理步驟。另外,原始程序代碼亦可儲(chǔ)存于一已知無(wú)缺陷的內(nèi)存中,如ROM,RAM或PROM,可加快上述程序代碼掃描的速度,不過(guò)此方式需要將該原始程序代碼暫時(shí)或長(zhǎng)久存放于另外的良好內(nèi)存,或一內(nèi)存中已確定不含缺陷存儲(chǔ)單元的部分。
第三實(shí)施例第一和第二實(shí)施例是適用于原始程序代碼還未加載內(nèi)存中的情況,此時(shí)CPU(微處理器)可以在原始程序代碼還未加載內(nèi)存前即施以前置處理,以便調(diào)整程序代碼來(lái)避開(kāi)缺陷存儲(chǔ)單元。而本實(shí)施例所要處理的情況,則是當(dāng)原始程序代碼已經(jīng)成功地加載內(nèi)存中,但是部分存儲(chǔ)單元在一段時(shí)間后卻顯示功能弱化的現(xiàn)象。這些功能弱化的存儲(chǔ)單元目前雖然可以正常讀取,但是在一定時(shí)間之后,從其讀出的邏輯值就會(huì)變得越來(lái)越難以辨認(rèn)。此時(shí)必須對(duì)于內(nèi)存內(nèi)的原始程序代碼內(nèi)容加以調(diào)整,以避開(kāi)這些功能弱化的缺陷存儲(chǔ)單元。
第10圖表示第三實(shí)施例的局部缺陷內(nèi)存處理系統(tǒng)的配置圖。如第10圖所示,此時(shí)原始程序代碼20已經(jīng)加載于內(nèi)存3中。而在系統(tǒng)操作過(guò)程中,則可以通過(guò)CPU 1本身或其它外部的處理器或測(cè)試器,周期性地對(duì)于內(nèi)存3中的每個(gè)存儲(chǔ)單元進(jìn)行測(cè)試。如果在測(cè)試中某個(gè)存儲(chǔ)單元所讀出的數(shù)據(jù)已經(jīng)越來(lái)越難以辨認(rèn)時(shí),則CPU 1即設(shè)定此存儲(chǔ)單元為缺陷存儲(chǔ)單元,并且執(zhí)行本實(shí)施以下所揭露的處理方法,以便停止使用功能弱化的缺陷存儲(chǔ)單元。
第11圖表示第三實(shí)施例的局部缺陷內(nèi)存處理方法的流程圖。如第11圖所示,原始程序代碼20已經(jīng)存在于內(nèi)存3中(S30)。此時(shí),一方面CPU 1可以對(duì)于原始程序代碼20進(jìn)行掃描(S31),得到原始程序代碼20中的所有可分?jǐn)帱c(diǎn);另一方面也對(duì)于內(nèi)存3進(jìn)行周期性測(cè)試并且決定出其中功能弱化的缺陷存儲(chǔ)單元(S32)。由于原始程序代碼20已經(jīng)加載于內(nèi)存3,因此可以根據(jù)缺陷存儲(chǔ)單元很快地判斷出對(duì)應(yīng)的缺陷地址。接著根據(jù)缺陷地址以及所有可分?jǐn)帱c(diǎn)的地址,便可以進(jìn)一步?jīng)Q定出第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn)(S33),也就是需要移動(dòng)的區(qū)段程序代碼范圍。
先在內(nèi)存3中找出一段功能正常的內(nèi)存區(qū)塊(即第一存儲(chǔ)單元和第二存儲(chǔ)單元之間),以便容納需要移動(dòng)的區(qū)段程序代碼。接著將此區(qū)段程序代碼復(fù)制到第一存儲(chǔ)單元和第二存儲(chǔ)單元之間(S34)。接著則與第一實(shí)施例相同,插入連接指令以便連接區(qū)段程序代碼和原始程序代碼20中的其它部分(S35),并且修正其中的參考地址(S36)。此時(shí)在內(nèi)存3中的程序代碼是可以正常執(zhí)行的,并且實(shí)際執(zhí)行的程序代碼不會(huì)儲(chǔ)存到功能弱化的缺陷存儲(chǔ)單元內(nèi)。
另外,如上述內(nèi)存中含多個(gè)并不相鄰的缺陷存儲(chǔ)單元,亦可應(yīng)用本發(fā)明產(chǎn)生數(shù)組與這些缺陷存儲(chǔ)單元相對(duì)應(yīng)的可分?jǐn)帱c(diǎn)組,而將這些可分?jǐn)帱c(diǎn)組間的數(shù)個(gè)程序代碼區(qū)段移至數(shù)個(gè)不同的新地址,并做相關(guān)的參考地址的更正,以產(chǎn)生一個(gè)在執(zhí)行時(shí)可避開(kāi)這些缺陷存儲(chǔ)單元的更改過(guò)的程序代碼。
本發(fā)明雖以一較佳實(shí)施例揭露如上,然其并非用以限定本發(fā)明,任何熟習(xí)此項(xiàng)技藝者,在不脫離本發(fā)明的精神和范圍內(nèi),當(dāng)可做少量的更動(dòng)與潤(rùn)飾,因此本發(fā)明的保護(hù)范圍當(dāng)視權(quán)利要求并結(jié)合說(shuō)明書和附圖為準(zhǔn)。
權(quán)利要求
1.一種將程序代碼加載內(nèi)存以供執(zhí)行的方法,適用于包含多個(gè)存儲(chǔ)單元的一內(nèi)存和待加載于上述內(nèi)存的一原始程序代碼,其特征是其包括下列步驟決定上述內(nèi)存是否包含缺陷存儲(chǔ)單元;當(dāng)上述內(nèi)存不包含缺陷存儲(chǔ)單元時(shí),則加載上述原始程序代碼至上述內(nèi)存;當(dāng)上述內(nèi)存包含至少一缺陷存儲(chǔ)單元時(shí),則執(zhí)行下列步驟掃描上述原始程序代碼,在上述缺陷存儲(chǔ)單元所對(duì)應(yīng)于上述原始程序代碼的一缺陷地址前后,決定第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn);移動(dòng)上述第一分?jǐn)帱c(diǎn)和上述第二分?jǐn)帱c(diǎn)之間的區(qū)段程序代碼,至第一地址和第二地址之間,上述第一地址和上述第二地址之間的地址皆不對(duì)應(yīng)于上述內(nèi)存的上述缺陷地址;當(dāng)上述區(qū)段程序代碼包含至少一可執(zhí)行的指令時(shí),連接移動(dòng)后的上述區(qū)段程序代碼與上述原始程序代碼中未移動(dòng)部分的執(zhí)行順序;以及加載上述原始程序代碼中未移動(dòng)部分、上述連接指令和移動(dòng)后的上述區(qū)段程序代碼至上述內(nèi)存中。
2.如權(quán)利要求1所述的將程序代碼加載內(nèi)存以供執(zhí)行的方法,其特征是還包括一步驟修正上述區(qū)段程序代碼與上述原始程序代碼中未移動(dòng)部分之間的參考地址。
3.如權(quán)利要求2所述的將程序代碼加載內(nèi)存以供執(zhí)行的方法,其特征是上述修正步驟是用以修正移動(dòng)后的上述區(qū)段程序代碼對(duì)于上述原始程序代碼中未移動(dòng)部分的相對(duì)尋址模式參考地址,以及修正上述原始程序代碼中未移動(dòng)部分對(duì)于移動(dòng)后的上述區(qū)段程序代碼的相對(duì)尋址模式參考地址以及絕對(duì)尋址模式參考地址。
4.如權(quán)利要求2所述的將程序代碼加載內(nèi)存以供執(zhí)行的方法,其特征是還包括一步驟修正移動(dòng)后的上述區(qū)段程序代碼內(nèi)的絕對(duì)尋址模式參考地址。
5.如權(quán)利要求1所述的的將程序代碼加載內(nèi)存以供執(zhí)行的方法,其特征是其中掃描上述原始程序代碼的步驟中還包括下列步驟依序讀取上述原始程序代碼;依據(jù)上述原始程序代碼中各指令組成,輸出多個(gè)可分?jǐn)帱c(diǎn);以及根據(jù)上述缺陷地址和插入的上述連接指令,決定上述第一分?jǐn)帱c(diǎn)和上述第二分?jǐn)帱c(diǎn)。
6.如權(quán)利要求5所述的的將程序代碼加載內(nèi)存以供執(zhí)行的方法,其特征是依序讀取上述原始程序代碼的步驟中還包括下列步驟提供一第一數(shù)據(jù)表和一第二數(shù)據(jù)表,上述第一數(shù)據(jù)表用以記錄上述原始程序代碼中條件分支指令的分支目的地址,上述第二數(shù)據(jù)表用以記錄已讀取的地址范圍;當(dāng)所讀取的指令為一條件分支指令時(shí),記錄上述條件分支指令的分支目的地址于上述第一數(shù)據(jù)表;當(dāng)完成讀取一指令時(shí),更新上述第二數(shù)據(jù)表的地址范圍;以及當(dāng)所讀取的指令為一結(jié)束指令或其地址在上述第二數(shù)據(jù)表的地址范圍內(nèi)時(shí),并且當(dāng)上述第一數(shù)據(jù)表的分支目的地址不屬于上述第二數(shù)據(jù)表的地址范圍時(shí),則根據(jù)上述第一數(shù)據(jù)表的分支目的地址繼續(xù)讀取。
7.如權(quán)利要求1所述的的將程序代碼加載內(nèi)存以供執(zhí)行的方法,其特征是上述連接步驟中,是插入第一無(wú)條件分支指令于上述第一分?jǐn)帱c(diǎn)的地址上,上述第一無(wú)條件分支指令的目的地址為上述區(qū)段程序代碼移動(dòng)后的第一地址,并且插入第二無(wú)條件分支指令于上述區(qū)段程序代碼移動(dòng)后的第二地址,上述第二無(wú)條件分支指令的目的地址為上述第二分?jǐn)帱c(diǎn)。
8.如權(quán)利要求1所述的的將程序代碼加載內(nèi)存以供執(zhí)行的方法,其特征是上述第二分?jǐn)帱c(diǎn)是在上述原始程序代碼的最后一個(gè)字節(jié)之后。
9.一種內(nèi)存處理系統(tǒng),用以處理一包含多個(gè)存儲(chǔ)單元的內(nèi)存,其特征是其包括一微處理器,耦接于上述內(nèi)存,用以加載一原始程序代碼,當(dāng)上述原始程序代碼被加載的存儲(chǔ)單元皆為良好存儲(chǔ)單元時(shí),則加載上述原始程序代碼于上述內(nèi)存,當(dāng)上述原始程序代碼被加載的存儲(chǔ)單元包含至少一缺陷存儲(chǔ)單元時(shí),則掃描上述原始程序代碼,在上述缺陷存儲(chǔ)單元所對(duì)應(yīng)于上述原始程序代碼的一缺陷地址前后,決定第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn),并且移動(dòng)上述第一分?jǐn)帱c(diǎn)和上述第二分?jǐn)帱c(diǎn)之間的區(qū)段程序代碼至第一地址和第二地址之間,并且當(dāng)上述區(qū)段程序代碼包含至少一可執(zhí)行的指令時(shí),連接上述區(qū)段程序代碼與上述原始程序代碼中未移動(dòng)部分的執(zhí)行順序,并且加載上述原始程序代碼中未移動(dòng)部分、上述連接指令和移動(dòng)后的上述區(qū)段程序代碼至上述內(nèi)存中,其中上述第一地址和上述第二地址之間的程序代碼所對(duì)應(yīng)的內(nèi)存地址不包含上述缺陷地址。
10.如權(quán)利要求9所述的內(nèi)存處理系統(tǒng),其特征是上述第二分?jǐn)帱c(diǎn)是在上述原始程序代碼的最后一個(gè)字節(jié)之后。
11.如權(quán)利要求9所述的的內(nèi)存處理系統(tǒng),其特征是上述微處理器還修正移動(dòng)后的上述區(qū)段程序代碼與上述原始程序代碼中未移動(dòng)部分之間的參考地址,以及移動(dòng)后的上述區(qū)段程序代碼內(nèi)的參考地址。
12.如權(quán)利要求9所述的的內(nèi)存處理系統(tǒng),其特征是上述微處理器的連接動(dòng)作中,是插入第一無(wú)條件分支指令于上述第一分?jǐn)帱c(diǎn)的地址上,上述第一無(wú)條件分支指令的目的地址為上述區(qū)段程序代碼移動(dòng)后的第一地址,并且插入第二無(wú)條件分支指令于上述區(qū)段程序代碼移動(dòng)后的第二地址,上述第二無(wú)條件分支指令的目的地址為上述第二分?jǐn)帱c(diǎn)。
13.如權(quán)利要求9所述的的內(nèi)存處理系統(tǒng),其特征是上述內(nèi)存和上述微處理器是置于同一芯片內(nèi)。
14.如權(quán)利要求9所述的的內(nèi)存處理系統(tǒng),其特征是上述內(nèi)存和上述微處理器是置于獨(dú)立的不同芯片內(nèi)。
15.一種防治局部弱化內(nèi)存處理方法,適用于已載負(fù)一原始程序代碼的一內(nèi)存,其特征是其包括下列步驟檢查上述內(nèi)存,用以找出上述內(nèi)存中功能弱化的缺陷存儲(chǔ)單元;當(dāng)上述內(nèi)存中包含至少一功能弱化的存儲(chǔ)單元,則執(zhí)行下列步驟掃描上述原始程序代碼,在上述缺陷存儲(chǔ)單元對(duì)應(yīng)于上述原始程序代碼的一缺陷地址前后,決定第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn);移動(dòng)上述第一分?jǐn)帱c(diǎn)和上述第二分?jǐn)帱c(diǎn)之間的區(qū)段程序代碼,至上述內(nèi)存中的第一存儲(chǔ)單元和第二存儲(chǔ)單元之間,上述第一存儲(chǔ)單元和上述第二存儲(chǔ)單元之間不包含上述缺陷存儲(chǔ)單元;以及當(dāng)上述區(qū)段程序代碼包含至少一可執(zhí)行的指令時(shí),連接移動(dòng)后的上述區(qū)段程序代碼與上述原始程序代碼中未移動(dòng)部分的執(zhí)行順序。
16.如權(quán)利要求15所述的防治局部弱化內(nèi)存處理方法,其特征是上述第二分?jǐn)帱c(diǎn)是在上述原始程序代碼的最后一個(gè)字節(jié)之后。
17.如權(quán)利要求15所述的的防治局部弱化內(nèi)存處理方法,其特征是還包括一步驟修正移動(dòng)后的上述區(qū)段程序代碼與上述原始程序代碼中未移動(dòng)部分之間的參考地址。
18.如權(quán)利要求17所述的的防治局部弱化內(nèi)存處理方法,其特征是上述修正步驟是用以修正移動(dòng)后的上述區(qū)段程序代碼對(duì)于上述原始程序代碼中未移動(dòng)部分的相對(duì)尋址模式參考地址,以及修正上述原始程序代碼中未移動(dòng)部分對(duì)于移動(dòng)后的上述區(qū)段程序代碼的相對(duì)尋址模式參考地址以及絕對(duì)尋址模式參考地址。
19.如權(quán)利要求18所述的的防治局部弱化內(nèi)存處理方法,其特征是還包括一步驟修正移動(dòng)后的上述區(qū)段程序代碼內(nèi)的絕對(duì)尋址模式參考地址。
20.如權(quán)利要求15所述的的防治局部弱化內(nèi)存處理方法,其特征是掃描上述原始程序代碼的步驟中還包括下列步驟依序讀取上述原始程序代碼;依據(jù)上述原始程序代碼中各指令組成,輸出多個(gè)可分?jǐn)帱c(diǎn);以及根據(jù)上述缺陷地址和插入的上述連接指令,決定上述第一分?jǐn)帱c(diǎn)和上述第二分?jǐn)帱c(diǎn)。
21.如權(quán)利要求20所述的的防治局部弱化內(nèi)存處理方法,其特征是依序讀取上述原始程序代碼的步驟中還包括下列步驟提供一第一數(shù)據(jù)表和一第二數(shù)據(jù)表,上述第一數(shù)據(jù)表用以記錄上述原始程序代碼中條件分支指令的分支目的地址,上述第二數(shù)據(jù)表用以記錄已讀取的地址范圍;當(dāng)所讀取的指令為一條件分支指令時(shí),記錄上述條件分支指令的分支目的地址于上述第一數(shù)據(jù)表;當(dāng)完成讀取一指令時(shí),更新上述第二數(shù)據(jù)表的地址范圍;以及當(dāng)所讀取的指令為一結(jié)束指令或其地址在上述第二數(shù)據(jù)表的地址范圍內(nèi)時(shí),并且當(dāng)上述第一數(shù)據(jù)表的分支目的地址不屬于上述第二數(shù)據(jù)表的地址范圍時(shí),則根據(jù)上述第一數(shù)據(jù)表的分支目的地址繼續(xù)讀取。
22.如權(quán)利要求15所述的的防治局部弱化內(nèi)存處理方法,其特征是上述連接步驟中,是插入第一無(wú)條件分支指令于上述第一分?jǐn)帱c(diǎn)的地址上,上述第一無(wú)條件分支指令的目的地址為上述區(qū)段程序代碼移動(dòng)后的第一存儲(chǔ)單元,并且插入第二無(wú)條件分支指令于上述區(qū)段程序代碼移動(dòng)后的第二存儲(chǔ)單元之后,上述第二無(wú)條件分支指令的目的地址為上述第二分?jǐn)帱c(diǎn)。
23.一種內(nèi)存處理系統(tǒng),用以處理一包含多個(gè)存儲(chǔ)單元并且已儲(chǔ)存一原始程序代碼的內(nèi)存,其特征是其包括一微處理器,耦接于上述內(nèi)存,用以檢查上述內(nèi)存的存儲(chǔ)單元是否有功能弱化的存儲(chǔ)單元,當(dāng)上述弱化的存儲(chǔ)單元存在并且已儲(chǔ)存上述原始程序代碼時(shí),則掃描上述原始程序代碼,在上述弱化的存儲(chǔ)單元對(duì)應(yīng)于上述原始程序代碼的一弱化地址前后,決定第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn),并且移動(dòng)上述第一分?jǐn)帱c(diǎn)和上述第二分?jǐn)帱c(diǎn)之間的區(qū)段程序代碼至上述內(nèi)存中的第一存儲(chǔ)單元和第二存儲(chǔ)單元之間,并且當(dāng)上述區(qū)段程序代碼包含至少一可執(zhí)行的指令時(shí),連接移動(dòng)后的上述區(qū)段程序代碼與上述原始程序代碼中未移動(dòng)部分的執(zhí)行順序,其中上述第一存儲(chǔ)單元和上述第二存儲(chǔ)單元之間不包含上述缺陷存儲(chǔ)單元。
24.如權(quán)利要求23所述的內(nèi)存處理系統(tǒng),其特征是上述第二分?jǐn)帱c(diǎn)是在上述原始程序代碼的最后一個(gè)字節(jié)之后。
25.如權(quán)利要求23所述的內(nèi)存處理系統(tǒng),其特征是上述微處理器是直接耦接于上述內(nèi)存。
26.如權(quán)利要求23所述的內(nèi)存處理系統(tǒng),其特征是上述微處理器還修正移動(dòng)后的上述區(qū)段程序代碼與上述原始程序代碼中未移動(dòng)部分之間的參考地址,以及移動(dòng)后的上述區(qū)段程序代碼內(nèi)的參考地址。
27.如權(quán)利要求23所述的內(nèi)存處理系統(tǒng),其特征是上述微處理器的連接動(dòng)作中,是插入第一無(wú)條件分支指令于上述第一分?jǐn)帱c(diǎn)的地址上,上述第一無(wú)條件分支指令的目的地址為上述區(qū)段程序代碼移動(dòng)后的第一存儲(chǔ)單元,并且插入第二無(wú)條件分支指令于上述區(qū)段程序代碼移動(dòng)后的第二存儲(chǔ)單元,上述第二無(wú)條件分支指令的目的地址為上述第二分?jǐn)帱c(diǎn)。
28.如權(quán)利要求23所述的內(nèi)存處理系統(tǒng),其特征是上述內(nèi)存和上述微處理器是置于是置于同一芯片內(nèi)。
29.如權(quán)利要求23所述的內(nèi)存處理系統(tǒng),其特征是上述內(nèi)存和上述微處理器是置于是置于獨(dú)立的不同芯片內(nèi)。
30.一種內(nèi)存處理方法,適用于包含多個(gè)存儲(chǔ)單元的一內(nèi)存和待加載于上述內(nèi)存的一原始程序代碼,其特征是其包括下列步驟決定上述內(nèi)存是否包含缺陷存儲(chǔ)單元;當(dāng)上述內(nèi)存不包含缺陷存儲(chǔ)單元或上述原始程序代碼不被加載于上述內(nèi)存中缺陷存儲(chǔ)單元所對(duì)應(yīng)的缺陷地址時(shí),則加載上述原始程序代碼至上述內(nèi)存;當(dāng)上述原始程序代碼被加載上述內(nèi)存內(nèi)至少一缺陷存儲(chǔ)單元所對(duì)應(yīng)的缺陷地址時(shí),則執(zhí)行下列步驟掃描上述原始程序代碼,在上述缺陷存儲(chǔ)單元所對(duì)應(yīng)于上述原始程序代碼的一缺陷地址前后,決定第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn);加載上述原始程序代碼至上述內(nèi)存中;加載上述第一分?jǐn)帱c(diǎn)和上述第二分?jǐn)帱c(diǎn)之間的區(qū)段程序代碼,至第一存儲(chǔ)單元和第二存儲(chǔ)單元之間,上述第一存儲(chǔ)單元和上述第二存儲(chǔ)單元之間不包含上述缺陷存儲(chǔ)單元;以及當(dāng)上述區(qū)段程序代碼包含至少一可執(zhí)行的指令時(shí),連接位于上述第一存儲(chǔ)單元和第二存儲(chǔ)單元之間的上述區(qū)段程序代碼與上述原始程序代碼中其它部分的執(zhí)行順序。
31.如權(quán)利要求30所述的內(nèi)存處理方法,其特征是還包括一步驟修正位于上述第一存儲(chǔ)單元和第二存儲(chǔ)單元之間的上述區(qū)段程序代碼與上述原始程序代碼中其它部分之間的參考地址。
32.如權(quán)利要求31所述的的內(nèi)存處理方法,其特征是上述修正步驟是用以修正位于上述第一存儲(chǔ)單元和第二存儲(chǔ)單元之間的上述區(qū)段程序代碼對(duì)于上述原始程序代碼中其它部分的相對(duì)尋址模式參考地址,以及修正上述原始程序代碼中其它部分對(duì)于位于上述第一存儲(chǔ)單元和第二存儲(chǔ)單元之間的上述區(qū)段程序代碼的相對(duì)尋址模式參考地址以及絕對(duì)尋址模式參考地址。
33.如權(quán)利要求32所述的的內(nèi)存處理方法,其特征是還包括一步驟修正位于上述第一存儲(chǔ)單元和第二存儲(chǔ)單元之間的上述區(qū)段程序代碼內(nèi)的絕對(duì)尋址模式參考地址。
34.如權(quán)利要求30所述的的內(nèi)存處理方法,其特征是掃描上述原始程序代碼的步驟中還包括下列步驟依序讀取上述原始程序代碼;依據(jù)上述原始程序代碼中各指令組成,輸出多個(gè)可分?jǐn)帱c(diǎn);以及根據(jù)上述缺陷地址和插入的上述連接指令,決定上述第一分?jǐn)帱c(diǎn)和上述第二分?jǐn)帱c(diǎn)。
35.如權(quán)利要求34所述的的內(nèi)存處理方法,其特征是依序讀取上述原始程序代碼的步驟中還包括下列步驟提供一第一數(shù)據(jù)表和一第二數(shù)據(jù)表,上述第一數(shù)據(jù)表用以記錄上述原始程序代碼中條件分支指令的分支目的地址,上述第二數(shù)據(jù)表用以記錄已讀取的地址范圍;當(dāng)所讀取的指令為一條件分支指令時(shí),記錄上述條件分支指令的分支目的地址于上述第一數(shù)據(jù)表;當(dāng)完成讀取一指令時(shí),更新上述第二數(shù)據(jù)表的地址范圍;以及當(dāng)所讀取的指令為一結(jié)束指令或其地址在上述第二數(shù)據(jù)表的地址范圍內(nèi)時(shí),并且當(dāng)上述第一數(shù)據(jù)表的分支目的地址不屬于上述第二數(shù)據(jù)表的地址范圍時(shí),則根據(jù)上述第一數(shù)據(jù)表的分支目的地址繼續(xù)讀取。
36.如權(quán)利要求30所述的的內(nèi)存處理方法,其特征是上述連接步驟中,是插入第一無(wú)條件分支指令于上述第一分?jǐn)帱c(diǎn)的地址上,上述第一無(wú)條件分支指令的目的地址為上述區(qū)段程序代碼的第一存儲(chǔ)單元,并且插入第二無(wú)條件分支指令于上述區(qū)段程序代碼的第二存儲(chǔ)單元,上述第二無(wú)條件分支指令的目的地址為上述第二分?jǐn)帱c(diǎn)。
37.一種內(nèi)存處理系統(tǒng),用以處理一包含多個(gè)存儲(chǔ)單元的內(nèi)存,其特征是其包括一微處理器,耦接于上述內(nèi)存,用以加載一原始程序代碼,當(dāng)上述原始程序代碼被加載的存儲(chǔ)單元包含至少一缺陷存儲(chǔ)單元時(shí),則該系統(tǒng)能掃描上述原始程序代碼,且在上述缺陷存儲(chǔ)單元所對(duì)應(yīng)于上述原始程序代碼的一缺陷地址前后,決定第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn),并且加載上述原始程序代碼至上述內(nèi)存中以及加載上述第一分?jǐn)帱c(diǎn)和上述第二分?jǐn)帱c(diǎn)之間的區(qū)段程序代碼至第一存儲(chǔ)單元和第二存儲(chǔ)單元之間,并且當(dāng)上述區(qū)段程序代碼包含至少一可執(zhí)行的指令時(shí),連接位于上述第一存儲(chǔ)單元和第二存儲(chǔ)單元之間的上述區(qū)段程序代碼與上述原始程序代碼中其它部分的執(zhí)行順序,其中上述第一存儲(chǔ)單元和上述第二存儲(chǔ)單元之間不包含上述缺陷存儲(chǔ)單元。
38.如權(quán)利要求37所述的內(nèi)存處理系統(tǒng),其特征是上述第二分?jǐn)帱c(diǎn)是在上述原始程序代碼的最后一個(gè)字節(jié)之后。
39.如權(quán)利要求37所述的的內(nèi)存處理系統(tǒng),其特征是上述微處理器還修正位于上述第一存儲(chǔ)單元和第二存儲(chǔ)單元之間的上述區(qū)段程序代碼與上述原始程序代碼中其它部分之間的參考地址,以及位于上述第一存儲(chǔ)單元和第二存儲(chǔ)單元之間的上述區(qū)段程序代碼內(nèi)的參考地址。
40.如權(quán)利要求37所述的的內(nèi)存處理系統(tǒng),其特征是上述微處理器的上述連接動(dòng)作中,是插入第一無(wú)條件分支指令于上述第一分?jǐn)帱c(diǎn)的地址上,上述第一無(wú)條件分支指令的目的地址為上述區(qū)段程序代碼的第一存儲(chǔ)單元,并且插入第二無(wú)條件分支指令于上述區(qū)段程序代碼的第二存儲(chǔ)單元,上述第二無(wú)條件分支指令的目的地址為上述第二分?jǐn)帱c(diǎn)。
41.如權(quán)利要求37所述的的內(nèi)存處理系統(tǒng),其特征是上述內(nèi)存和上述微處理器是置于是置于同一芯片內(nèi)。
42.如權(quán)利要求37所述的的內(nèi)存處理系統(tǒng),其特征是上述內(nèi)存和上述微處理器是置于是置于獨(dú)立的不同芯片內(nèi)。
43.一種程序代碼掃描處理方法,用以決定一原始程序代碼的可分?jǐn)帱c(diǎn),其特征是上述程序代碼掃描處理方法包括下列步驟提供一第一數(shù)據(jù)表和一第二數(shù)據(jù)表,上述第一數(shù)據(jù)表用以記錄上述原始程序代碼中的條件分支指令相關(guān)的待掃描地址,上述第二數(shù)據(jù)表用以記錄已讀取的地址范圍;依序讀取上述原始程序代碼;當(dāng)所讀取的指令為一條件分支指令時(shí),記錄上述條件分支指令相關(guān)的待掃描地址于上述第一數(shù)據(jù)表,并且依上述條件分支指令的下一地址或分支目的地址繼續(xù)掃描;隨指令的讀取,更新上述第二數(shù)據(jù)表的地址范圍,并且當(dāng)完成讀取至少一完整指令時(shí),輸出可分?jǐn)帱c(diǎn);以及當(dāng)所讀取的指令為一結(jié)束指令或其地址在上述第二數(shù)據(jù)表的地址范圍內(nèi)時(shí),則根據(jù)上述第一數(shù)據(jù)表的一待掃描地址繼續(xù)讀取,并將該待掃描地址從上述第一數(shù)據(jù)表中除去。
44.如權(quán)利要求43所述的程序代碼掃描處理方法,其特征是上述程序代碼掃描處理方法是在一原始程序代碼加載一內(nèi)存時(shí),決定可移動(dòng)的區(qū)段程序代碼。
45.如權(quán)利要求44所述的程序代碼掃描處理方法,其特征是上述內(nèi)存包含至少一缺陷存儲(chǔ)單元。
46.如權(quán)利要求43所述的程序代碼掃描處理方法,其特征是上述條件分支指令相關(guān)的待掃描地址為上述條件分支指令的分支目的地址。
47.如權(quán)利要求43所述的的程序代碼掃描處理方法,其特征是上述條件分支指令相關(guān)的待掃描地址為上述條件分支指令的下一地址。
48.如權(quán)利要求43所述的的程序代碼掃描處理方法,其特征是還包括一步驟當(dāng)所讀取的指令為一無(wú)條件分支指令時(shí),則由上述無(wú)條件分支指令的分支目的地址繼續(xù)掃描。
49.如權(quán)利要求43所述的的程序代碼掃描處理方法,其特征是當(dāng)上述所讀取的指令為一結(jié)束指令或其地址在上述第二數(shù)據(jù)表的地址范圍內(nèi),且上述第一數(shù)據(jù)表中無(wú)待掃描地址時(shí),則結(jié)束掃描。
50.如權(quán)利要求43所述的的程序代碼掃描處理方法,其特征是當(dāng)掃描結(jié)束時(shí),將仍未被掃描到的一連續(xù)程序代碼地址判定為一數(shù)據(jù)程序代碼區(qū)段。
51.如權(quán)利要求43所述的的程序代碼掃描處理方法,其特征是當(dāng)掃描結(jié)束時(shí),將仍未被掃描到的一連續(xù)程序代碼地址判定為一數(shù)據(jù)或堆棧程序代碼區(qū)段。
52.如權(quán)利要求43所述的的程序代碼掃描處理方法,其特征是當(dāng)掃描結(jié)束時(shí),將仍未被掃描到的一連續(xù)程序代碼地址判定為一非指令區(qū)段。
全文摘要
一種局部缺陷內(nèi)存的處理方法,掃描此原始程序代碼,在缺陷存儲(chǔ)單元所對(duì)應(yīng)的缺陷地址前后,定出第一分?jǐn)帱c(diǎn)和第二分?jǐn)帱c(diǎn)。移動(dòng)之間的區(qū)段程序代碼到程序代碼的不對(duì)應(yīng)缺陷地址的第一地址和第二地址間。連接移動(dòng)后的區(qū)段程序代碼與原始程序代碼中未移動(dòng)部分的執(zhí)行順序,調(diào)整移動(dòng)后的區(qū)段程序代碼與原始程序代碼中未移動(dòng)部分之間或是區(qū)段程序代碼本身的參考地址。便可以將更改過(guò)的程序加載至內(nèi)存中??梢员荛_(kāi)缺陷存儲(chǔ)單元且不影響原程序代碼的執(zhí)行功能。
文檔編號(hào)G11C29/00GK1378139SQ01110408
公開(kāi)日2002年11月6日 申請(qǐng)日期2001年4月2日 優(yōu)先權(quán)日2001年4月2日
發(fā)明者林錫聰 申請(qǐng)人:華邦電子股份有限公司