調(diào)試是軟件開發(fā)的一個重要組成部分,通常是最消耗時間的(也因此非常昂貴)。錯誤可以是很難察覺、重現(xiàn)和修復(fù)的,而且也難以預(yù)料解決一個缺陷需要多長的時間。
在產(chǎn)品交付給客戶后,解決問題的成本顯著增加。在很多情況下,一個產(chǎn)品的銷售只有一個很小的時間窗口,如果產(chǎn)品晚了,它可能錯過市場的機會。因此,對于任何開發(fā)人員,系統(tǒng)所提供的調(diào)試工具是要考慮的一個重要因素。
許多實用ARM處理器的嵌入式系統(tǒng)只有有限的輸入/輸出設(shè)備。這意味著可能無法使用傳統(tǒng)的臺式機的調(diào)試方法(如實用printf()函數(shù))。
像很多IoT設(shè)備,都沒有屏顯或者串口。
在過去,在這樣的系統(tǒng)中,開發(fā)人員可能會使用昂貴的硬件工具,如邏輯分析儀和示波器來觀察程序的行為。
本書所描述的處理器是有高速緩存的一個復(fù)雜的片上系統(tǒng),包含內(nèi)存和許多其他功能模塊。在片外也許無法看到處理器的內(nèi)部信號,因此無法通過連接邏輯分析儀等設(shè)備來監(jiān)測它的行為。
出于這個原因,ARM系統(tǒng)一般包含專門的硬件,以便為調(diào)試提供廣泛的控制和觀測模塊。
ARM調(diào)試硬件
Cortex-A系列處理器提供的硬件功能可以使調(diào)試工具提供可以明顯提高處理器控制活動和非入侵性地收集大量的有關(guān)程序執(zhí)行數(shù)據(jù)的水平。我們可以將硬件的功能分為兩類:入侵性和非入侵性。
入侵性調(diào)試提供了能夠停止程序并單步執(zhí)行的工具(在C源代碼或通過匯編語言指令單步執(zhí)行),它可以通過一個外部設(shè)備連接到處理器芯片的JTAG引腳或(較少見)系統(tǒng)ROM中的調(diào)試監(jiān)視代碼。
JTAG是Joint Test Action Group的簡寫,是IEEE 1149.1規(guī)范,它最初設(shè)計用來測試電路板上的電子設(shè)備,但現(xiàn)在廣泛用于連接處理器調(diào)試。
一個典型的JTAG連接有5個引腳:2個輸入、1個時鐘、1個復(fù)位和1個輸出。
調(diào)試器提供了控制執(zhí)行程序的能力,使我們能夠運行到某一點的代碼時暫停處理器、單步執(zhí)行代碼和繼續(xù)執(zhí)行,也可以在指定的指令上設(shè)置斷點(當(dāng)處理器到達這條指令時,讓調(diào)試器控制它)。這些工作可以使用兩種不同的方法。
(1)采用BKPT指令替代需要停止的指令可以產(chǎn)生軟件斷點。顯然,這只能用于存儲在RAM中的代碼,但優(yōu)點是可以設(shè)置非常多的軟件斷點。該調(diào)試器軟件必須跟蹤記錄放置軟件斷點的位置以及該位置的原始操作碼,這樣當(dāng)希望執(zhí)行該斷點處的指令時,它可以放回原始代碼。
(2)硬件斷點,使用處理器內(nèi)置的比較器,當(dāng)執(zhí)行到指定地址時自動停止執(zhí)行。這可以用在代碼空間中的任何地方,因為它們不需要修改代碼,但硬件只能提供數(shù)量有限的硬件斷點單元(Cortex-A系列通常只有4個)。調(diào)試工具可以支持更復(fù)雜的斷點(例如在一個地址范圍內(nèi)的任意指令,或僅當(dāng)指定序列事件發(fā)生或硬件在指定的狀態(tài)時停止任意指令)。數(shù)據(jù)觀察點讓調(diào)試器可以控制當(dāng)一個特定的數(shù)據(jù)地址或地址范圍被讀取或?qū)懭朐L問時,產(chǎn)生調(diào)試控制。這些也可以稱為數(shù)據(jù)斷點。
調(diào)試事件是指進程的某些部分正在被調(diào)試導(dǎo)致系統(tǒng)通知調(diào)試器的事件。調(diào)試事件可以是同步或異步的,斷點、BKPT指令和觀察點都是同步調(diào)試事件。當(dāng)任何這些事件之一發(fā)生時,該處理器能以以下方式之一響應(yīng)。
● 它可以忽略調(diào)試事件。
● 它可以引發(fā)一個調(diào)試異常。
● 根據(jù)調(diào)試狀態(tài)和控制寄存器(Debug Status and Control Register, DSCR)的設(shè)置,它會進入兩種調(diào)試模式:
? 監(jiān)視調(diào)試模式;
? 停止調(diào)試模式。
上述兩種調(diào)試模式都是侵入式調(diào)試的例子。
(1)停止調(diào)試模式。在停止調(diào)試模式中,一個調(diào)試事件會使處理器進入調(diào)試狀態(tài),該處理器被停止,并從系統(tǒng)的其他部分分離出來。這意味著,調(diào)試器可以顯示處理器所能看到的內(nèi)存,內(nèi)存管理和緩存操作的影響將變得可見。
在調(diào)試狀態(tài)下,處理器從程序計數(shù)器指定的位置停止執(zhí)行指令,并通過外部調(diào)試接口控制,尤其是使用錯誤指令轉(zhuǎn)移寄存器(Debug Instruction Transfer Register, DBGITR),這啟用了外部控制器,例如調(diào)試器來查詢處理器的現(xiàn)場,并控制所有后續(xù)的指令執(zhí)行。處理器和系統(tǒng)狀態(tài)都是可以被修改的,因為處理器已經(jīng)停止,它無法處理任何中斷,直到調(diào)試器重新啟動代碼執(zhí)行。
(2)監(jiān)視調(diào)試模式。在監(jiān)控調(diào)試模式中,調(diào)試事件會產(chǎn)生一個調(diào)試異常,無論是關(guān)于指令的執(zhí)行產(chǎn)生的預(yù)取中止異常,還是數(shù)據(jù)訪問時產(chǎn)生的數(shù)據(jù)中止異常,這些都必須由軟件調(diào)試監(jiān)視器處理。由于處理器仍然在運行,中斷仍然可以被響應(yīng)。
ARM跟蹤硬件
非侵入性調(diào)試(在ARM文檔中通常稱為跟蹤)可以在執(zhí)行時觀察處理器的行為,它可以記錄內(nèi)存訪問的執(zhí)行(包括地址和數(shù)據(jù)),并生成一個程序運行的跟蹤,查看外設(shè)訪問,堆和棧訪問以及變量的改變。
對于許多實時體統(tǒng),**不能使用入侵性調(diào)試的方法。**例如,考慮一個引擎管理系統(tǒng),也許能夠在特定的地方停止處理器,但引擎將繼續(xù)運行,所以將無法做有用的調(diào)試,即使是在不太繁重的實時要求環(huán)境中,跟蹤也是非常有用的。
非侵入性調(diào)試,或稱為“跟蹤”,是一種在不干擾或影響目標系統(tǒng)運行的前提下,觀察和記錄目標系統(tǒng)運行時行為的方法。這種方法特別適用于實時系統(tǒng)或那些不能接受中斷的系統(tǒng)。
侵入式調(diào)試是一種在調(diào)試過程中需要直接干預(yù)和介入目標系統(tǒng)運行的調(diào)試方式。這種調(diào)試方式需要在目標系統(tǒng)的源代碼級別或匯編語言指令中停止程序并逐行執(zhí)行它們。通過使用芯片JTAG引腳連接到內(nèi)核的外部設(shè)備,或者通過調(diào)試監(jiān)控代碼,開發(fā)人員可以實現(xiàn)對目標系統(tǒng)的直接控制和干預(yù)。
侵入式調(diào)試的優(yōu)點在于能夠深入了解目標系統(tǒng)的底層細節(jié)和運行狀態(tài),幫助開發(fā)人員準確地定位和解決問題。但是,這種調(diào)試方式也存在一些缺點。首先,它需要對目標系統(tǒng)進行直接干預(yù)和介入,可能會對系統(tǒng)的正常運行造成干擾或破壞。其次,侵入式調(diào)試需要對目標系統(tǒng)的源代碼或匯編語言指令進行操作,這需要較高的技術(shù)水平和經(jīng)驗,并且可能會引入新的錯誤或問題。
因此,在選擇調(diào)試方式時,需要根據(jù)實際情況進行權(quán)衡和選擇。對于一些復(fù)雜或關(guān)鍵的系統(tǒng),侵入式調(diào)試可能是必要的,但在大多數(shù)情況下,非侵入式調(diào)試或跟蹤可能是更合適的選擇。
通常,跟蹤由連接到處理器的外部硬件模塊提供,這就是所謂的嵌入式跟蹤宏單元(Embedded Trace Macrocell, ETM)或程序跟蹤宏單元(Program Trace Macrocell, PTM),是基于ARM處理器系統(tǒng)的一個可選部分,SoC在設(shè)計時可以去除這個模塊以降低成本。
這個模塊可以觀察(但不影響)處理器的行為,并能監(jiān)視指令的執(zhí)行和數(shù)據(jù)的訪問。
關(guān)于捕獲跟蹤,有兩個主要的問題。
第一個問題與如今非常高的處理器主頻有關(guān),即使幾秒的操作也可能執(zhí)行數(shù)萬億周期。顯然,要查詢?nèi)绱硕嗟?a target="_blank">信息將是非常困難的。
第二個問題是,如今的處理器在一個周期中可能執(zhí)行一個或多個64 bit緩存訪問,要記錄數(shù)據(jù)地址和數(shù)據(jù)值就需要非常大的寬帶。
這就帶來一個的問題,芯片上可能只能提供少數(shù)引腳,并且這些輸出引腳只能用一個比處理器主頻更低的時鐘。如果處理器以速度為1 GHz的時鐘,每個周期生成100 bit的信息,但芯片只能以200MHz的速度輸出4 bit的跟蹤信息。
為了解決這個問題,跟蹤宏單元將嘗試壓縮信息,以減少所需的寬帶。然而,處理這些問題的主要方法是控制跟蹤模塊,以便只收集所選擇的跟蹤信息。
例如,我們可能只跟蹤執(zhí)行流,而不記錄數(shù)據(jù)值,或我們只跟蹤一個特定外設(shè)或特定函數(shù)執(zhí)行的數(shù)據(jù)訪問。
由于處理器的速度和復(fù)雜性,捕獲其所有操作的信息是非常困難的和帶寬密集型的。因此,通常需要采用特定的策略和方法來僅捕獲所需的信息,從而有效地解決調(diào)試和故障排除問題。
此外,將跟蹤信息存儲在芯片的內(nèi)存緩沖區(qū)(嵌入式跟蹤緩沖區(qū)(ETB))是常見的辦法,這將緩解芯片獲取信息的速度問題,但在硅片面積(對應(yīng)芯片的價格)會有額外的成本,并且會限定一個固定的可被捕獲的跟蹤信息量。
B就是buffer
ETB以循環(huán)方式存儲壓縮的跟蹤信息,連續(xù)的捕獲跟蹤信息直到停止。ETB的大小根據(jù)芯片的實現(xiàn)不同而變化,但通常8KB或16KB的緩沖區(qū)就足以容納對幾千行程序的跟蹤。
在程序出現(xiàn)故障時,如果啟動了跟蹤緩沖區(qū),則可以看到部分程序的歷史記錄,通過程序的歷史記錄,很容易通過程序查回去,看看在故障點前發(fā)生了什么。
這對于調(diào)查間歇和實時故障特別有用,而這對傳統(tǒng)的需要停止和啟動處理器執(zhí)行的調(diào)試方法是比較困難的。
使用硬件跟蹤可以顯著地減少尋找故障所需的時間,跟蹤信息精確地顯示執(zhí)行了什么,何時產(chǎn)生的以及訪問了什么數(shù)據(jù)。
這種技術(shù)可以用于生成程序的calltrace,即記錄程序執(zhí)行過程中函數(shù)或方法的調(diào)用序列。
通過calltrace,可以了解在故障點前程序執(zhí)行的具體流程和函數(shù)調(diào)用關(guān)系。這有助于分析問題的根本原因,確定是哪個函數(shù)或方法導(dǎo)致了故障,以及故障是如何產(chǎn)生的。
ARM的CoreSight技術(shù)通過ETM提供了擴展功能,在特定的系統(tǒng)中它的存在和功能是由芯片設(shè)計者定義的。
最近在找一個課程,看看能不能讓我去學(xué)習(xí)一下Verilog的實現(xiàn),到時候有機會的話,可以分享的更加深入一點。
CoreSight提供了一個非常強大的調(diào)試功能,它可以調(diào)試多處理器系統(tǒng)(非對稱和SMP),共享調(diào)試和跟蹤的引腳,在一段跟蹤時間內(nèi),具有對處理器的完全控制。
嵌入式交叉觸發(fā)機制讓工具可以同步控制多個內(nèi)核,例如,當(dāng)一個內(nèi)核遇到一個斷點,也將停止所有其他的內(nèi)核。
商業(yè)的調(diào)試工具可以使用跟蹤數(shù)據(jù)提供諸如處理器寄存器、內(nèi)存及外設(shè)的實時視圖等功能,允許用戶對程序流進行單步向前或向后執(zhí)行。
分析工具可以利用這些數(shù)據(jù)顯示該程序在哪里花費的時間以及存在的性能瓶頸。
代碼覆蓋工具可以使用跟蹤數(shù)據(jù)提供圖探究調(diào)用。
OS信息調(diào)試器可以使用跟蹤信息(在某些情況下,額外的代碼插裝)提供高級別的系統(tǒng)上下文信息。
像DS、勞特巴赫這些其實都是細分賽道,做的很深,國內(nèi)這樣的企業(yè)好少~~~期待。
在這里,我們列出了一些可用的CoreSight組件,并簡要說明其用途。
先整個圖,看著會舒服點
畫的真漂亮哈哈哈
(1)調(diào)試訪問端口(DAP)。
DAP是ARM的CoreSight系統(tǒng)的一個可選部分,不是每個設(shè)備都包含DAP,它使外部調(diào)試器直接訪問系統(tǒng)的內(nèi)存空間,而無須使處理器進入調(diào)試狀態(tài)。在沒有DAP情況下,要讀取或?qū)懭肟赡苄枰{(diào)試器停止處理器,并執(zhí)行加載或存儲指令。DAP提供了一個外部調(diào)試工具來訪問系統(tǒng)中的所有的JTAG掃描鏈(因此可以訪問處理器的所有調(diào)試和跟蹤寄存器)
(2)嵌入式交叉觸發(fā)(ECT)。
ECT模塊是CoreSight的一個組件,可以包含在CoreSight系統(tǒng)中。其目的是將系統(tǒng)中的多個設(shè)備的調(diào)試功能鏈接在一起。例如,我們可以有兩個相互獨立的運行內(nèi)核,在一個內(nèi)核的運行程序上設(shè)置一個斷點時,如果可以在一個內(nèi)核在斷點處停止時,讓另一個內(nèi)核也停止下來(無論當(dāng)前正在執(zhí)行什么指令),那么將對調(diào)試工作非常有幫助。ECT中的交叉觸發(fā)矩陣和接口可以在內(nèi)核和跟蹤宏單元之間傳遞調(diào)試狀態(tài)和控制信息。
(3)AHB跟蹤宏單元。
AMBA AHB跟蹤宏單元可以讓調(diào)試器看到系統(tǒng)內(nèi)存總線上發(fā)生了什么。此信息不是直接從處理器ETM得到的,因為集成的內(nèi)核無法確定這個數(shù)據(jù)來自緩存還是外部存儲器。
(4)CoreSight串行線。
CoreSight串行線調(diào)試通過使用調(diào)試訪問端口(DAP)給出了一個2引腳的連接,它的功能相當(dāng)于5引腳的JTAG接口。
(5)系統(tǒng)跟蹤宏單元(STM)。
它為多處理器和進程提供了printf()風(fēng)格的調(diào)試方法。系統(tǒng)中任何主設(shè)備運行的軟件都能夠通過使用非常簡單的代碼片段訪問STM通道,而無須知道其他軟件的使用,它會使能內(nèi)核和用戶代碼的儀器化軟件的時間標記。時間標記的信息提供了相對于先前的事件的一個變化偏移量,這是非常有用的。
(6)跟蹤內(nèi)存控制器(TMC)。
正如已經(jīng)描述的,給芯片封裝添加額外的引腳會顯著地增加其成本。在多個內(nèi)核設(shè)備(或其他模塊能產(chǎn)生跟蹤信息)的情況下,為經(jīng)濟考慮很可能排除提供多個跟蹤端口的可能性。CoreSight跟蹤內(nèi)存控制器可用于將多個跟蹤源合并到一個單一的總線上。控制可以在多個輸入源之間進行優(yōu)先級考慮和選擇。跟蹤信息可以使用專門的跟蹤端口導(dǎo)出,通過JTAG或SWI串行線接口或通過復(fù)用SoC的I/O端口,可以存儲在一個ETB或系統(tǒng)內(nèi)存中。
程序員應(yīng)該查閱所使用的設(shè)備的文檔,以確定哪些跟蹤功能和工具可以使用。
調(diào)試監(jiān)視器
ARM架構(gòu)為外部調(diào)試器提供了多種訪問的功能,這些功能模塊也可用于處理器的代碼,即所謂的調(diào)試監(jiān)視器,它駐留在目標系統(tǒng)。
監(jiān)視系統(tǒng)是比較便宜的,因為它們可能并不需要額外的硬件。然而,它們需要占用系統(tǒng)的存儲器空間,而且只有當(dāng)目標系統(tǒng)本身實際運行時才能使用。
如果系統(tǒng)連起碼的正確啟動都無法成功的話,它們在系統(tǒng)上沒有什么價值。
處理器的斷點和觀察點硬件可用于調(diào)試監(jiān)視器。
當(dāng)選擇監(jiān)視模式調(diào)試時,斷點單元可以通過ARM處理器上運行的代碼進行編程。如果執(zhí)行了BKPT指令,或一個硬件斷點單元匹配,系統(tǒng)在監(jiān)視模式下會有不同的行為。
相比在外部硬件調(diào)試器控制下停止處理器,在監(jiān)視模式下處理器會產(chǎn)生一個中止異常,并且它可以識別這是不是由調(diào)試事件產(chǎn)生的中止,然后調(diào)用監(jiān)視代碼。
舉個例子,假設(shè)有一個ARM處理器在運行一個程序,并且開發(fā)者想要在某個特定的代碼行上設(shè)置一個斷點。在監(jiān)視模式下,開發(fā)者可以在目標系統(tǒng)上運行一個特殊的指令來編程斷點單元。當(dāng)程序執(zhí)行到這一行時,斷點單元會觸發(fā)并產(chǎn)生一個異常。處理器可以識別這個異常是由斷點引起的,然后執(zhí)行預(yù)定義的監(jiān)視代碼。這個監(jiān)視代碼可以用于收集調(diào)試信息、記錄程序狀態(tài)或執(zhí)行其他必要的調(diào)試任務(wù)。
總的來說,監(jiān)視系統(tǒng)是一種用于處理器調(diào)試的機制,允許開發(fā)者在不停止系統(tǒng)運行的情況下檢查程序狀態(tài)和行為。通過使用斷點和觀察點硬件,開發(fā)者可以在目標系統(tǒng)上設(shè)置斷點、觀察點或執(zhí)行其他調(diào)試操作,從而更好地理解程序的執(zhí)行流程和潛在問題。
很多編寫源碼的IDE工具大概就是利用這個操作來實現(xiàn)的。所以說做編譯器真的有點東西。
調(diào)試Linux應(yīng)用程序
Linux是一個多任務(wù)的操作系統(tǒng),其每一個進程都有自己的進程地址空間,并完成私有頁表的映射,這會讓調(diào)試一些問題比較麻煩。
我們可以大致定義兩個不同的調(diào)試Linux系統(tǒng)所使用的方法。
(1)Linux應(yīng)用程序,通常使用運行在目標上的GDB調(diào)試服務(wù)器與主計算機通信來進行調(diào)試,通常通過以太網(wǎng)。
在調(diào)試會話發(fā)生時,內(nèi)核將繼續(xù)正常運行,這種調(diào)試方法不會使用所提供的內(nèi)置硬件調(diào)試設(shè)備,目標系統(tǒng)永久處于運行狀態(tài),服務(wù)器接收到主機調(diào)試器的請求,然后接收命令,并提供數(shù)據(jù)傳回主機。
主機調(diào)試器將加載請求發(fā)送給GDB服務(wù)器,GDB服務(wù)器通過啟動一個新的進程來運行需要調(diào)試的應(yīng)用程序并做出響應(yīng)。
在開始執(zhí)行前,它使用系統(tǒng)調(diào)用ptrace()控制應(yīng)用程序的進程,這個進程中的所有信號被轉(zhuǎn)發(fā)到GDB服務(wù)器。
任何發(fā)送到應(yīng)用程序的信號將會進入GDB服務(wù)器,它可以處理信號或?qū)⑵滢D(zhuǎn)發(fā)給正在被調(diào)試的應(yīng)用程序。
為了設(shè)置斷點,GDB服務(wù)器會在代碼中所要求的位置插入一個產(chǎn)生SIGTRAP信號的代碼。
當(dāng)執(zhí)行該代碼時,GDB服務(wù)器被調(diào)用,然后執(zhí)行調(diào)試器任務(wù),如檢查調(diào)用棧信息,變量或寄存器內(nèi)容。
(2)對于內(nèi)核調(diào)試,需要使用JTAG調(diào)試器。
當(dāng)一個斷點被執(zhí)行,系統(tǒng)就停止。
這是最簡單的檢查問題的方法,如設(shè)備驅(qū)動程序加載或不正確操作,或內(nèi)核引導(dǎo)失敗等問題。
日常的常用場景
另一種常見的方法是通過調(diào)用printk()函數(shù)。
strace工具可以顯示關(guān)于用戶系統(tǒng)調(diào)用的信息。
Kgdb是一個Linux內(nèi)核的源代碼級調(diào)試器,它與GDB協(xié)同工作在單獨的機器上工作,可以用來檢查堆棧跟蹤和內(nèi)核狀態(tài)視圖(如PC值、定時器內(nèi)容和內(nèi)存)。
設(shè)備/dev/kmem可以提供內(nèi)核內(nèi)存的在線訪問。
當(dāng)然,Linux-aware JTAG調(diào)試器也可以用來調(diào)試線程,它通常只會停止所有的進程,無法在停止一個單獨的線程或進程同時讓其他線程運行。
斷點可以設(shè)置在所有的線程或一個指定的線程上。
由于存儲器映射取決于哪個進程是活動的,因此軟件斷點通常只能設(shè)置在一個特定進程進行映射時。
ARM DS-5調(diào)試器可以通過gdbserver調(diào)試應(yīng)用程序,通過JTAG調(diào)試Linux內(nèi)核和Linux內(nèi)核模塊。
還有Trace32工具。
小結(jié)
最后這里拿幾個典型的核來說說調(diào)試架構(gòu)。
Corte-M3
Corte-M3系列微控制器的總體結(jié)構(gòu)圖
Corte-M3的調(diào)試系統(tǒng)基于ARM公司的“CoreSight(內(nèi)核景象)”調(diào)試架構(gòu),對處理器上總線邏輯的控制使用另外的總線接口,即通過所謂的“調(diào)試訪問端口(Debug Access Port,DAP)”,把JTAG或串行線協(xié)議都轉(zhuǎn)換成DAP總線接口協(xié)議,再控制DAP來執(zhí)行調(diào)試動作。
CoreSight架構(gòu)的另一部分用于跟蹤,在跟蹤蹤過程中,由跟蹤源產(chǎn)生的數(shù)據(jù)被裹成數(shù)據(jù)包,然后被送到“高級跟蹤總線(Advanced Tracking Bus,ATB)”上進行傳送。
如果某SoC含有多個跟蹤源(如多核系統(tǒng)),則需要一種硬件(在CoreSight架構(gòu)中,這種硬件被稱為ATB funnel)水平的ATB歸并器(merger),把各ATB數(shù)據(jù)流歸并成一條。
歸并后的數(shù)據(jù)流都送往TPIU(Trace Port Interface Unit,跟蹤端口接口單元),TPIU再把數(shù)據(jù)導(dǎo)出到片外的跟蹤硬件設(shè)備數(shù)據(jù)總線和指令總線通過總線接口與代碼存儲器,外部存儲器,外部設(shè)備和內(nèi)部設(shè)備進行連接。
下面再詳細展開說說:
Cortex-M3在內(nèi)核水平上搭載了若干種調(diào)試相關(guān)的特性。
最主要的就是程序執(zhí)行控制,包括
停機(Halting)、
單步執(zhí)行(Stepping)、
指令斷點、
數(shù)據(jù)觀察點、
寄存器和存儲器訪問、
性能速寫(Profiling),
以及各種跟蹤機制。
Cortex-M3的調(diào)試系統(tǒng)基于ARM最新的CoreSight架構(gòu)。不同于以往的ARM處理器,內(nèi)核本身不再含有JTAG接口。取而代之的是CPU提供稱為“調(diào)試訪問接口(DAP)”的總線接口。
通過這個總線接口,可以訪問芯片的寄存器,也可以訪問系統(tǒng)存儲器,甚至可以在內(nèi)核運行時訪問。
對此總線接口的使用,是由一個調(diào)試端口(DP)設(shè)備完成的。DPs不屬于Cortex-M3內(nèi)核,但它們是在芯片的內(nèi)部實現(xiàn)的。
目前,可用的DP包括SWJ-DP(既支持傳統(tǒng)的JTAG調(diào)試,也支持新的串行線調(diào)試協(xié)議),另一個SW-DP則去掉了對JTAG的支持。
另外,也可以使用ARM CoreSignt產(chǎn)品家族的JTAG-DP模塊。
這下就有3個DP可以選了,芯片制造商可以從中選擇一個,以提供具體的調(diào)試接口(通常都是選SWJ-DP)。
Cortex-M3還能掛載一個所謂的“嵌入式跟蹤宏單元(ETM)”。
ETM可以不斷地發(fā)出跟蹤信息,這些信息通過一個被稱為“跟蹤端口接口單元(TPIU)”的模塊送到內(nèi)核的外部,再在芯片外面使用一個“跟蹤信息分析儀”,就可以把TIPU輸出的“已執(zhí)行指令信息”捕捉到,并且送給調(diào)試主機——也就是PC。
在Cortex-M3中,調(diào)試動作能由一系列的事件觸發(fā),包括斷點、數(shù)據(jù)觀察點、fault條件或者是外部調(diào)試請求輸入的信號。
當(dāng)調(diào)試事件發(fā)生時,Cortex-M3可能會停機,也可能進入調(diào)試監(jiān)視器異常handler。具體如何反應(yīng),則根據(jù)與調(diào)試相關(guān)寄存器的配置。
與調(diào)試相關(guān)的還有其他的絕活。現(xiàn)在要介紹的是“指令追蹤宏單元(ITM)”,它也有自己的辦法把數(shù)據(jù)送往調(diào)試器。
通過把數(shù)據(jù)寫到ITM的寄存器中,調(diào)試器能夠通過跟蹤接口來收集這些數(shù)據(jù),并且顯示或者處理它。此法不但容易使用,而且比JTAG的輸出速度更快。
所有這些調(diào)試組件都可以由DAP總線接口來控制,Cortex-M3內(nèi)核提供DAP接口。此外,運行中的程序也能控制它們,所有的跟蹤信息都能通過TPIU進行訪問。
Zynq-7000 AP SoC
Zynq-7000 AP SoC提供標準的JTAG(IEEE 1149.1)調(diào)試接口,包括一個在PS內(nèi)部的ARM調(diào)試接口(DAP)和一個在PL內(nèi)部的標準JTAG測試接口(TAP)。
ARM DAP是ARM CoreSight調(diào)試框架的一部分,允許用戶使用行業(yè)標準的第三方調(diào)試工具。
Xilinx TAP控制器在標準的JTAG功能上添加了一些支持PL的特性,包括PL調(diào)試、熔絲/BBRAM編程、片上XADC訪問等。
更重要的是,它通過共享跟蹤緩沖及PL和PS的交叉觸發(fā)接口,達到允許在使用DAP調(diào)試ARM上的軟件的同時,使用TAP調(diào)試PL硬件。
JTAG調(diào)試接口的關(guān)鍵特性:
支持JTAG 1149.1邊界掃描;
兩個符合1149.1標準的TAP控制器——JTAG TAP控制器和ARM DAP;
每個Zynq-7000家族的設(shè)備都有唯一的IDCODE;
支持IEEE 1532在線編程(ISE),如熔絲編程、BRAM編程和XADC訪問;
板級Flash編程;支持Xilinx Chipscope調(diào)試;
使用ARM DAP的ARM CoreSight調(diào)試控制中心;
通過DAP-AP端口實現(xiàn)系統(tǒng)地址空間直接訪問;
使用MIO或者EMIO的外部跟蹤接口。
之前的文章都是基于Corte-A系列。
調(diào)試安全
最后這里再啰嗦一點關(guān)于安全的知識。
聯(lián)合測試行動小組(JTAG)國際標準測試協(xié)議已被業(yè)界廣泛應(yīng)用。JTAG接口的主要功能在于將固件下載到設(shè)備芯片,并在程序運行時對軟件執(zhí)行過程進行分析監(jiān)測,監(jiān)測內(nèi)容包括CPU中的寄存器和內(nèi)存中存儲的值,以實現(xiàn)對芯片內(nèi)部測試及系統(tǒng)仿真、調(diào)試。
芯片廠商通常將JTAG接口作為片上系統(tǒng)的一部分。例如,ARM公司在其處理器芯片的CoreSight調(diào)試架構(gòu)中集成了這一接口。
JTAG的使用提高了移動終端固件開發(fā)的便利性。但由于JTAG接口通常是開放的,因此,攻擊者可以找到芯片上JTAG接口的引腳并接入工具,實現(xiàn)對移動終端的攻擊。
例如,可以破壞或禁用系統(tǒng)組件,提取固件代碼或加/解密密鑰,也可以插入未經(jīng)授權(quán)的功能函數(shù),獲得攻擊系統(tǒng)的后門,傳輸攻擊程序及分析設(shè)備漏洞等。由于通過JTAG可以同時訪問內(nèi)存和處理器的信息,因此,基于JTAG接口實施攻擊比通過其他接口進行攻擊更為直接。
我們可以聯(lián)合采用基于電路特性隱匿與基于認證的安全防護方法抵御基于JTAG接口的攻擊。
(1)基于電路特性隱匿的JTAG接口攻擊防護
這種防護的核心技術(shù)思想是在芯片的硬件電路上進行必要的修改,使攻擊者難以從物理層面接入。
例如,修改芯片上JTAG的默認輸入電壓,使得攻擊者難以使用有效的電壓激活JTAG接口;
修改引腳映射,即修改芯片上面JTAG引腳的布局,使攻擊者難以辨認哪些管腳被用于JTAG;
熔絲的辦法,即如果固件已經(jīng)被下載到芯片中,則特殊熔絲會被熔斷,并以刪除輸入/輸出端口的方式來禁用JTAG端口,使得開發(fā)者無法再使用JTAG。
(2)基于認證的JTAG接口攻擊防護
這種防護方法通常需要外置電路芯片,以完成JTAG的認證邏輯。
例如,設(shè)置安全級別的方式,在JTAG接口引腳外繼續(xù)外接一個微控制器,通過“驗證-挑戰(zhàn)”的方式對接入的JTAG器件的權(quán)限進行認證。
通過接收固定的字符,微控制器將會驗證當(dāng)前的JTAG端口連接請求是否符合身份。在通過驗證后,微控制器將把當(dāng)前外部器件發(fā)送的調(diào)試指令轉(zhuǎn)發(fā)給實際芯片的JTAG端口。
另外,也可以在使用JTAG接口之前,強制要求需要輸入密碼或者使用JTAG帶有密鑰進行身份認證。
最后也可以設(shè)計專屬的門控認證。
其實一直都是停留于使用者的角度來認識Coresight以及調(diào)試軟件與工具,期待站在設(shè)計者的角度來認識Coresight。
審核編輯:劉清
-
ARM
+關(guān)注
關(guān)注
134文章
8963瀏覽量
364953 -
嵌入式系統(tǒng)
+關(guān)注
關(guān)注
40文章
3518瀏覽量
128790 -
JTAG
+關(guān)注
關(guān)注
6文章
392瀏覽量
71421 -
ARM處理器
+關(guān)注
關(guān)注
6文章
360瀏覽量
41512 -
調(diào)試器
+關(guān)注
關(guān)注
1文章
297瀏覽量
23565 -
Cortex-A
+關(guān)注
關(guān)注
0文章
19瀏覽量
34247
原文標題:Arm調(diào)試架構(gòu)篇
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論