引言
傳統上,調試嵌入式Linux產品需要將硬件和軟件工具結合起來,如用JTAG工具進行硬件bring-up,用基于代理(agent- based)的解決方案進行軟件開發。這些JTAG和基于代理的工具相結合的方法通常可以解決單點問題,但它們最初并不是專門針對集成化的Linux開發而設計的。因而,在當今集成化的產品開發中,這些傳統方法常常是不可行的。
但是,我們可以在Linux內核的配置、補丁管理以及在基于Eclipse的IDE環境中的用戶空間應用開發、調試和分析之中,將傳統JTAG 硬件調試融入其中得到一種全新的方法,從而完全改變開發人員使用JTAG連接進行Linux設備軟件調試的方法,這就是Wind RiverWorkbench。
Linux設備調試的復雜性
在嵌入式設備領域,Linux的應用正在迅速增加。根據技術市場研究機構VDC的報告,在新的設備研發項目中,有23%會采用Linux。由于開發工作跨越Boot Loader、Linux內核、內核模塊和應用,調試工作很可能極為復雜。Linux開發人員必須面對的問題包括為Boot Loader建立目標配置文件,在用戶模式和內核模式之間雙向對硬Linux虛擬地址、映射內核符號信息以及排除遍布于用戶和內核空間之中的差錯。包括內核GNU調試器和GNU調試器在內,在基于代理的調試方案中,要想解決上述任何問題都會遇到極大困難。
Boot Loader調試
如果浪費太多的時間在BootLoader的開發與調試上,將會嚴重影響開發人員對于系統穩定性、設備軟件與應用開發的精力投入。因此,開發人員應當借助于先進的工具,盡快逾越這個階段。
Linux需要依靠BootLoader來啟動操作系統。這段代碼存放在Flash或者其他非易失性存儲器之中,在系統開機或者復位之后立即運行。Boot Loader的調試可能會非常復雜。這段代碼與硬件密切相關,在系統啟動之后開發人員必須把它從Flash存儲重新定位到RAM之中。在今天的SoC處理器中可能包括了數百個配置寄存器,都需要在此時進行初始化,這項工作需要熟悉數千頁的特殊設定文檔。如果設定寄存器錯誤,可能導致隨后Linux內核或者應用調試的異常。并且手工編輯寄存器設定是一項極為繁瑣易錯的工作。
Boot Loader開發的另一項常見挑戰出現在Boot Loader把Linux裝入RAM并啟動操作系統的時候。基于代理的調試解決方案不支持BootLoader調試,因為在此過程中還沒有開始發揮作用。因此,開發人員只能寄希望于JTAG工具。
JTAG調試解決方案提供了很強的能力來幫助開發人員快速有效地完成Boot Loader的測試與故障排除工作。它使寄存器設置工作大大簡化,通過設置硬件斷點以及單步執行Flash中的代碼,可以快速發現原代碼中的錯誤。IDE 可以支持反匯編,還可以讓你混合查閱源代碼和匯編代碼,符號管理功能比較便于代碼從Flash向RAM的重新定位,使整個調試工作得到很大幫助。
JTAG調試解決方案不需要通過Boot Loader即可裝載Linux內核。對于那些在Boot Loader尚未完成之前就希望開始系統開發的項目管理人員來說,這項功能具有特殊的重要意義。提供了引導行能力的JTAG調試解決方案可以支持Boot Loader和操作系統穩定化的并行開發,從而加速軟件開發項目的整體進程。
Linux內核及內核模塊調試
Linux內核及內核模塊是Linux操作系統的核心構建。在系統被Boot Loader初始化之后,首先裝載的就是Linux內核。Linux模塊則根據需要進行裝載。在進行操作系統bring-up時,開發人員必須專注于 Linux操作系統的優化或剪裁以及內核模塊的開發,需要必須密切監控硬件與軟件之間的互動。Linux內核調試要求具備觀察寄存器、數據緩存器及其它底層數據。LinuxKGDB要求具備穩定的Linux內核,并且確保諸如設備驅動之類的客戶硬件接口處于就緒狀態,其中的代理才能工作。基于代理的調試不具備底層硬件的可視化能力,也不能提供完全的診斷功能,因而無法讓開發者了解硬件與Linux內核之間的互動。
如果采用代理來調試Linux內核和內核模塊,在進入調試斷點時可能會涉及系統暫停或者凍結方面的問題。例如,KGDB無法暫停CPU(特別是在多核或者多處理器環境中)來讓開發人員檢查CPU的現行狀態,它也不能幫助開發人員對崩潰的系統進行調試,因為崩潰的操作系統顯然已經不能再運行代理。而且,KGDB還需要以太網等通信接口實現主機系統與目標之間的溝通。總之,采用代理來實現Linux內核模式調試,需要具備由IP棧、穩定的Linux 內核和處于運行狀態的設備驅動。在上述條件尚未具備,或者上述軟件本身還需要調試的時候,基于代理的調試顯然就無能為力。
為了實現并驗證一個目標系統中的Linux內核,必須擁有可以監控和管理Linux內核和內核模塊的全面調試解決方案。基于JTAG的調試解決方案功能特性包括查看局部/全局符號和寄存器以及指令和數據緩存器。已經有商業化的JTAG調試解決方案可以把物理內存和虛擬內存順暢地映射過來,從而幫助開發人員正確地觀察內存地址和內容,也具有對Linux內核模塊進行調試的能力,以及在不必反復連接和切斷目標系統的前提下多次裝載和卸載。
JTAG調試解決方案的另一個重要能力是把系統完全置于暫停狀態并且全面觀察操作系統和應用的狀態。這種能力又被稱為“系統模式調試 (system mode debug)”,對于Linux內核和Linux內核模塊的調試是極為有用的。有了系統模式調試能力,開發人員就可以把整個系統完全暫停下來,包括處理器、操作系統和所有的線程以及中斷處理程序。以這種方式暫停系統,就有可能獲得系統硬件和軟件的完整細節視圖,當然也可以讓系統繼續執行或者分步驟執行某些代碼。
因此,在一些KGDB無法使用的情況下,JTAG解決方案就可大派用場,特別是在Linux內核出錯或者目標崩潰的情況下更是如此。因此JTAG解決方案在提升操作系統和設備驅動穩定性方面特別有用。
Linux應用調試
Linux應用是在Linux內核控制之下運行的用戶程序,它通過系統調用來訪問系統資源。Linux內核負責處理系統調用并且決定如何來提供硬件和內存訪問。
對于用戶模式下的應用調試,開發人員需要通過啟動和停止線程、查看變量和堆棧來直接訪問應用線程。由于一個應用可能由多個進程或者線程組成,所以有可能需要停止與正在調試的應用線程相關的所有線程。開發人員也常常需要跨越不同的進程和CPU來查看外設寄存器。然而,GDB只能在線程的級別上操作,而且只能啟動和停止單個線程,根本不具備啟動和停止整個系統或者同時啟動/停止多個線程的能力。
另外,在用戶模式下進行調試的時候,可能會因為單步運行系統調用而從用戶模式進入Linux內核模式,然后又單步執行回到用戶模式。在 Linux的虛擬內存結構下,在兩種模式之間來回轉換的同時還要保持內存地址跟蹤,僅僅依賴于物理地址將會效果有限。于是,基于代理的解決方案需要同時采用GDB和KGDB來跟蹤系統調用進入Linux內核和內核模塊。同時,這個過程將會非常復雜。
Linux應用開發人員也常常遇到沒有配備以太網或者串行通信接口的設備開發項目。即便是配有這些通信接口,相應的軟件也不一定能很快就開發完成。而基于代理的調試方法必須依賴這些通信接口才能工作。如果目標設備沒有通信接口,或者這些通信接口本身還需要開發與調試,或者內存對于IP棧或代理軟件不可用,在這些情況下,基于代理的方法也不能使用。
基于JTAG的調試方法對于運行在Linux用戶模式下的應用則具有深度可視化能力。對于提出系統調用的應用,雙模式的JTAG調試解決方案還將可視化的深度延伸到Linux內核,所有的應用線程、運行環境以及在線程變量中用到的參數都一覽無遺,而且這些功能的實現不會對Linux內核本身造成任何影響。對于沒有通信接口的目標設備,例如移動電話、醫療設備、車載設備等,基于JTAG的調試解決方案都顯示出遠高于基于代理調試的優越性。一個 Linux的軟件與硬件連接如圖1所示。
采用系統模式調試可以讓多線程應用調試大大簡化,這是因為開發人員獲得了暫停處理器并觀察操作系統和全部線程運行狀態的能力。如前所述,許多問題的發生是因為多個線程之間的交互。而基于代理的調試根本不具備停止全部線程的能力,自然也就難以發現問題所在,這就意味著工程進度將會因為調試工作的低效率而被大大延遲。
基于JTAG的調試解決方案與目標硬件的連接是非干擾性的,可以連接到一個已經運行并且發生錯誤的目標系統之中,也可以不改變處理器寄存器的狀態,即可觀察到Linux內核和應用的運行狀況并進行調試。例如,如果一個Linux的目標設備進入死鎖狀態,利用JTAG調試工具,開發人員就可以在不會破壞現場狀態的前提下與目標系統連接,進而觀察其中的Linux內核對象、應用運行情況,找到引發錯誤的線程、系統調用以及調用參數。在有些情況下,基于代理的調試工具根本無法使用,而基于JTAG的調試工具卻可以簡化調試工作,加快調試進度。
Wind River基于JTAG的Linux調試工具
Wind Rivet推出的基于JTAG的OCD((On-Chip Debugging,片上調試)解決方案運行在符合工業標準的Eclipse平臺上,為嵌入式Linux設備提供了先進的基于JTAG的調試功能特性。
Workbench OCD主要支持Wind River Linux。不過,對于開發者自行獲得的Linux或者半導體廠商提供的Linux版本,Wind River也可提供片上調試功能,也為kernel.org Linux提供基于JTAG的內核及用戶模式調試。Wind River調試解決方案還支持廣泛的目標硬件,包括先進的多核處理器。它還支持移動終端設備市場上所有最新的主流處理器,實現各種量身定制的增強功能特性,使設備軟件和硬件的開發調試變得更加簡單、更加直觀。
Workbench實現了與Eclipse全整合,并且通過在Workbench基于Eclipse的環境中加入新的視圖和功能模塊,進一步加強了IDE的支持。
目前,大多數移動終端設備都采用了多處理內核,對很多片上調試解決方案都造成很大的挑戰。JTAG Server和JTAG Accelerator技術提供了面向多內核處理器的高速JTAG調試能力。JTAG Accelerator技術支持當前最復雜的32位和64位處理器,實現了JTAG帶寬利用率的最大化。JTAG Servet技術則使開發人員能夠同時連接多達128個處理器,并且在單個IDE實例中動態地調試多個處理器。
這樣,Linux開發人員可以靈活地采用JTAG連接來進行硬件bring-up、Linux內核、中間件和用戶模式應用的調試,并且在適當的時候轉移到基于代理的調試方式之下,而且不論是JTAG或是代理模式都在同一個IDE架構之中,這種功能可以顯著改善多個開發團隊之間的協同效率,節省排除差錯的時間。
結語
由于嵌入式系統已經變得越來越復雜,軟件開發人員在調試工作上所面臨的挑戰也越來越多。傳統基于代理的Linux調試解決方案在用戶模式和內核模式的調試上的有效性都面臨尷尬。基于JTAG的調試可以在Linux開發中扮演極有價值的角色,當它與Eclipse之類的標準化開發環境相結合,就可以顯著改善編輯-編譯-調試過程。在產品上市速度已經成為關鍵因素的今天,擁有高效率的Wind RiverWorkbench調試工具無疑是明智的選擇。
評論
查看更多