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