專利名稱:Linux系統(tǒng)下物理內(nèi)存的測試方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種物理內(nèi)存的測試方法,尤其涉及一種應(yīng)用于Linux操作系統(tǒng)下的物理內(nèi)存的測試方法。
背景技術(shù):
在Linux系統(tǒng)(一種可免費使用的多用戶的計算機操作系統(tǒng))核心(Kernel)中,內(nèi)存的最小單位是頁,這有利于系統(tǒng)對內(nèi)存的管理,用戶所使用的內(nèi)存地址是線性地址,它同物理地址之間的轉(zhuǎn)換是通過兩級或是三級頁表的映像來實現(xiàn)的,這種多級頁表的映像可以大大降低頁表本身所占用的內(nèi)存的大小。在Linux系統(tǒng)中,用戶通常的使用內(nèi)存的方法是調(diào)用系統(tǒng)提供的標(biāo)準(zhǔn)接口函數(shù)來分配和釋放內(nèi)存,但是通過這種方式返回的內(nèi)存地址都是線性地址(或稱為虛擬地址),并不是實際的物理地址,這種設(shè)計是同處理器本身的特性密不可分的。雖然每一個線性地址都對應(yīng)著一個實際的物理地址,我們也可以通過線性地址轉(zhuǎn)化為物理地址,而且對于此線性地址的讀寫就是對相應(yīng)的物理內(nèi)存的讀寫,但是這無法滿足用戶指定對某個物理地址進行讀寫操作的需求,因為Linux系統(tǒng)提供的內(nèi)存分配函數(shù)只能滿足用戶在內(nèi)存空間上的需求,而無法滿足在內(nèi)存位置上的需求。這就需要我們提供一種對指定物理內(nèi)存進行讀寫操作的方法。
目前,我們所使用的計算機的物理內(nèi)存通常只有幾百兆字節(jié)(MB)的物理空間,例如256MB或512MB的物理內(nèi)存空間,而在實際開發(fā)Linux系統(tǒng)應(yīng)用程序時,每個開發(fā)進程都可以擁有自己的4GB的內(nèi)存空間,這是為什么呢?這首先要從Linux系統(tǒng)核心(Kernel)所工作的內(nèi)存模式說起,因為Linux系統(tǒng)核心(Kernel)工作于虛擬內(nèi)存模式,即每一個虛擬頁對應(yīng)一個相應(yīng)的系統(tǒng)內(nèi)存的物理頁,虛擬頁和物理頁之間的地址轉(zhuǎn)換由硬件的頁表來完成,對于一個特定的虛擬頁,根據(jù)一條頁表記錄可以找到對應(yīng)的物理頁,或者是此頁無法找到的提示(說明存在一個頁錯誤)。
正是基于上述的″虛擬到物理″的頁映像原理,Linux系統(tǒng)核心通過內(nèi)存管理單元,將其虛擬內(nèi)存映像到物理內(nèi)存,并當(dāng)系統(tǒng)所需的物理內(nèi)存不足時,通過將暫時不用的物理內(nèi)存中的數(shù)據(jù)資料交換到計算機硬盤上,當(dāng)系統(tǒng)再次用到這些數(shù)據(jù)資料時再從計算機硬盤中交換回來,從而實現(xiàn)了擴展物理內(nèi)存空間的目的。
但是上述這種″虛擬到物理″的頁映像不總是一一對應(yīng)的多個虛擬頁(被不同的進程共享的頁)有可能同時指向同一個物理頁。在這種情況下,每個共享進程的頁表記錄將具有指向?qū)?yīng)物理頁的映像。如果有類似這樣的情況,當(dāng)系統(tǒng)核心想要釋放特定的物理頁時,事情會變得非常復(fù)雜,因為它必須遍歷(遍歷,英文名稱Traversal,是指沿著某條搜索路線,依次對樹中每個結(jié)點均做一次且僅做一次訪問。訪問結(jié)點所做的操作依賴于具體的應(yīng)用問題。遍歷是二叉樹上最重要的運算之一,是二叉樹上進行其它運算的基礎(chǔ))所有的進程頁表記錄來查找指向這個物理頁的引用,系統(tǒng)核心只能在引用數(shù)達(dá)到0(count=0)時才能釋放這個物理頁,因為它沒有別的辦法可以知道是不是還存在實際指向這個頁的引用。這樣當(dāng)系統(tǒng)負(fù)載較高時會讓虛擬內(nèi)存變得非常慢。
當(dāng)前,我們在生產(chǎn)線上使用內(nèi)存測試工具測試內(nèi)存的現(xiàn)有方法是在虛擬內(nèi)存中分配盡可能多的虛空間,對其進行各種內(nèi)存算法的測試,然而虛擬內(nèi)存具體映像到的是真正的物理內(nèi)存還是硬盤的交換分區(qū),檢測人員都不能清楚地知悉。
因此,現(xiàn)有的用于Linux系統(tǒng)平臺下的物理內(nèi)存的測試方法,雖然其測試程序?qū)崿F(xiàn)起來非常簡便,但是其測試方法的缺點在于由于使用系統(tǒng)提供的函數(shù)來分配內(nèi)存,這些函數(shù)受到自身保護機制的限制,無法將系統(tǒng)中的空閑內(nèi)存全部分配出來,因此其測試涵蓋率低,根本無法對操作系統(tǒng)和測試程序本身所占用的系統(tǒng)物理內(nèi)存進行檢測;此外,也無法保障分配出來的內(nèi)存在物理上是連續(xù)的;而且,經(jīng)生產(chǎn)線使用發(fā)現(xiàn),目前現(xiàn)有的內(nèi)存測試方法很難測出物理內(nèi)存的實際問題,即使發(fā)現(xiàn)問題,由于分配返回的內(nèi)存地址是線性地址,檢測人員也不知道內(nèi)存真正出錯或發(fā)生問題的實際物理位置。
發(fā)明內(nèi)容
為了解決上述現(xiàn)有技術(shù)中的問題與缺陷,本發(fā)明的目的在于提供一種Linux系統(tǒng)下物理內(nèi)存的測試方法,利用一個Linux操作系統(tǒng)下的字符設(shè)備驅(qū)動程序激活一個字符設(shè)備,用戶只需通過Linux提供的對檔案的作業(yè)函數(shù),就可以實現(xiàn)在用戶層對指定物理內(nèi)存的讀寫操作。該種方法對于內(nèi)存分配的最小單位為頁,頁的大小視Linux系統(tǒng)核心(Kernel)的配置所定。除去系統(tǒng)自身保留的內(nèi)存以及其它應(yīng)用程序(包含測試程序本身)所占用的內(nèi)存,可以直接訪問到所有剩余的物理內(nèi)存并進行測試,因此可以大大提高測試的涵蓋率及準(zhǔn)確性。
本發(fā)明所提供的一種Linux系統(tǒng)下物理內(nèi)存的測試方法,應(yīng)用于Linux操作系統(tǒng)下的物理內(nèi)存的檢測過程中,此方法包含以下步驟激活一個字符設(shè)備驅(qū)動程序,以驅(qū)動一個字符設(shè)備對一個物理內(nèi)存的物理頁進行分配與釋放;當(dāng)字符設(shè)備成功激活后,以頁為單位,按照物理內(nèi)存的物理地址遍歷整個物理內(nèi)存;判斷遍歷是否完成,如果完成,則關(guān)閉字符設(shè)備,否則,通過Linux系統(tǒng)提供的檔案作業(yè)函數(shù)設(shè)定所要訪問的物理內(nèi)存的物理地址;當(dāng)成功設(shè)定所要訪問的物理內(nèi)存的物理地址后,通過Linux系統(tǒng)提供的檔案作業(yè)函數(shù)將物理內(nèi)存映像至用戶空間;當(dāng)物理內(nèi)存被成功映像至用戶空間后,通過內(nèi)存檢測算法對物理內(nèi)存進行測試;通過Linux系統(tǒng)提供的檔案作業(yè)函數(shù)解除物理內(nèi)存與用戶空間的映像關(guān)系;以及,通過Linux系統(tǒng)提供的檔案作業(yè)函數(shù)釋放字符設(shè)備中所儲存的訊息,并繼續(xù)以頁為單位,按照物理內(nèi)存的物理地址遍歷整個物理內(nèi)存,直至遍歷完成。
綜上所述,本發(fā)明的優(yōu)點在于本發(fā)明提供了一種在Linux系統(tǒng)平臺下,通過直接訪問物理內(nèi)存進行內(nèi)存測試的方法。該方法借助于Linux系統(tǒng)核心(Kernel)的源代碼對外開放的特性,并通過一個Linux操作系統(tǒng)下的字符設(shè)備驅(qū)動程序以及Linux系統(tǒng)提供的對檔案的作業(yè)函數(shù),便可深入到系統(tǒng)核心(Kernel)內(nèi)部直接訪問物理內(nèi)存,并執(zhí)行各種內(nèi)存檢測算法的測試。
因此,本發(fā)明的一種Linux系統(tǒng)下物理內(nèi)存的測試方法與現(xiàn)有技術(shù)相比,其優(yōu)點在于本發(fā)明的內(nèi)存測試方法的測試涵蓋率高,除了系統(tǒng)核心及應(yīng)用程序所占用的少量系統(tǒng)物理內(nèi)存無法檢測以外,本方法可對系統(tǒng)中其余的物理內(nèi)存直接進行訪問和檢測,并可使測試人員清楚地知道所檢測內(nèi)存的確切物理位置,且按照此內(nèi)存的物理地址進行測試,從而可方便準(zhǔn)確地找到內(nèi)存真正出錯或發(fā)生問題的實際物理位置。此外,本發(fā)明的方法是在32/64位(bit)保護模式下實現(xiàn)的,因此檢測效率較高。
圖1為本發(fā)明的一種Linux系統(tǒng)下物理內(nèi)存的測試方法的方法流程圖;圖2為本發(fā)明的測試方法中的字符設(shè)備對物理內(nèi)存的物理頁進行分配的方法流程圖;圖3為本發(fā)明的測試方法中的字符設(shè)備對物理內(nèi)存的物理頁進行釋放的方法流程圖;圖4為本發(fā)明的測試方法中所測試的物理內(nèi)存的頁結(jié)構(gòu)示意圖;以及圖5為本發(fā)明的測試方法中每個頁區(qū)中的未被占用頁依照伙伴算法鏈接而成的結(jié)構(gòu)示意圖。
其中,附圖標(biāo)記步驟100 激活字符設(shè)備驅(qū)動程序步驟101 判斷字符設(shè)備是否成功激活步驟102 以頁為單位按照物理內(nèi)存的物理地址遍歷整個物理內(nèi)存步驟103 判斷遍歷是否完成步驟104 通過ioctl函數(shù)設(shè)定所要訪問的物理內(nèi)存的物理地址步驟105 判斷設(shè)定是否成功步驟106 通過mmap函數(shù)將物理內(nèi)存映像至用戶空間步驟107 判斷映像是否成功步驟108 通過內(nèi)存檢測算法對物理內(nèi)存進行測試步驟109 通過munmap函數(shù)解除此映像關(guān)系步驟110 通過ioctl函數(shù)釋放字符設(shè)備中儲存的訊息步驟111 關(guān)閉字符設(shè)備步驟200 獲得所要分配的物理內(nèi)存的物理地址步驟201 將此物理地址轉(zhuǎn)換為其所存在的頁結(jié)構(gòu)步驟202 判斷此頁是否被占用步驟203 獲取此頁所在的頁區(qū)結(jié)構(gòu)步驟204 判斷此頁是否存在于其頁區(qū)的伙伴算法結(jié)構(gòu)中步驟205 對此頁區(qū)的伙伴算法結(jié)構(gòu)的訪問加鎖步驟206 從此頁區(qū)的伙伴算法鏈表中移出此頁所存在的成員步驟207 對此頁區(qū)的伙伴算法結(jié)構(gòu)的訪問開鎖步驟208 將此頁映像到用戶空間步驟209 返回出錯訊息步驟300 獲得所要釋放的物理內(nèi)存的物理地址步驟301 將此物理地址轉(zhuǎn)換為其所存在的頁結(jié)構(gòu)步驟302 判斷所要釋放的頁是否已經(jīng)被分配步驟303 獲取此頁所在的頁區(qū)結(jié)構(gòu)步驟304 對此頁區(qū)的伙伴算法結(jié)構(gòu)的訪問加鎖步驟305 向此頁區(qū)的伙伴算法鏈表中加入此頁所存在的成員步驟306 對此頁區(qū)的伙伴算法結(jié)構(gòu)的訪問開鎖步驟307 返回釋放已成功的訊息步驟308 返回出錯訊息具體實施方式
以下,將結(jié)合附圖對本發(fā)明的較佳實施方式作詳細(xì)說明。
請參考圖1,圖1為本發(fā)明的一種Linux系統(tǒng)下物理內(nèi)存的測試方法的方法流程圖。如圖所示,本發(fā)明的一種Linux系統(tǒng)下物理內(nèi)存的測試方法整體包含以下步驟激活一個字符設(shè)備驅(qū)動程序,以驅(qū)動一個字符設(shè)備對一個物理內(nèi)存的物理頁進行分配與釋放(步驟100),Linux系統(tǒng)的設(shè)備分為字符設(shè)備(char device),塊設(shè)備(block device)和網(wǎng)絡(luò)設(shè)備(network device)三種,字符設(shè)備是指存取時沒有高速緩存的設(shè)備,典型的字符設(shè)備包含鼠標(biāo),鍵盤,串行口等;判斷字符設(shè)備是否成功激活(步驟101),如果否,則終止本測試進程,如果字符設(shè)備成功激活,則以頁為單位,按照物理內(nèi)存的物理地址遍歷整個物理內(nèi)存(步驟102);判斷遍歷是否完成(步驟103),如果完成,則關(guān)閉字符設(shè)備(步驟111),否則,通過Linux系統(tǒng)提供的檔案作業(yè)函數(shù)(即ioctl函數(shù))設(shè)定所要訪問的物理內(nèi)存的物理地址(步驟104),其中ioctl函數(shù)非常龐雜,它可以控制各種檔案的屬性,它用于控制特殊檔案的底層設(shè)備參數(shù),這些特殊檔案通常是指終端、套接字和接口,ioctl函數(shù)是設(shè)備驅(qū)動程序中對設(shè)備的I/O信道進行管理的函數(shù),所謂對I/O信道進行管理,就是對設(shè)備的一些特性進行控制,例如串口的傳輸波特率、馬達(dá)的轉(zhuǎn)速等等,ioctl函數(shù)是檔案結(jié)構(gòu)中的一個屬性分量,就是說如果你的驅(qū)動程序提供了對ioctl的支持,用戶就可以在用戶程序中使用ioctl函數(shù)控制設(shè)備的I/O信道;判斷設(shè)定所要訪問的物理內(nèi)存的物理地址是否成功(步驟105),如果否,則返回步驟102,繼續(xù)以頁為單位,按照物理內(nèi)存的物理地址遍歷整個物理內(nèi)存,如果成功設(shè)定所要訪問的物理內(nèi)存的物理地址,則通過Linux系統(tǒng)提供的檔案作業(yè)函數(shù)(即mmap函數(shù))將物理內(nèi)存映像至用戶空間(步驟106),Linux系統(tǒng)提供了對進程內(nèi)存管理進行支持的函數(shù),主要包含了mmap函數(shù)和munmap函數(shù)等對進程的虛擬塊堆(avl)數(shù)進行管理的函數(shù),mmap函數(shù),或者稱為“內(nèi)存映像函數(shù)”,首先,它可以映像任何位置的內(nèi)存,而不單單只局限于進程,其次,它不僅可以將虛擬地址映像到物理的隨機存取內(nèi)存(RAM)或者交換分區(qū)(swap),還可以將它們映像到檔案和檔案位置,這樣,讀寫內(nèi)存將對檔案中的資料進行讀寫,不過在這里,我們只需關(guān)心mmap函數(shù)向進程添加被映像的物理內(nèi)存的能力,munmap函數(shù)所做的事情恰好與mmap函數(shù)相反,其用以解除內(nèi)存的映像,即用以釋放落在從某一地址開始,長度為一定空間內(nèi)的物理內(nèi)存所對應(yīng)的虛空間;判斷物理內(nèi)存是否被成功映像至用戶空間(步驟107),如果否,則返回步驟102,如果是,則通過內(nèi)存檢測算法對物理內(nèi)存進行測試(步驟108),其中內(nèi)存檢測算法是指通過向內(nèi)存中寫入特定的數(shù)值,然后再讀出此數(shù)值進行比對從而實現(xiàn)內(nèi)存測試的各種內(nèi)存檢測算法,內(nèi)存檢測算法是通過Linux系統(tǒng)提供的insmod命令將執(zhí)行此算法的驅(qū)動程序模塊動態(tài)加載到系統(tǒng)核心上實現(xiàn)的,這些均為現(xiàn)有技術(shù),在此不再贅述;通過Linux系統(tǒng)提供的檔案作業(yè)函數(shù)(即munmap函數(shù))解除此物理內(nèi)存與用戶空間的映像關(guān)系(步驟109);以及通過Linux系統(tǒng)提供的檔案作業(yè)函數(shù)(即ioctl函數(shù))釋放字符設(shè)備中所儲存的訊息(步驟110),然后返回步驟102,繼續(xù)以頁為單位,按照物理內(nèi)存的物理地址遍歷整個物理內(nèi)存,直至遍歷完成。
現(xiàn)在請參考圖2,此圖為本發(fā)明的測試方法中的字符設(shè)備對物理內(nèi)存的物理頁進行分配的方法流程圖,如圖所示,其分配進程還包含如下步驟獲得所要分配的物理內(nèi)存的物理地址(步驟200);將此物理地址轉(zhuǎn)換為其所存在的頁結(jié)構(gòu)(步驟201);判斷此頁是否被系統(tǒng)核心或其它硬件及應(yīng)用程序所占用(步驟202),如果被占用則返回出錯訊息(步驟209)后終止分配進程,如果未被占用則獲取此頁所在的頁區(qū)(zone)結(jié)構(gòu)(步驟203);判斷此頁是否存在于其頁區(qū)(zone)的伙伴(buddy)算法結(jié)構(gòu)中(步驟204),如果此頁不存在于其頁區(qū)(zone)的伙伴(buddy)算法結(jié)構(gòu)中,則返回出錯訊息(步驟209)后終止分配進程,否則,對此頁區(qū)的伙伴(buddy)算法結(jié)構(gòu)的訪問加鎖(步驟205);從此頁區(qū)的伙伴(buddy)算法鏈表中移出此頁所存在的成員(步驟206);對此頁區(qū)的伙伴(buddy)算法結(jié)構(gòu)的訪問開鎖(步驟207);以及將此頁映像到用戶空間(步驟208),然后終止分配進程。
現(xiàn)在請參考圖3,此圖為本發(fā)明的測試方法中的字符設(shè)備對物理內(nèi)存的物理頁進行釋放的方法流程圖,如圖所示,其釋放進程還包含如下步驟獲得所要釋放的物理內(nèi)存的物理地址(步驟300);將此物理地址轉(zhuǎn)換為其所存在的頁結(jié)構(gòu)(步驟301);判斷所要釋放的頁是否已經(jīng)被分配(步驟302),如果未被分配則返回出錯訊息(步驟308)后終止釋放進程,如果已被分配則獲取此頁所在的頁區(qū)(zone)結(jié)構(gòu)(步驟303);對此頁區(qū)的伙伴(buddy)算法結(jié)構(gòu)的訪問加鎖(步驟304);向此頁區(qū)的伙伴(buddy)算法鏈表中加入此頁所存在的成員(步驟305);對此頁區(qū)的伙伴(buddy)算法結(jié)構(gòu)的訪問開鎖(步驟306);以及返回釋放已成功的訊息(步驟307),然后終止釋放進程。
在Linux系統(tǒng)中,核心(Kernel)包含了內(nèi)存管理機制,內(nèi)存是以頁的形式在系統(tǒng)中存在的,每一個頁代表了唯一的一塊物理內(nèi)存,系統(tǒng)通過一個數(shù)據(jù)結(jié)構(gòu)來描述這個頁的信息,并以鏈表的形式按照頁在物理內(nèi)存的位置將每個頁結(jié)構(gòu)鏈接在一起,并通過一個全局的頁結(jié)構(gòu)指針指向鏈表的頭,因此說獲得了鏈表頭,就可以得到內(nèi)存中的任何一個頁結(jié)構(gòu)。當(dāng)然我們并不能任意的操作內(nèi)存中的每一個頁,既然Linux系統(tǒng)有它自己的內(nèi)存管理機制,我們就要在不損害系統(tǒng)規(guī)則的基礎(chǔ)上來實現(xiàn)本發(fā)明的目標(biāo)。下面就進一步說明本發(fā)明是如何實現(xiàn)的。
在Linux系統(tǒng)啟動以后,核心(Kernel)會把物理內(nèi)存分成多個頁,并將每個頁標(biāo)為已被占用(reserved)和未被占用(unreserved)兩種狀態(tài),被標(biāo)為已被占用(reserved)的頁是被系統(tǒng)核心或是其它硬件及應(yīng)用程序所占用的,用戶是不允許使用的,因為對它的操作可能會導(dǎo)致整個系統(tǒng)的崩潰,因此我們的測試程序也不允許測試這一部分的內(nèi)存,通常這一部分只占整個內(nèi)存的一小部分,大約有幾十兆,如果這一部分的內(nèi)存有問題,通常系統(tǒng)都無法啟動,更不用說要運行本發(fā)明的測試程序了,請詳見圖4,此圖為本發(fā)明的測試方法中所測試的物理內(nèi)存的頁結(jié)構(gòu)示意圖,如圖所示,本發(fā)明能夠測試的就是那些被標(biāo)為未被占用(unreserved)的頁。如下表所示,在Linux系統(tǒng)中,物理內(nèi)存被劃分為三個頁區(qū)(zone)
頁區(qū)(zone)是用struct_zone_t描述的,它跟蹤頁框使用、空閑區(qū)域和鎖等訊息,具體描述如下每個結(jié)點的內(nèi)存被分為多個塊,稱為頁區(qū)(zone),它表示內(nèi)存中的一段區(qū)域。一個頁區(qū)(zone)用struct_zone_t結(jié)構(gòu)描述,頁區(qū)(zone)的類型主要有直接內(nèi)存存取(DMA)頁區(qū)(ZONE_DMA)、普通頁區(qū)(ZONE_NORMAL)和高端頁區(qū)(ZONE_HIGHMEM)三種,頁區(qū)(zone)可以使頁面分配更有目的性,有利于減少內(nèi)存碎片。直接內(nèi)存存取(DMA)頁區(qū)(ZONE_DMA)位于低端的內(nèi)存空間,用于某些舊的工業(yè)標(biāo)準(zhǔn)結(jié)構(gòu)(ISA)設(shè)備。普通頁區(qū)(ZONE_NORMAL)的內(nèi)存直接映像到Linux系統(tǒng)核心(Kernel)線性地址空間的高端部分,許多核心(Kernel)操作只能在普通頁區(qū)(ZONE_NORMAL)中進行。
每個頁區(qū)(zone)中的未被占用(unreserved)頁,依照伙伴(buddy)算法[每個頁區(qū)(zone)的頁分配使用一種伙伴(buddy)算法,此伙伴(buddy)算法核心的頁分配器引入了頁區(qū)(zone)結(jié)構(gòu),一個頁區(qū)(zone)就是一大塊連續(xù)的物理頁面,伙伴(buddy)算法將整個頁區(qū)(zone)劃分為以2為冪次的各級頁塊的集合,相鄰的同次頁塊稱為伙伴(buddy),一對伙伴(buddy)可以合并到更高次的頁面集合中去],鏈接成圖5所示的結(jié)構(gòu)如圖5所示,圖中左側(cè)部分中的每一個長方形代表這一個鏈表,此鏈表中的每一個成員代表了固定大小的在物理上連續(xù)的內(nèi)存頁,這個固定大小就是圖中標(biāo)出的以2為冪次的數(shù)字。右側(cè)部分所示的灰色長方形是此鏈表的屏蔽,屏蔽的每一位對應(yīng)著鏈表中的每一個成員,如果此成員被分配,則屏蔽置1,否則置0。
至此,本領(lǐng)域的技術(shù)人員便可依照圖1、圖2及圖3所示的本發(fā)明的內(nèi)存測試方法的流程,通過用戶層測試接口及一個字符設(shè)備來完成和實現(xiàn)在Linux操作系統(tǒng)下以較高的測試涵蓋率和準(zhǔn)確性對未被占用的物理內(nèi)存直接進行訪問和測試。
雖然本發(fā)明以前述的較佳實施方式公開如上,然而其并非用以限定本發(fā)明。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)意識到在不脫離本發(fā)明所附的權(quán)利要求所揭示的本發(fā)明的范圍和精神的情況下,所作出的變化與修改,均屬本發(fā)明的專利保護范圍之內(nèi)。關(guān)于本發(fā)明所界定的保護范圍請參考所附的權(quán)利要求。
權(quán)利要求
1.一種Linux系統(tǒng)下物理內(nèi)存的測試方法,應(yīng)用于Linux操作系統(tǒng)下的物理內(nèi)存的檢測過程中,該方法包含以下步驟(a)、激活一字符設(shè)備驅(qū)動程序,以驅(qū)動一字符設(shè)備對一物理內(nèi)存的物理頁進行分配與釋放;(b)、當(dāng)所述字符設(shè)備成功激活后,以頁為單位,按照所述物理內(nèi)存的物理地址遍歷整個物理內(nèi)存;(c)、判斷遍歷是否完成,如果完成,則關(guān)閉所述字符設(shè)備,否則,通過Linux系統(tǒng)提供的檔案作業(yè)函數(shù)設(shè)定所要訪問的所述物理內(nèi)存的物理地址;(d)、當(dāng)成功設(shè)定所要訪問的物理內(nèi)存的物理地址后,通過Linux系統(tǒng)提供的檔案作業(yè)函數(shù)將所述物理內(nèi)存映像至用戶空間;(e)、當(dāng)所述物理內(nèi)存被成功映像至用戶空間后,通過內(nèi)存檢測算法對所述物理內(nèi)存進行測試;(f)、通過Linux系統(tǒng)提供的檔案作業(yè)函數(shù)解除該物理內(nèi)存與用戶空間的映像關(guān)系;以及(g)、通過所述Linux系統(tǒng)提供的檔案作業(yè)函數(shù)釋放該字符設(shè)備中所儲存的訊息,并繼續(xù)以頁為單位,按照該物理內(nèi)存的物理地址遍歷該整個物理內(nèi)存,直至遍歷完成。
2.如權(quán)利要求1所述的Linux系統(tǒng)下物理內(nèi)存的測試方法,其特征在于,所述字符設(shè)備對所述物理內(nèi)存的物理頁進行分配還包含如下步驟獲得所要分配的物理內(nèi)存的物理地址;將所述物理地址轉(zhuǎn)換為其所存在的頁結(jié)構(gòu);判斷該頁是否被系統(tǒng)核心或其它硬件及應(yīng)用程序占用,如果被占用則返回出錯訊息并終止分配進程,如果未被占用則獲取該頁所在的頁區(qū)結(jié)構(gòu);判斷該頁是否存在于該頁區(qū)的伙伴算法結(jié)構(gòu)中,如果該頁不存在于該頁區(qū)的伙伴算法結(jié)構(gòu)中,則返回出錯訊息并終止分配進程,否則,對該頁區(qū)的伙伴算法結(jié)構(gòu)的訪問加鎖;從該頁區(qū)的伙伴算法鏈表中移出該頁所存在的成員;對該頁區(qū)的伙伴(buddy)算法結(jié)構(gòu)的訪問開鎖;以及將該頁映像到用戶空間,并終止分配進程。
3.如權(quán)利要求1所述的Linux系統(tǒng)下物理內(nèi)存的測試方法,其特征在于,所述字符設(shè)備對所述物理內(nèi)存的物理頁進行釋放還包含如下步驟獲得所要釋放的物理內(nèi)存的物理地址;將該物理地址轉(zhuǎn)換為其所存在的頁結(jié)構(gòu);判斷所要釋放的頁是否已經(jīng)被分配,如果未被分配則返回出錯訊息并終止釋放進程,如果已被分配則獲取該頁所在的頁區(qū)結(jié)構(gòu);對該頁區(qū)的伙伴算法結(jié)構(gòu)的訪問加鎖;向該頁區(qū)的伙伴算法鏈表中加入該頁所存在的成員;對該頁區(qū)的伙伴)算法結(jié)構(gòu)的訪問開鎖;以及返回釋放已成功的訊息,并終止釋放進程。
4.如權(quán)利要求1所述的Linux系統(tǒng)下物理內(nèi)存的測試方法,其特征在于,步驟(c)與步驟(g)中所述的檔案作業(yè)函數(shù)為ioctl函數(shù)。
5.如權(quán)利要求1所述的Linux系統(tǒng)下物理內(nèi)存的測試方法,其特征在于,步驟(d)中所述的檔案作業(yè)函數(shù)為mmap函數(shù)。
6.如權(quán)利要求1所述的Linux系統(tǒng)下物理內(nèi)存的測試方法,其特征在于,步驟(f)中所述的檔案作業(yè)函數(shù)為munmap函數(shù)。
7.如權(quán)利要求1所述的Linux系統(tǒng)下物理內(nèi)存測試方法,其特征在于,所述內(nèi)存檢測算法是通過向內(nèi)存中寫入特定的數(shù)值,然后再讀出該數(shù)值進行比對從而實現(xiàn)內(nèi)存測試的各種內(nèi)存檢測算法。
8.如權(quán)利要求7所述的Linux系統(tǒng)下物理內(nèi)存的測試方法,其特征在于,所述內(nèi)存檢測算法是通過Linux系統(tǒng)提供的insmod命令將執(zhí)行該算法的驅(qū)動程序模塊動態(tài)加載到系統(tǒng)核心上實現(xiàn)的。
全文摘要
本發(fā)明公開一種Linux系統(tǒng)下物理內(nèi)存的測試方法,是利用一個Linux操作系統(tǒng)下的字符設(shè)備驅(qū)動程序激活一個字符設(shè)備,用戶只需通過Linux提供的檔案作業(yè)函數(shù),就可以實現(xiàn)在用戶層對指定的物理內(nèi)存進行讀寫操作。該方法對于內(nèi)存分配的最小單位為頁,頁的大小視Linux系統(tǒng)核心(Kernel)的配置而定。除去系統(tǒng)自身保留的內(nèi)存以及其它應(yīng)用程序(包含測試程序本身)所占用的內(nèi)存空間,利用本發(fā)明的測試方法可以直接訪問到所有剩余的物理內(nèi)存并進行讀寫測試,因此大大提高了內(nèi)存測試的涵蓋率和準(zhǔn)確性。
文檔編號G06F12/08GK1991770SQ20051002306
公開日2007年7月4日 申請日期2005年12月28日 優(yōu)先權(quán)日2005年12月28日
發(fā)明者陳怡 , 陳玄同, 劉文涵 申請人:英業(yè)達(dá)股份有限公司