專利名稱:一種訪問vm_io地址空間的方法和用戶態(tài)調(diào)試器的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及調(diào)試技術(shù),具體涉及一種使用用戶態(tài)調(diào)試器對VM_IO地址空間的調(diào)試方法以及一種用戶態(tài)調(diào)試器。
背景技術(shù):
調(diào)試是指開發(fā)人員分析和定位程序故障,在被調(diào)試進(jìn)程中設(shè)置斷點、查看變量和寄存器、顯示堆棧和求表達(dá)式值,對被調(diào)試進(jìn)程進(jìn)行單步進(jìn)入、單步跳過、單步返回、暫掛、繼續(xù)運行等操作,或?qū)Ρ徽{(diào)試進(jìn)程內(nèi)存進(jìn)行讀寫操作。而調(diào)試器則是執(zhí)行上述操作的一種工具性軟件。
內(nèi)存讀取和修改是調(diào)試器的重要功能之一。在用戶態(tài)調(diào)試器中,主要通過調(diào)用ptmce()函數(shù)來實現(xiàn)對被調(diào)試進(jìn)程內(nèi)存進(jìn)行讀寫操作。ptrace()函數(shù)的定義為long ptrace(enum _ptrace_request request, pid—t pid, void *addr,void *data),其中第一個參數(shù)決定了 ptrace()函數(shù)的行為和其他參數(shù)的使用方法。當(dāng)?shù)谝粋€參數(shù)為PTRACE—PEEKTEXT時,ptrace()函數(shù)就實現(xiàn)在pid進(jìn)程空間中讀取內(nèi)存地址addr的值,并將讀取到的值存入地址data中。當(dāng)?shù)谝粋€參數(shù)為PTRACE_POKETEXT時,ptrace()函數(shù)就實現(xiàn)將地址data的值寫入pid進(jìn)程的內(nèi)存地址addr中。
在嵌入式軟件開發(fā)中,往往涉及到對外部設(shè)備I/O地址空間的訪問。以類UNIX系統(tǒng)為例,用戶進(jìn)程通過^f吏用mmap()系統(tǒng)調(diào)用,從而調(diào)用系統(tǒng)內(nèi)核中與之對應(yīng)的mmap方法。該方法是file_operations結(jié)構(gòu)體的一部分,用于請求將外部i殳備內(nèi)存映射到用戶進(jìn)程地址空間。成功調(diào)用mmap方法后,內(nèi)核在用戶進(jìn)程的虛擬地址空間查找一塊VMA( Virtual Memory Area,虛擬機區(qū)域)。VMA是一種位標(biāo)志,它定義在vm_area—struct結(jié)構(gòu)中。和物理頁的訪問權(quán)限不同,VMA標(biāo)志反映了內(nèi)核處理頁面所需要遵守的行為準(zhǔn)則。同時,還要對該內(nèi)存區(qū)域置上VM一IO ( Virtual Memory InputOutput,虛擬內(nèi)存輸入輸出)標(biāo)志,表明用戶程序具有能夠直接訪問外部設(shè)備i/o地址空間的能力。通過以上的操作,就完成了用戶進(jìn)程空間的一 段地址與外部設(shè)備1/0空間的關(guān)聯(lián)。當(dāng)前用戶進(jìn)程在這段分配的地址空間
內(nèi)進(jìn)行讀操作或?qū)懖僮?,實際上就實現(xiàn)了對外部設(shè)備的訪問。
然而,具有VM—10標(biāo)志的內(nèi)存空間只允許當(dāng)前進(jìn)程進(jìn)行訪問,如圖 1所示,在調(diào)試狀態(tài)下,即使用戶態(tài)調(diào)試器對被調(diào)試進(jìn)程進(jìn)行 PTRACE一ATTACH操作后,也無法使用ptrace()函數(shù)對被調(diào)試進(jìn)程VM一IO 地址空間進(jìn)行讀寫操作。
在目前的用戶態(tài)調(diào)試器中還沒有實現(xiàn)訪問^皮調(diào)試進(jìn)程VM—IO地址空 間的功能。
發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問題是提供一種能夠訪問VM—IO地址空間的調(diào) 試方法以及用戶態(tài)調(diào)試器。
本發(fā)明的技術(shù)問題通過以下技術(shù)方案加以解決
一種訪問VM一IO地址空間的方法,包括在被調(diào)試進(jìn)程空間中建立與 外部設(shè)備I/O地址空間關(guān)聯(lián)的VM—IO地址空間的第 一過程,還包括由分配 單元在被調(diào)試進(jìn)程空間中分配與所述VM_IO地址空間關(guān)聯(lián)的第一地址空 間,并通過調(diào)試單元對所述第一地址空間的調(diào)試實現(xiàn)對VM_IO空間進(jìn)4亍 讀訪問或?qū)懺L問的第二過程。
所述第二過程實現(xiàn)對VM一IO空間進(jìn)行讀訪問具體包括以下步驟步 驟Al.在被調(diào)試進(jìn)程空間中分配第一地址空間;步驟Bl.將所述VMjO 地址空間的數(shù)據(jù)拷貝到所述第一地址空間中;步驟Cl.用戶態(tài)調(diào)試器讀取 經(jīng)所述步驟Bl拷貝后的第一地址空間中的數(shù)據(jù)。
所述第二過程實現(xiàn)對VM_IO空間進(jìn)行寫訪問具體包括以下步驟步 驟A2.在被調(diào)試進(jìn)程空間中分配第一地址空間;步驟B2.用戶態(tài)調(diào)試器將 需要修改的數(shù)據(jù)寫入所述第一地址空間;步驟C2.將所述第一地址空間的 數(shù)據(jù)拷貝到所述VMJtO地址空間中。
所述數(shù)據(jù)拷貝具體通過用戶態(tài)調(diào)試器調(diào)用Memcpy函數(shù)實現(xiàn)。
所述第一地址空間的分配具體通過用戶態(tài)調(diào)試器調(diào)用Malloc函數(shù)實現(xiàn)。一種用戶態(tài)調(diào)試器,用于調(diào)試外部I/O地址空間,在祐 調(diào)試進(jìn)程空間 中建立與外部設(shè)備I/O地址空間關(guān)聯(lián)的VM一IO地址空間,包括分配單元, 用于在被調(diào)試進(jìn)程空間中分配與所述VM一IO地址空間關(guān)聯(lián)的第一地址空 間;調(diào)試單元,用于通過對所述第一地址空間的調(diào)試實現(xiàn)對VMjO空間 進(jìn)4亍讀^方問或?qū)慯方問。
當(dāng)對VMJO空間進(jìn)行讀訪問時,所述分配單元還用于在被調(diào)試進(jìn)程 空間中分配第一地址空間,將所述VM_IO地址空間的數(shù)據(jù)拷貝到所述第 一地址空間中;所述調(diào)試單元還用于讀取經(jīng)所述分配單元拷貝后的第 一地 址空間中的數(shù)據(jù)。
當(dāng)對VMJO空間進(jìn)行寫訪問時,所述分配單元還用于在被調(diào)試進(jìn)程 空間中分配第一地址空間,將需要^fi務(wù)改的數(shù)據(jù)寫入所述第一地址空間;所 述調(diào)試單元還用于將所述第一地址空間的數(shù)據(jù)拷貝到所述VM—IO地址空 間中。
所述調(diào)試單元還用于通過調(diào)用Memcpy函數(shù)實現(xiàn)數(shù)據(jù)拷貝。
所述分配單元還用于通過調(diào)用Malloc函數(shù)實現(xiàn)所述第一地址空間的 分配。
本發(fā)明與現(xiàn)有技術(shù)相比較的有益效果是
本發(fā)明通過在^皮調(diào)試進(jìn)程中分配第一地址空間,將VMJO地址空間 的數(shù)據(jù)拷貝至該第一地址空間,通過調(diào)試進(jìn)程對第一地址空間數(shù)據(jù)的讀取 實現(xiàn)了對VM_IO地址空間數(shù)據(jù)的讀??;本發(fā)明通it^被調(diào)試進(jìn)程中分配 第一地址空間,將需要^"改的凄t據(jù)寫入至該地址空間,并通過當(dāng)前進(jìn)程將 該地址空間的數(shù)據(jù)拷貝到VMJO地址空間,實現(xiàn)了對VM—IO地址空間數(shù) 據(jù)的4務(wù)改;可見,本發(fā)明通過在被調(diào)試進(jìn)程中分配與VM—IO地址空間關(guān) 聯(lián)的第一地址空間,對該地址空間的調(diào)試間接實現(xiàn)對VM_IO地址空間的 讀/寫訪問,從而解決了現(xiàn)有技術(shù)中無法在調(diào)試中訪問VMJO地址空間 的問題;并通過VM_IO地址空間與設(shè)備地址空間的關(guān)聯(lián),實現(xiàn)對外部設(shè) 備的調(diào)試。
本發(fā)明通過使用Malloc來分配空間、使用Memcpy來拷貝數(shù)據(jù),實現(xiàn) 簡單、方便。
圖l是現(xiàn)有技術(shù)用戶態(tài)調(diào)試器結(jié)構(gòu)示意圖2是本發(fā)明用戶態(tài)調(diào)試器一種具體實施方式
結(jié)構(gòu)示意圖3是本發(fā)明調(diào)試方法實施例1讀取^皮調(diào)試進(jìn)程VM_IO地址空間的 流程圖4是本發(fā)明調(diào)試方法實施例1對訪問內(nèi)存地址進(jìn)行分析的流程圖5是本發(fā)明調(diào)試方法實施例1在被調(diào)試進(jìn)程空間中運行malloc()函 數(shù)的流程圖6是本發(fā)明調(diào)試方法實施例1在被調(diào)試進(jìn)程空間中運行malloc()函 數(shù)的堆棧構(gòu)建布局示意圖7是本發(fā)明調(diào)試方法實施例1返回信號處理的流程圖; 圖8是本發(fā)明調(diào)試方法實施例1在被調(diào)試進(jìn)程空間中運行memcpy() 函數(shù)的流程圖9是本發(fā)明調(diào)試方法實施例1在被調(diào)試進(jìn)程空間中運行memcpy() 函數(shù)的堆棧構(gòu)建布局示意圖10是發(fā)明調(diào)試方法實施例2修改被調(diào)試進(jìn)程VM_IO地址空間的流 程圖。
具體實施例方式
下面用具體實施方式
結(jié)合附圖對本發(fā)明做進(jìn)一步詳細(xì)說明。
本發(fā)明一種用戶態(tài)調(diào)試器,其一種具體實施方式
,如圖2所示,用于 調(diào)試外部I/O地址空間,在用戶進(jìn)程中建立與外部設(shè)備I/O地址空間關(guān)聯(lián) 的VM—IO地址空間,該調(diào)試器包括分配單元,用于在凈皮調(diào)試地址空間 中分配與所述VM—IO地址空間關(guān)聯(lián)的第一地址空間;調(diào)試單元,用于通 過對所述第一地址空間的調(diào)試實現(xiàn)對VM—IO空間進(jìn)行讀或?qū)懺L問。
當(dāng)對VM一IO空間進(jìn)行讀訪問時,分配單元還用于在^f皮調(diào)試進(jìn)程空間 中分配第 一地址空間,將VM_IO地址空間的數(shù)據(jù)拷貝到第 一地址空間中; 調(diào)試單元還用于讀取經(jīng)分配單元拷貝后第一地址空間中的數(shù)據(jù)。
當(dāng)對VMJO空間進(jìn)行寫訪問時,分配單元還用于在凈皮調(diào)試進(jìn)程空間 中分配第一地址空間,將需要修改的數(shù)據(jù)寫入第一地址空間;調(diào)試單元還用于將第一地址空間的數(shù)據(jù)拷貝到VM—IO地址空間中。對VM—IO空間進(jìn) 行讀訪問時分配的第一地址空間,和對VM—IO空間進(jìn)行寫訪問時分配的 第 一地址空間可以是同 一地址空間,也可以是不同的地址空間。
調(diào)試單元還用于通過調(diào)用Memcpy函數(shù)實現(xiàn)數(shù)據(jù)拷貝。
分配單元還用于通過調(diào)用Malloc函數(shù)實現(xiàn)所述第一地址空間的分配。
本發(fā)明使用用戶態(tài)調(diào)試器的調(diào)試方法,其一種具體實施方式
,包括在 用戶進(jìn)程中建立與外部設(shè)備I/O地址空間關(guān)聯(lián)的VM一IO地址空間的笫一過 程,還包括在被調(diào)試地址空間中分配與VM—IO地址空間關(guān)聯(lián)的第一地址 空間,并通過對第一地址空間的調(diào)試實現(xiàn)對VM—IO空間進(jìn)行讀或?qū)懺L問 的第二過程。
該第二過程實現(xiàn)對VM_IO空間進(jìn)行讀訪問具體包括以下步驟
步驟Al.在^皮調(diào)試進(jìn)程空間中分配第一地址空間;
步驟B1.將VM_IO地址空間的數(shù)據(jù)拷貝到第 一地址空間中;
步驟Cl.用戶態(tài)調(diào)試器讀取經(jīng)步驟Bl拷貝后第一地址空間中的數(shù)據(jù)。
該第二過程實現(xiàn)對VM_IO空間進(jìn)行寫訪問具體包括以下步驟
步驟A2.在被調(diào)試進(jìn)程空間中分配第一地址空間;
步驟B2.用戶態(tài)調(diào)試器將需要^^改的數(shù)據(jù)寫入第一地址空間;
步驟C2.將第一地址空間的數(shù)據(jù)拷貝到VM_IO地址空間中。
數(shù)據(jù)拷貝具體可通過用戶態(tài)調(diào)試器調(diào)用Memcpy函數(shù)實現(xiàn)。
第一地址空間的分配具體通過用戶態(tài)調(diào)試器調(diào)用Malloc函數(shù)實現(xiàn)。
本發(fā)明使用用戶態(tài)調(diào)試器的調(diào)試方法,其另一種具體實施方式
,以在 x86體系中運用為例,包括讀取被調(diào)試進(jìn)程VM_IO地址空間的實施例1 和修 文被調(diào)試進(jìn)程VM—IO地址空間的實施例2。
實施例1:
如圖3所示,讀取4皮調(diào)試進(jìn)程VM—IO地址空間的整個流程包括以下 步驟
步驟301:讀取凈皮調(diào)試進(jìn)程的maps文件內(nèi)容,分析待讀取的內(nèi)存地址;
步驟302:判斷待讀取的內(nèi)存地址是否有效,即是否在被調(diào)試進(jìn)程的 虛擬地址空間中并且具有可讀屬性,若有效轉(zhuǎn)入步驟303,否則轉(zhuǎn)入步驟
8311;
步驟303:分析符號表通過調(diào)用BFD庫(Binary File Descriptor, 二 進(jìn)制文件描述符)的相關(guān)4妄口,讀取被調(diào)試進(jìn)程的可執(zhí)行文件和加載的所 有動態(tài)庫,獲取所有符號的名稱、虛擬地址和符號類型信息,并把這些符 號信息以符號名為關(guān)鍵字,建立hash表;
步驟304:在符號hash表中查找malloc()函數(shù)的入口地址; 步驟305:判斷malloc()函數(shù)是否存在,若存在轉(zhuǎn)入步驟306,否則轉(zhuǎn) 入步驟311;
步驟306:在被調(diào)試進(jìn)程中運行malloc()函數(shù),分配一塊新的內(nèi)存空間
作為第一地址空間;
步驟307:在符號hash表中查找memcpy()函數(shù)的入口地址; 步驟308:判斷memcpy()函數(shù)是否存在,若存在轉(zhuǎn)入步驟309,否則
轉(zhuǎn)入步驟311;
步驟309:在被調(diào)試進(jìn)程中運行memcpy()函數(shù),拷貝VMJO地址空 間的數(shù)據(jù)到第 一地址空間;
步驟310:按照一般讀取被調(diào)試進(jìn)程內(nèi)存的方式,用戶態(tài)調(diào)試器調(diào)用 ptrace()函數(shù),從被調(diào)試進(jìn)程第 一地址空間中獲取到的值即是VM_IO地址 空間中的值,流程結(jié)束;
步驟311:報警,流程結(jié)束。
本實施例中,步驟301對訪問內(nèi)存地址分析流程,其一種實施方式如 圖4所示,包括以下步驟
步驟401:判斷打開被調(diào)試進(jìn)程m叩s文件是否成功,若成功轉(zhuǎn)入步驟 402,否則流程結(jié)束;
步驟402:判斷被調(diào)試進(jìn)程maps文件內(nèi)容是否讀取完畢,是則結(jié)束流 程,否則轉(zhuǎn)入步驟403;
步驟403:讀取被調(diào)試進(jìn)程maps文件的一條記錄;
步驟404:獲取虛擬內(nèi)存的屬性和地址范圍;
步驟405:判斷虛擬地址是否可讀或可寫,是則轉(zhuǎn)入步驟406;否則轉(zhuǎn) 入步驟402;步驟406:判斷訪問內(nèi)存地址是否有效,有效則轉(zhuǎn)入步驟407;否則轉(zhuǎn) 入步驟402;
步驟407:將訪問內(nèi)存地址屬性置為真,即為有效,流程結(jié)束。
本實施例中,步驟306運行malloc()分配第一地址空間的流程,其一 種實施方式,如圖5所示,進(jìn)一步包括以下步驟
步驟501:停止^皮調(diào)試進(jìn)程的運行;
步驟502:保存當(dāng)前所有寄存器的值;
步驟503:根據(jù)CPU的類型,本例為X86,在^皮調(diào)試進(jìn)程的堆棧上構(gòu) 建運行malloc()函數(shù)的參數(shù)及返回地址,或者獲取當(dāng)前sp寄存器(堆棧寄 存器)的值,將malloc()函數(shù)的參數(shù)size及返回地址寫入當(dāng)前堆棧;
步驟504:將新的棧頂?shù)刂穼懭雜p寄存器,構(gòu)建后的堆棧如圖6所示, 其中參數(shù)size為分配內(nèi)存空間的大小,返回地址為一個非法地址,用于返 回異常信號;再將pc寄存器(程序計數(shù)寄存器)的值改為malloc()函數(shù)的 入口地址;
步驟505:恢復(fù)被調(diào)試進(jìn)程的運行;
步驟506:獲取異常信號。由于構(gòu)建malloc()函數(shù)的堆棧時,將返回地 址設(shè)為一個非法地址。當(dāng)運行malloc()函數(shù)結(jié)束時,進(jìn)程會返回一個異常 信號。用戶態(tài)調(diào)試器獲取到該信號,說明被調(diào)試進(jìn)程運行malloc()函數(shù)成
功;
步驟507:從eax寄存器中獲取malloc()函數(shù)的返回值,該值就是在被 調(diào)試進(jìn)程空間中新分配的內(nèi)存起始地址;
步驟508:恢復(fù)運行malloc()函數(shù)前所有寄存器的值,流程結(jié)束。 本實施例中,步驟506獲取異常信號的流程,如圖7所示,包括以下 步驟
步驟701:等待被調(diào)試進(jìn)程的異步信號;
步驟702:判斷是否為異常信號,是則轉(zhuǎn)入步驟704;否則轉(zhuǎn)入步驟
703;
步驟703:處理異步信號,轉(zhuǎn)入步驟701; 步驟704:獲:^行函數(shù)返回值,流程結(jié)束。本實施例的步驟309使用memcpy()拷貝數(shù)據(jù)的流程,如圖8所示,包 括以下步驟
步驟801:停止被調(diào)試進(jìn)程的運行;
步驟802:保存當(dāng)前所有寄存器的值;
步驟803:根據(jù)CPU的類型,本例為X86,在被調(diào)試進(jìn)程的堆棧上構(gòu) 建運行memcpy()函數(shù)的參數(shù)及返回地址,或者獲取當(dāng)前sp寄存器(堆棧 寄存器)的值,將memcpy()函數(shù)的參數(shù)to、 from、 size及返回地址寫入當(dāng)
前堆棧;
步驟804:將新的棧頂?shù)刂穼懭雜p寄存器,構(gòu)建后的堆棧如圖9所示, 將返回地址設(shè)為一個非法地址;再將pc寄存器(程序計數(shù)寄存器)的值改 為memcpy()函數(shù)的入口地*址;
步驟805:恢復(fù)被調(diào)試進(jìn)程的運行;
步驟806:獲取異常信號。由于構(gòu)建memcpy()函數(shù)的堆棧時,同樣將 返回地址設(shè)為一個非法地址,當(dāng)運行memcpy()函數(shù)結(jié)束時,進(jìn)程會返回一 個異常信號。用戶態(tài)調(diào)試器獲取到該信號,說明被調(diào)試進(jìn)程運行memcpy() 函數(shù)成功;
步驟807:恢復(fù)運行memcpy()函數(shù)前所有寄存器的值,流程結(jié)束 這樣就將凈皮調(diào)試進(jìn)程VM一IO地址空間中的值拷貝到第一地址空間中了。
實施例2:
如圖IO所示,修 文被調(diào)試進(jìn)程VMjO地址空間的整個流程包括以下 步驟
步驟1001:讀取4皮調(diào)試進(jìn)程的maps文件內(nèi)容,分析待讀取的內(nèi)存地
址;
步驟1002:判斷內(nèi)存地址是否有效,即待修改的內(nèi)存地址是否在被調(diào) 試進(jìn)程的虛擬地址空間中并且具有可寫屬性,若有效轉(zhuǎn)入步驟1003,否則 轉(zhuǎn)入步驟1011;
步驟1003:分析符號表通過調(diào)用BFD庫的相關(guān)接口 ,讀取被調(diào)試 進(jìn)程的可執(zhí)^f亍文件和加栽的所有動態(tài)庫,獲取所有符號的名稱、虛擬地址
和符號類型信息,并把這些符號信息以符號名為關(guān)鍵字,建立hash表;步驟1004:在符號hash表中查找malloc()函數(shù)的入口地址;
步驟1005:判斷malloc()函數(shù)是否存在,若存在轉(zhuǎn)入步驟1006,否則 轉(zhuǎn)入步驟1011;
步驟1006:在被調(diào)試進(jìn)程中運行malloc()函數(shù),分配一塊新的內(nèi)存空 間作為第 一地址空間;首先停止被調(diào)試進(jìn)程的運行并且保存當(dāng)前所有寄存 器的值。然后獲取當(dāng)sp寄存器(堆棧寄存器)的值,將malloc()函數(shù)的參 數(shù)size及返回地址寫入當(dāng)前堆棧,并將新的棧頂?shù)刂穼懭雜p寄存器。構(gòu)建 后的堆棧,其中參數(shù)size為分配內(nèi)存空間的大小,返回地址為一個非法地 址,用于返回異常信號;再將pc寄存器(程序計數(shù)寄存器)的值改為malloc() 函數(shù)的入口地址;最后恢復(fù)被調(diào)試進(jìn)程的運行;
由于構(gòu)建malloc()函數(shù)的堆棧時,將返回地址設(shè)為一個非法地址。當(dāng) 運行malloc()函數(shù)結(jié)束時,進(jìn)程會返回一個異常信號。用戶態(tài)調(diào)試器獲取 到該信號,說明被調(diào)試進(jìn)程運行malloc()函數(shù)成功。然后從eax寄存器中 獲取malloc()函數(shù)的返回值,該值就是在被調(diào)試進(jìn)程空間中新分配的內(nèi)存 起始地址,同時恢復(fù)運行malloc()函數(shù)前所有寄存器的值;
步驟1007:按照一般修改被調(diào)試進(jìn)程內(nèi)存的方式,用戶態(tài)調(diào)試器調(diào)用
ptrace()函數(shù),將數(shù)據(jù)寫入被調(diào)試進(jìn)程的第一地址空間;
步驟1008:在符號hash表中查找memcpy()函數(shù)的入口地址;
步驟1009:判斷memcpy()函數(shù)是否存在,若存在轉(zhuǎn)入步驟1010,否
則轉(zhuǎn)入步驟1011;
步驟1010:在被調(diào)試進(jìn)程中運行memcpy()函數(shù),將第一地址空間的 數(shù)據(jù)拷貝到VM—10地址空間。首先停止被調(diào)試進(jìn)程的運行并且保存當(dāng)前 所有寄存器的值。然后獲取當(dāng)sp寄存器(堆棧寄存器)的值,將memcpy() 函數(shù)的參數(shù)to、 from、 size及返回地址寫入當(dāng)前堆棧,并將新的棧頂?shù)刂?寫入sp寄存器。再將pc寄存器(程序計數(shù)寄存器)的值改為memcpy() 函數(shù)的入口地址,最后恢復(fù)被調(diào)試進(jìn)程的運行;
由于構(gòu)建memcpy()函數(shù)的堆棧時,同樣將返回地址設(shè)為一個非法地 址。當(dāng)運行memcpy()函數(shù)結(jié)束時,進(jìn)程會返回一個異常信號。用戶態(tài)調(diào)試 器獲取到該信號,說明被調(diào)試進(jìn)程運行memcpy()函數(shù)成功。同時恢復(fù)運行 memcpy()函數(shù)前所有寄存器的值。此時就將被調(diào)試進(jìn)程新分配的內(nèi)存空間中的值拷貝到VM—IO地址空間中,完成用戶態(tài)調(diào)試器修改被調(diào)試進(jìn)程 VMJO地址空間的才喿作;流程結(jié)束。
步驟1011:報警,流程結(jié)束。
權(quán)利要求
1.一種訪問VM_IO地址空間的方法,包括在被調(diào)試進(jìn)程空間中建立與外部設(shè)備I/O地址空間關(guān)聯(lián)的VM_IO地址空間的第一過程,其特征在于,還包括由分配單元在被調(diào)試進(jìn)程空間中分配與所述VM_IO地址空間關(guān)聯(lián)的第一地址空間,并通過調(diào)試單元對所述第一地址空間的調(diào)試實現(xiàn)對VM_IO空間進(jìn)行讀訪問或?qū)懺L問的第二過程。
2. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述第二過程實現(xiàn)對VM_IO空間進(jìn)行讀訪問具體包括以下步驟步驟Al.在被調(diào)試進(jìn)程空間中分配笫一地址空間;步驟Bl.將所述VM—IO地址空間的數(shù)據(jù)拷貝到所述第一地址空間中;步驟Cl.用戶態(tài)調(diào)試器讀取經(jīng)所述步驟B1拷貝后的第一地址空間中的數(shù)據(jù)。
3. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述第二過程實現(xiàn)對VM_IO空間進(jìn)行寫訪問具體包括以下步驟步驟A2.在被調(diào)試進(jìn)程空間中分配第一地址空間;步驟B2.用戶態(tài)調(diào)試器將需要修改的數(shù)據(jù)寫入所述第一地址空間;步驟C2.將所迷第一地址空間的數(shù)據(jù)拷貝到所述VM—IO地址空間中。
4. 根據(jù)權(quán)利要求2或3所述的方法,其特征在于,所述數(shù)據(jù)拷貝具體通過用戶態(tài)調(diào)試器調(diào)用Memcpy函數(shù)實現(xiàn)。
5. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述第一地址空間的分配具體通過用戶態(tài)調(diào)試器調(diào)用Malloc函數(shù)實現(xiàn)。
6. —種用戶態(tài)調(diào)試器,用于調(diào)試外部1/0地址空間,在凈皮調(diào)試進(jìn)程空間中建立與外部設(shè)備I/O地址空間關(guān)聯(lián)的VM—IO地址空間,其特征在于,包括分配單元,用于在祐L調(diào)試進(jìn)程空間中分配與所述VM_IO地址空間關(guān)聯(lián)的第一地址空間;調(diào)試單元,用于通過對所述第一地址空間的調(diào)試實現(xiàn)對VM_IO空間進(jìn)4亍讀訪問或?qū)懺L問。
7. 根據(jù)權(quán)利要求6所述的調(diào)試器,其特征在于,當(dāng)對VM—IO空間進(jìn)行讀訪問時,所述分配單元還用于在被調(diào)試進(jìn)程空間中分配第一地址空間,將所述VM—10地址空間的數(shù)據(jù)拷貝到所述第一地址空間中;所述調(diào)試單元還用于讀取經(jīng)所述分配單元拷貝后的第一地址空間中的數(shù)據(jù)。
8. 根據(jù)權(quán)利要求6所述的調(diào)試器,其特征在于,當(dāng)對VM—IO空間進(jìn)行寫訪問時,所述分配單元還用于在凈皮調(diào)試進(jìn)程空間中分配第一地址空間,將需要修改的數(shù)據(jù)寫入所述第一地址空間;所述調(diào)試單元還用于將所述第一地址空間的數(shù)據(jù)拷貝到所述VMJO地址空間中。
9. 根據(jù)權(quán)利要求7或8所述的調(diào)試器,其特征在于,所述調(diào)試單元還用于通過調(diào)用Memcpy函數(shù)實現(xiàn)數(shù)據(jù)拷貝。
10. 根據(jù)權(quán)利要求6所述的調(diào)試器,其特征在于,所述分配單元還用于通過調(diào)用Malloc函數(shù)實現(xiàn)所述第一地址空間的分配。
全文摘要
本發(fā)明公開了一種訪問VM_IO地址空間的方法,包括在被調(diào)試進(jìn)程空間中建立與外部設(shè)備I/O地址空間關(guān)聯(lián)的VM_IO地址空間的第一過程,還包括由分配單元在被調(diào)試進(jìn)程空間中分配與所述VM_IO地址空間關(guān)聯(lián)的第一地址空間,并通過調(diào)試單元對所述第一地址空間的調(diào)試實現(xiàn)對VM_IO空間進(jìn)行讀訪問或?qū)懺L問的第二過程。本發(fā)明還公開了一種用戶態(tài)調(diào)試器。本發(fā)明通過在被調(diào)試進(jìn)程中分配與VM_IO地址空間關(guān)聯(lián)的第一地址空間,對該地址空間的調(diào)試可以間接實現(xiàn)對VM_IO地址空間的讀/寫訪問,從而解決了現(xiàn)有技術(shù)中無法在調(diào)試中訪問VM_IO地址空間的問題。
文檔編號G06F11/36GK101650688SQ20091019000
公開日2010年2月17日 申請日期2009年8月31日 優(yōu)先權(quán)日2009年8月31日
發(fā)明者紅 向, 吳春江, 程圣宇 申請人:中興通訊股份有限公司