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