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