本發(fā)明實施例涉及仿真處理技術領域,尤其涉及一種實現(xiàn)處理器仿真核的仿真方法及裝置。
背景技術:
處理器仿真核虛擬運行系統(tǒng)是能夠對嵌入式硬件系統(tǒng)進行完整模擬的軟件系統(tǒng)。用戶可以在該系統(tǒng)上模擬運行嵌入式軟件,無需相應的硬件即可對嵌入式軟件進行測試與調試。通過使用本系統(tǒng),用戶不僅可以極大地縮短嵌入式軟件研制周期,而且能夠避免高昂的輔助測試硬件研制費用、極大地降低系統(tǒng)成本。本系統(tǒng)可以廣泛應用于航空、航天、武器裝備、汽車、機器人、工業(yè)控制等嵌入式系統(tǒng)開發(fā)領域,提升這些行業(yè)的勞動生產效率、降低成本、增強產品的競爭能力。
現(xiàn)有技術中,在利用處理器仿真核虛擬運行系統(tǒng)進行仿真時,調試操作時的靈活性差。
技術實現(xiàn)要素:
本發(fā)明提供一種實現(xiàn)處理器仿真核的仿真方法及裝置,以提高仿真過程的靈活性。
第一方面,本發(fā)明實施例提供了一種實現(xiàn)處理器仿真核的仿真方法,該方法包括:
s1.根據目標仿真程序獲取程序計數(shù)器值;
s2.根據所述程序計數(shù)器值從存儲器中獲取仿真指令;
s3.如果所述仿真指令為斷點指令,則根據斷點執(zhí)行類型和所述仿真核的仿真狀態(tài)進行斷點處理;
s4.所述仿真核將運行狀態(tài)切換到預設運行狀態(tài);
s5.如果所述仿真指令為非斷點指令,則執(zhí)行所述仿真指令,返回執(zhí)行步驟s1,直至獲得仿真結果。
進一步地,如果所述仿真指令為斷點指令,則根據斷點執(zhí)行類型和所述仿真核的仿真狀態(tài)進行斷點處理,包括:
如果當前執(zhí)行的代碼行為非斷點指令,則配置至少一個斷點指令,將所述仿真核的仿真狀態(tài)設置為連續(xù)狀態(tài);設置初始程序計數(shù)器值為當前行,啟動所述仿真核;
如果當前執(zhí)行的代碼行為斷點指令,則設置所述仿真核狀態(tài)為單步狀態(tài),設置初始程序計數(shù)器值為當前行,啟動所述仿真核,配置至少一個斷點指令,將所述仿真核的仿真狀態(tài)設置為連續(xù)狀態(tài),設置初始程序計數(shù)器值為當前行,啟動所述仿真核;
恢復所述至少一個斷點指令為原指令。
進一步地,如果所述仿真指令為斷點指令,則根據斷點執(zhí)行類型和所述仿真核的仿真狀態(tài)進行斷點處理,包括:
如果當前執(zhí)行的代碼行為非斷點指令,則配置至少一個斷點指令,將所述仿真核的仿真狀態(tài)設置為單步狀態(tài);設置初始程序計數(shù)器值為當前行,啟動所述仿真核;
如果當前執(zhí)行的代碼行為斷點指令,則設置所述仿真核狀態(tài)為單步狀態(tài),設置初始程序計數(shù)器值為當前行,啟動所述仿真核;
恢復所述至少一個斷點指令為原指令。
進一步地,所述配置至少一個斷點指令,包括:
通過調試工具gdb和仿真核對斷點指令進行設置。
進一步地,所述根據所述程序計數(shù)器值從存儲器中獲取仿真指令,包括:
根據所述程序計數(shù)器值從存儲器中獲取二進制指令;
判斷仿真過程是否出現(xiàn)異常;
若沒有出現(xiàn)異常,則對所述二進制指令進行譯碼,得到仿真指令。
第二方面,本發(fā)明實施例還提供了一種實現(xiàn)處理器仿真核的仿真裝置,該裝置包括:
程序計數(shù)器值獲取模塊,用于根據目標仿真程序獲取程序計數(shù)器值;
仿真指令獲取模塊,用于根據所述程序計數(shù)器值從存儲器中獲取仿真指令;
斷點處理模塊,用于當所述仿真指令為斷點指令時,根據斷點執(zhí)行類型和所述仿真核的仿真狀態(tài)進行斷點處理;
運行狀態(tài)切換模塊,用于所述仿真核將運行狀態(tài)切換到預設運行狀態(tài);
仿真指令執(zhí)行模塊,用于當所述仿真指令為非斷點指令時,執(zhí)行所述仿真指令。
進一步地,所述斷點處理模塊,還用于:
如果當前執(zhí)行的代碼行為非斷點指令,則配置至少一個斷點指令,將所述仿真核的仿真狀態(tài)設置為連續(xù)狀態(tài);設置初始程序計數(shù)器值為當前行,啟動所述仿真核;
如果當前執(zhí)行的代碼行為斷點指令,則設置所述仿真核狀態(tài)為單步狀態(tài),設置初始程序計數(shù)器值為當前行,啟動所述仿真核,配置至少一個斷點指令,將所述仿真核的仿真狀態(tài)設置為連續(xù)狀態(tài),設置初始程序計數(shù)器值為當前行,啟動所述仿真核;
恢復所述至少一個斷點指令為原指令。
進一步地,所述斷點處理模塊,還用于:
如果當前執(zhí)行的代碼行為非斷點指令,則配置至少一個斷點指令,將所述仿真核的仿真狀態(tài)設置為單步狀態(tài);設置初始程序計數(shù)器值為當前行,啟動所述仿真核;
如果當前執(zhí)行的代碼行為斷點指令,則設置所述仿真核狀態(tài)為單步狀態(tài),設置初始程序計數(shù)器值為當前行,啟動所述仿真核;
恢復所述至少一個斷點指令為原指令。
進一步地,所述斷點處理模塊,還用于:
通過調試工具gdb和仿真核對斷點指令進行設置。
進一步地,所述仿真指令獲取模塊,還用于:
根據所述程序計數(shù)器值從存儲器中獲取二進制指令;
判斷仿真過程是否出現(xiàn)異常;
若沒有出現(xiàn)異常,則對所述二進制指令進行譯碼,得到仿真指令。
本發(fā)明實施例,首先根據目標仿真程序獲取程序計數(shù)器值,然后根據程序計數(shù)器值從存儲器中獲取仿真指令,如果仿真指令為斷點指令,則根據斷點執(zhí)行類型和仿真核的仿真狀態(tài)進行斷點處理,然后仿真核將運行狀態(tài)切換到預設運行狀態(tài),如果仿真指令為非斷點指令,則執(zhí)行仿真指令,直至獲得仿真結果。現(xiàn)有技術中,在利用處理器仿真核虛擬運行系統(tǒng)進行仿真時,需要整個程序執(zhí)行完成后才可以進行調試,使得調試操作時的靈活性差。本申請中,在仿真程序中加入斷點指令,程序的調試可以分段處理,從而提高仿真過程的靈活性。
附圖說明
圖1是本發(fā)明實施例一中的一種實現(xiàn)處理器仿真核的仿真方法的流程圖;
圖2是本發(fā)明實施例二中的一種實現(xiàn)處理器仿真核的仿真裝置的結構示意圖。
具體實施方式
下面結合附圖和實施例對本發(fā)明作進一步的詳細說明??梢岳斫獾氖?,此處所描述的具體實施例僅僅用于解釋本發(fā)明,而非對本發(fā)明的限定。另外還需要說明的是,為了便于描述,附圖中僅示出了與本發(fā)明相關的部分而非全部結構。
實施例一
圖1為本發(fā)明實施例一提供的一種實現(xiàn)處理器仿真核的仿真方法的流程圖,本實施例可適用于利用仿真核對程序進行仿真的情況,該方法可以由服務器來執(zhí)行,如圖1所示,該方法具體包括如下步驟:
s1,根據目標仿真程序獲取程序計數(shù)器值。
其中,程序計數(shù)器(programcounter,pc)可以用于存放指令的地址。本實施例中,目標程序執(zhí)行時,pc的初始值為目標程序第一條指令的地址,在順序執(zhí)行時,服務器首先按照pc所指的指令地址從內存中取出一條指令,然后分析和執(zhí)行該指令,同時pc值指向下一條將要執(zhí)行的指令。
其中,pc值的更新需按照流水線的結構進行更新。流水線的結構可以包括一級、三級、五級和七級等。示例性的,以三級流水線結構為例,三級流水線中的存儲變量包括取指段、譯碼段和執(zhí)行段。仿真中在每次執(zhí)行指令之前,需要更新流水線,更新時需要考慮如下兩種情況。
當流水線處于正常情況下時,每次執(zhí)行指令之前,需要順序的填充流水線。填充流水線時,首先,pc值向前移動4個字節(jié),指向下一條進入流水線的指令的地址;然后,當前執(zhí)行指令的地址值也會前移4個字節(jié),取得下一條需要執(zhí)行的指令,同時,當前流水線中處于譯碼階段的指令會變成上次流水線中處于取指階段的指令;最后,取指段將會從內存中取得新的指令,填充進流水線。
當流水線被阻斷后,需要重新填充流水線。即已有流水線中的內容都要被沖刷掉,需要重新從當前的程序計數(shù)器值處取指,然后順序的取指3次,順序填進流水線,形成新的流水線結構。
可選的,在調整程序計數(shù)器值的時候,需要分別考慮如下幾種情況:
當仿真指令為跳轉指令時,程序計數(shù)器值應該等于當前的程序計數(shù)器值加上偏移字段。而且,下一次執(zhí)行指令之前需要重新刷新流水線。
當仿真指令是中斷指令,且中斷未發(fā)生在斷點指令。中斷產生后,程序將會到新的地址處取指、執(zhí)行,因此,需要更改程序計數(shù)器值。但是,在中斷處理完之后,需要返回繼續(xù)中斷產生時的指令地址。
當仿真指令是中斷指令,且中斷發(fā)生在斷點指令上。中斷返回時,返回至pc值-8所指向的地址,而不是pc值-4指向的地址。
s2,根據程序計數(shù)器值從存儲器中獲取仿真指令。
服務器根據程序計數(shù)器值指向的地址從存儲器中獲取仿真指令。優(yōu)選的,根據程序計數(shù)器值從存儲器中獲取仿真指令的過程可以是,根據程序計數(shù)器值從存儲器中獲取二進制指令,判斷仿真過程是否出現(xiàn)異常,若沒有出現(xiàn)異常,則對二進制指令進行譯碼,得到仿真指令。其中,譯碼的過程可以是對二進制指令進行解析的過程。
可選的,若仿真過程有異常產生,仿真核切換至異常模式。切換至異常模式的方式包括:切換模式、切換寄存器及切換指定模式pc值。當異常處理完成后,仿真核返回原仿真過程,重新獲取pc值繼續(xù)仿真。
可選的,若異常為中斷,仿真核切換至中斷模式。當中斷處理完成后,則返回中斷,仿真核繼續(xù)從中斷的地方開始仿真。
s3,如果仿真指令為斷點指令,則根據斷點執(zhí)行類型和仿真核的仿真狀態(tài)進行斷點處理。
其中,斷點指令可以是停止仿真流程的指令。斷點的執(zhí)行類型可以包括連續(xù)執(zhí)行和單步執(zhí)行。程序中斷點指令是用戶根據仿真需要將程序中某些位置的指令替換為斷點指令而來的。當譯碼得到的仿真指令為斷點指令時,仿真流程被標記為“停止”狀態(tài),退出本次仿真流程。同時,根據斷點的執(zhí)行類型和仿真核的仿真狀態(tài)進行斷點處理。
優(yōu)選的,根據斷點執(zhí)行類型和仿真核的仿真狀態(tài)進行斷點處理的方法可以包括如下兩種情況。
當斷點執(zhí)行類型為連續(xù)執(zhí)行時,如果當前執(zhí)行的代碼行為非斷點指令,則配置至少一個斷點指令,將仿真核的仿真狀態(tài)設置為連續(xù)狀態(tài);設置初始程序計數(shù)器值為當前行,啟動仿真核。如果當前執(zhí)行的代碼行為斷點指令,則設置仿真核狀態(tài)為單步狀態(tài),設置初始程序計數(shù)器值為當前行,啟動仿真核,配置至少一個斷點指令,將仿真核的仿真狀態(tài)設置為連續(xù)狀態(tài),設置初始程序計數(shù)器值為當前行,啟動仿真核?;謴椭辽僖粋€斷點指令為原指令。
當斷點執(zhí)行類型為單步執(zhí)行時,如果當前執(zhí)行的代碼行為非斷點指令,則配置至少一個斷點指令,將仿真核的仿真狀態(tài)設置為單步狀態(tài);設置初始程序計數(shù)器值為當前行,啟動仿真核。如果當前執(zhí)行的代碼行為斷點指令,則設置仿真核狀態(tài)為單步狀態(tài),設置初始程序計數(shù)器值為當前行,啟動仿真核?;謴椭辽僖粋€斷點指令為原指令。
優(yōu)選的,配置至少一個斷點指令的方式可以是,通過調試工具gdb和仿真核對斷點指令進行設置。
s4,仿真核將運行狀態(tài)切換到預設運行狀態(tài)。
其中,運行狀態(tài)可以包括連續(xù)運行狀態(tài)和單步執(zhí)行狀態(tài)。用戶可以根據仿真需求切換運行狀態(tài)。
s5,如果仿真指令為非斷點指令,則執(zhí)行仿真指令,返回執(zhí)行步驟s1,直至獲得仿真結果。
其中,非斷點指令可以包括跳轉指令、訪存指令和訪寄存器指令等。當譯碼結果是跳轉指令時,若不跳轉,則按照當前的順序進行執(zhí)行;若跳轉,當前程序計數(shù)器值需要加偏移字段得到跳轉后的程序計數(shù)器值。當譯碼結果是訪存指令時,則訪問指令的內存空間。當譯碼結果為訪問寄存器指令,則訪問指定寄存器。當仿真核執(zhí)行完仿真指令后,則返回s1,重新獲取程序計數(shù)器值,循環(huán)進行取指-譯碼-執(zhí)行的過程,直到獲得程序的仿真結果。
本實施例的技術方案,首先根據目標仿真程序獲取程序計數(shù)器值,然后根據程序計數(shù)器值從存儲器中獲取仿真指令,如果仿真指令為斷點指令,則根據斷點執(zhí)行類型和仿真核的仿真狀態(tài)進行斷點處理,然后仿真核將運行狀態(tài)切換到預設運行狀態(tài),如果仿真指令為非斷點指令,則執(zhí)行仿真指令,直至獲得仿真結果。現(xiàn)有技術中,在利用處理器仿真核虛擬運行系統(tǒng)進行仿真時,需要整個程序執(zhí)行完成后才可以進行調試,使得調試操作時的靈活性差。本申請中,在仿真程序中加入斷點指令,程序的調試可以分段處理,從而提高仿真過程的靈活性。
實施例二
圖2為本發(fā)明實施例二提供的一種實現(xiàn)處理器仿真核的仿真裝置的結構示意圖。如圖2所示,該裝置包括:程序計數(shù)器值獲取模塊210,仿真指令獲取模塊220,斷點處理模塊230,運行狀態(tài)切換模塊240和仿真指令執(zhí)行模塊250。
程序計數(shù)器值獲取模塊210,用于根據目標仿真程序獲取程序計數(shù)器值;
仿真指令獲取模塊220,用于根據程序計數(shù)器值從存儲器中獲取仿真指令;
斷點處理模塊230,用于當仿真指令為斷點指令時,根據斷點執(zhí)行類型和仿真核的仿真狀態(tài)進行斷點處理;
運行狀態(tài)切換模塊240,用于仿真核將運行狀態(tài)切換到預設運行狀態(tài);
仿真指令執(zhí)行模塊250,用于當仿真指令為非斷點指令時,執(zhí)行仿真指令。
進一步地,斷點處理模塊230,還用于:
如果當前執(zhí)行的代碼行為非斷點指令,則配置至少一個斷點指令,將仿真核的仿真狀態(tài)設置為連續(xù)狀態(tài);設置初始程序計數(shù)器值為當前行,啟動仿真核;
如果當前執(zhí)行的代碼行為斷點指令,則設置仿真核狀態(tài)為單步狀態(tài),設置初始程序計數(shù)器值為當前行,啟動仿真核,配置至少一個斷點指令,將仿真核的仿真狀態(tài)設置為連續(xù)狀態(tài),設置初始程序計數(shù)器值為當前行,啟動仿真核;
恢復至少一個斷點指令為原指令。
進一步地,斷點處理模塊230,還用于:
如果當前執(zhí)行的代碼行為非斷點指令,則配置至少一個斷點指令,將仿真核的仿真狀態(tài)設置為單步狀態(tài);設置初始程序計數(shù)器值為當前行,啟動仿真核;
如果當前執(zhí)行的代碼行為斷點指令,則設置仿真核狀態(tài)為單步狀態(tài),設置初始程序計數(shù)器值為當前行,啟動仿真核;
恢復至少一個斷點指令為原指令。
進一步地,斷點處理模塊230,還用于:
通過調試工具gdb和仿真核對斷點指令進行設置。
進一步地,仿真指令獲取模塊220,還用于:
根據程序計數(shù)器值從存儲器中獲取二進制指令;
判斷仿真過程是否出現(xiàn)異常;
若沒有出現(xiàn)異常,則對二進制指令進行譯碼,得到仿真指令。
上述產品可執(zhí)行本發(fā)明任意實施例所提供的方法,具備執(zhí)行方法相應的功能模塊和有益效果。
注意,上述僅為本發(fā)明的較佳實施例及所運用技術原理。本領域技術人員會理解,本發(fā)明不限于這里所述的特定實施例,對本領域技術人員來說能夠進行各種明顯的變化、重新調整和替代而不會脫離本發(fā)明的保護范圍。因此,雖然通過以上實施例對本發(fā)明進行了較為詳細的說明,但是本發(fā)明不僅僅限于以上實施例,在不脫離本發(fā)明構思的情況下,還可以包括更多其他等效實施例,而本發(fā)明的范圍由所附的權利要求范圍決定。