SPARC V8處理器斷點(diǎn)調(diào)試的設(shè)計(jì)與實(shí)現(xiàn)研究
在嵌入式的交叉調(diào)試過程中,開發(fā)人員的調(diào)試手段有斷點(diǎn)、觸發(fā)和跟蹤三種,其中斷點(diǎn)是經(jīng)常使用的調(diào)試手段。開發(fā)人員使用斷點(diǎn)控制所要調(diào)試程序的運(yùn)行和停止,使程序運(yùn)行到自己想要調(diào)試的位置,通過觀察在斷點(diǎn)處的程序變量以及寄存器和存儲器的值,檢測所調(diào)試的程序運(yùn)行是否正確。
本文引用地址:http://butianyuan.cn/article/201706/348387.htm斷點(diǎn)按照其實(shí)現(xiàn)方法分為軟件斷點(diǎn)和硬件斷點(diǎn),本文研究對象是軟件斷點(diǎn)調(diào)試。對于不同的嵌入式處理器或調(diào)試工具而言,軟件斷點(diǎn)的實(shí)現(xiàn)方法基本一樣,都是通過在所要設(shè)置斷點(diǎn)的地址上將其內(nèi)存內(nèi)容替換為指令陷阱,當(dāng)這個(gè)指令被執(zhí)行時(shí)就會產(chǎn)生軟件中斷,使處理器進(jìn)入調(diào)試狀態(tài)(或監(jiān)控狀態(tài))。
隨著嵌入式計(jì)算機(jī)應(yīng)用的發(fā)展,目前大部分處理器都內(nèi)嵌有高速緩存(Cache)和內(nèi)存管理單元(MMU),并由Cache、主存和磁盤構(gòu)成三級存儲系統(tǒng)。交叉調(diào)試中斷點(diǎn)的實(shí)現(xiàn)與處理器中存儲系統(tǒng)的構(gòu)成有緊密的關(guān)系。MMU的存在使設(shè)置/移除斷點(diǎn)時(shí)要考慮斷點(diǎn)地址是虛擬地址還是物理地址,如果是虛擬地址則要進(jìn)行虛實(shí)地址的轉(zhuǎn)換。Cache的存在使設(shè)置/移除斷點(diǎn)時(shí)要考慮Cache一致性的問題。如果所要設(shè)置的斷點(diǎn)地址被Cache命中,則當(dāng)用特定指令替換斷點(diǎn)地址上的內(nèi)存內(nèi)容來實(shí)現(xiàn)斷點(diǎn)功能時(shí),就會使主存上的內(nèi)容與Cache對應(yīng)單元中的內(nèi)容不一致,從而造成Cache與主存的不一致問題。這些問題的存在直接影響斷點(diǎn)功能的正確實(shí)現(xiàn)。
斷點(diǎn)功能是交叉調(diào)試器的重要組成部分,在開發(fā)交叉調(diào)試器的過程中不可避免地會遇到上述問題。本文分析了一款具有Cache和MMU的SPARC V8處理器,主要研究其分級存儲系統(tǒng)對實(shí)現(xiàn)斷點(diǎn)功能的影響,提出了行之有效的解決辦法,并應(yīng)用到該處理器的調(diào)試工具中。
1 Cache和MMU引起的斷點(diǎn)調(diào)試問題
1.1 Cache引起的斷點(diǎn)調(diào)試問題
Cache是一種高速緩沖存儲器,在存儲系統(tǒng)的層次結(jié)構(gòu)中引入Cache是為了解決CPU與主存之間的速度差異,以提高CPU工作效率。通過在主存和高速CPU之間設(shè)置一個(gè)小容量的高速存儲器,并在其中儲存一份CPU最近訪問的主存儲器“內(nèi)容拷貝”,使CPU在重復(fù)讀取這部分內(nèi)容時(shí)可以通過訪問Cache完成數(shù)據(jù)的讀寫。由于Cache的速度快于主存的速度,從而縮短了數(shù)據(jù)讀寫的等待時(shí)間,系統(tǒng)的整體性能也得到提高。但同時(shí)它又帶來了一些其他問題,如本文提到的一致性問題。
Cache由控制部分和存儲器部分組成,如圖1所示,虛框內(nèi)為控制部分??刂撇糠謱碜訡PU的數(shù)據(jù)讀寫請求傳遞給存儲器進(jìn)行相應(yīng)處理。控制部分的主要功能是判斷要訪問的數(shù)據(jù)是否在Cache中命中。命中時(shí)進(jìn)行Cache的尋址;未命中則按照替換策略將主存中的數(shù)據(jù)塊載入到Cache存儲器對應(yīng)的數(shù)據(jù)塊中。
在某個(gè)內(nèi)存地址上設(shè)置軟件斷點(diǎn)時(shí),用軟中斷指令替換設(shè)置斷點(diǎn)處的內(nèi)存指令后,還要考慮該地址是否曾Cache命中,否則就會造成Cache不一致的問題。Cache數(shù)據(jù)與主存不一致是指:在采用Cache的系統(tǒng)中,同樣一個(gè)數(shù)據(jù)可能存在于Cache中,也存在于主存中,兩者數(shù)據(jù)相同則具有一致性,數(shù)據(jù)不相同就叫做不一致性。如果不能保證數(shù)據(jù)的一致性,則程序的運(yùn)行就會出錯(cuò)。因此實(shí)現(xiàn)軟件斷點(diǎn)必須解決Cache一致性問題。
1.2 MMU引起的斷點(diǎn)調(diào)試問題
現(xiàn)代計(jì)算機(jī)系統(tǒng)普遍采用了分級存儲與虛擬存儲技術(shù)相結(jié)合的存儲管理體系。虛擬存儲是在存儲層次結(jié)構(gòu)基礎(chǔ)上,通過存儲器管理部件MMU進(jìn)行虛擬地址和物理地址自動(dòng)變換而實(shí)現(xiàn)的,對每個(gè)編程者是透明的。MMU主要完成以下工作:(1)虛擬地址到物理地址的映射;(2)存儲器訪問權(quán)限的控制;(3)設(shè)置虛擬存儲空間的Cache特性。
在進(jìn)行虛實(shí)地址轉(zhuǎn)換時(shí),處理器發(fā)出虛擬地址給MMU并被鎖存于一個(gè)內(nèi)部寄存器中。該虛擬地址與TLB中的虛擬地址標(biāo)志進(jìn)行比較。如果匹配,則TLB命中,物理地址可以直接產(chǎn)生;如果不匹配,則進(jìn)行TLB行未命中處理,這時(shí)MMU會產(chǎn)生一個(gè)Table walk的動(dòng)作,從CPU接管地址和數(shù)據(jù)總線,通過到主存查詢頁表的方法實(shí)現(xiàn)從虛擬地址到物理地址的轉(zhuǎn)換,同時(shí)通過替換算法將新的地址信息存于TLB中[1][5]。
啟用MMU存儲管理單元的處理器上運(yùn)行的程序采用虛擬地址,調(diào)試時(shí)設(shè)置的斷點(diǎn)地址用的是程序中的地址,也即虛擬地址。而CPU訪問數(shù)據(jù)或讀取指令的地址為物理地址。通常虛擬地址和物理地址不相同,調(diào)試器需用軟件實(shí)現(xiàn)從虛擬地址到物理地址的轉(zhuǎn)換,才能使斷點(diǎn)設(shè)置在對應(yīng)的物理地址上,實(shí)現(xiàn)斷點(diǎn)調(diào)試的功能。
2 存在問題的解決方法
本文以一款SPARC V8結(jié)構(gòu)的處理器為例,詳細(xì)分析如何解決層次存儲系統(tǒng)對斷點(diǎn)實(shí)現(xiàn)所產(chǎn)生的影響。該處理器包含了一個(gè)32位的整數(shù)單元(IU)、Cache子系統(tǒng)、SRMMU(SPARC reference MMU)、AMBA總線、存儲控制器、UART和Watchdog等。
在該處理器的存儲系統(tǒng)中,采用了分離的指令Cache和數(shù)據(jù)Cache,即哈佛結(jié)構(gòu)。哈佛結(jié)構(gòu)消除了取數(shù)和取指之間的競爭,提高了Cache的命中率和處理器的性能。處理器存儲系統(tǒng)的組織方式為虛擬地址Cache,如圖2所示。在命中時(shí)可以省去MMU虛實(shí)地址轉(zhuǎn)換的時(shí)間。但虛擬Cache可能會導(dǎo)致同一物理地址有不同的虛擬地址來訪問,并且當(dāng)系統(tǒng)進(jìn)程切換時(shí),同一虛擬地址可以指向不同的物理地址。因此在一個(gè)地址標(biāo)識(Tag)中要增加一個(gè)進(jìn)程標(biāo)識(context number)。這樣多個(gè)進(jìn)程的數(shù)據(jù)可以放在一個(gè)Cache中,由進(jìn)程標(biāo)識來確定Cache中各行的數(shù)據(jù)是屬于哪個(gè)進(jìn)程。
2.1 CACHE一致性問題的解決方法
用軟中斷指令替換設(shè)置斷點(diǎn)處的內(nèi)存指令實(shí)現(xiàn)斷點(diǎn)調(diào)試功能的同時(shí),會造成Cache一致性的問題。雖然關(guān)掉Cache就可以解決一致性的問題,并且能夠減小程序開發(fā)的復(fù)雜度,但是一個(gè)高性能的系統(tǒng)是需要Cache的,關(guān)掉Cache會大大降低系統(tǒng)的性能。因此,可以采用以下方法解決設(shè)置/移除斷點(diǎn)時(shí)Cache一致性的問題:
(1)利用MMU將可能出現(xiàn)一致性問題的存儲區(qū)設(shè)為Cache不能訪問的區(qū)域,即non-cacheable area。這種方法雖然比較保守,完全與Cache的設(shè)計(jì)初衷相悖,但是這種方法最為保險(xiǎn)。
(2)讓存儲此斷點(diǎn)地址數(shù)據(jù)的Cache存儲單元失效,使CPU重新讀取主存的內(nèi)容來更新Cache,保證Cache中的內(nèi)容與主存的內(nèi)容一致,以此來解決Cache一致性的問題。顯然第二種方法效率比第一種高,能夠發(fā)揮Cache的處理能力。
在本文討論的SPARC架構(gòu)處理器中,可以利用Cache Tag寄存器實(shí)現(xiàn)解決Cache一致性問題的第二種方案。通過檢測Cache Tag寄存器,判斷設(shè)置/移除斷點(diǎn)的地址是否曾Cache命中。如果Cache命中,則利用Cache Tag寄存器中的Valid有效位將存儲此地址數(shù)據(jù)的Cache行置為無效;如果沒有命中,則不對Cache做任何處理。
在該處理器中,Cache可配置的模式有直接映射模式和2~4組相聯(lián)的多組映射模式;可選的替換算法是LRU、LRR和偽隨機(jī)。這里以直接相聯(lián)映射模式的指令緩存ICache為例,簡述如何利用Cache Tag寄存器解決設(shè)置/移除斷點(diǎn)時(shí)Cache的一致性問題。
在直接相聯(lián)映射方式中,存儲器中的每個(gè)區(qū)大小與Cache存儲器的大小相等,區(qū)中的行與Cache存儲器中的行一一對應(yīng)。Cache分為Tag部分和Data部分,Tag部分用來存儲標(biāo)志位,與內(nèi)存地址的標(biāo)志位比較來判斷Cache是否命中;Data部分用來存儲與地址相對應(yīng)的數(shù)據(jù)。如圖3所示,ITag寄存器中的Valid[7:0]表示IData中相應(yīng)的word是否有效;W0~W7表示IData中一行有8個(gè)word。當(dāng)在某個(gè)地址設(shè)置/移除斷點(diǎn)時(shí),根據(jù)這個(gè)地址訪問相對應(yīng)的ITag寄存器,找到相對應(yīng)的行,并將該行的ATAG位及有效位Valid取出。將ATAG位與地址中的Tag位進(jìn)行比較,如果兩者相等且對應(yīng)的有效位為1,則表明訪問的指令/數(shù)據(jù)在Data中,即Cache命中。Cache命中時(shí)要將該有效位清0,使Cache中的該行失效,然后再進(jìn)行內(nèi)存指令的替換。如果不相等或有效位為0,則訪問的數(shù)據(jù)不在Data中,即Cache未命中,這時(shí)就直接進(jìn)行內(nèi)存指令的替換。
本文通過使斷點(diǎn)地址命中的Cache失效的方法,使處理器訪問斷點(diǎn)地址時(shí)訪問主存,從而解決了斷點(diǎn)調(diào)試中Cache的一致性問題,并且最大程度地發(fā)揮了Cache的作用。
2.2 MMU地址轉(zhuǎn)換問題的解決辦法
處理器啟用MMU后,在調(diào)試器中設(shè)置軟件斷點(diǎn)產(chǎn)生了虛實(shí)地址轉(zhuǎn)換問題。該問題的解決方法就是根據(jù)MMU的工作原理,在調(diào)試器中實(shí)現(xiàn)虛擬地址與物理地址的轉(zhuǎn)換功能,取得虛擬地址對應(yīng)的物理地址,并在該地址設(shè)置軟中斷指令,實(shí)現(xiàn)斷點(diǎn)調(diào)試的功能。
本文研究的處理器選用SRMMU來管理內(nèi)存。SRMMU采用頁式存儲管理,主存中的3級頁表用來存儲全部的地址轉(zhuǎn)換信息,通過頁表中頁表項(xiàng)的最低兩位ET來判斷是否要繼續(xù)查找頁表。SRMMU可實(shí)現(xiàn)不同級數(shù)的頁表的訪問,最少1級,最多4級[1]。
SRMMU中虛擬地址到物理地址的轉(zhuǎn)換過程如圖4所示。虛擬地址Vaddr為所要設(shè)置/移除的斷點(diǎn)地址;CTP和CTXNR都是SRMMU的寄存器,其中CTP為進(jìn)程表的首地址,CTXNR為進(jìn)程號;頁表中的存儲項(xiàng)如為PTD(Page Table Descriptors),則PTD是指向下一級頁表的指針,如為PTE(Page Table Entry),則PTE是實(shí)地址的頁號。在查找過程中由CTP和CTXNR得到頁表的入口地址,讀取該地址的內(nèi)存內(nèi)容判斷是PTD還是PTE。如果得到PTE則不需再查找,這樣每頁有4GB的尋址空間;如果在level-1找到PTE,,則每頁有16MB的尋址空間;如果在level-2找到PTE,則每頁有256KB的尋址空間;如果在level-3找到PTE,則每頁有4KB的尋址空間;如果找不到PTE,則提示錯(cuò)誤。得到PTE后,由PTE中的Physical Page Number加上虛擬地址Vaddr的offset偏移地址,就可以得出實(shí)際的物理地址。
在實(shí)現(xiàn)斷點(diǎn)調(diào)試功能時(shí),本文依據(jù)上述SRMMU虛實(shí)地址的轉(zhuǎn)換原理,實(shí)現(xiàn)了一個(gè)軟件SRMMU模塊,用于仿真處理器硬件SRMMU的頁表查詢處理過程,在調(diào)試器中實(shí)現(xiàn)了虛實(shí)地址轉(zhuǎn)換的功能。通過該方法,本文解決了斷點(diǎn)調(diào)試中MMU產(chǎn)生的虛實(shí)地址轉(zhuǎn)換問題,使設(shè)計(jì)的調(diào)試器可以正確處理用虛擬地址設(shè)置的斷點(diǎn)。
為了提高存儲器的速度和存儲容量,目前大部分處理器中,既有MMU也有Cache。本文通過對Cache的工作原理和MMU執(zhí)行機(jī)制的詳細(xì)研究,分析了開發(fā)人員在實(shí)現(xiàn)斷點(diǎn)功能時(shí)所遇到的Cache一致性和MMU的地址轉(zhuǎn)換等問題,并以一款SPARC V8處理器為例,剖析了軟件斷點(diǎn)的實(shí)現(xiàn)方法,并成功應(yīng)用到該處理器的調(diào)試器設(shè)計(jì)中。本文雖然僅討論SPARC V8架構(gòu)的存儲系統(tǒng)設(shè)計(jì)對軟件斷點(diǎn)功能實(shí)現(xiàn)的影響,但對于研究其他采用層次存儲系統(tǒng)架構(gòu)處理器的軟件斷點(diǎn)的設(shè)計(jì)實(shí)現(xiàn)也具有一定的參考價(jià)值。
評論