<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > 嵌入式Linux內(nèi)核調(diào)試技術(shù)

          嵌入式Linux內(nèi)核調(diào)試技術(shù)

          作者:宋尚春 時間:2007-12-04 來源:電子產(chǎn)品世界 收藏

          宋尚春,北京麥克泰軟件技術(shù)有限公司

          本文引用地址:http://www.ex-cimer.com/article/73300.htm

          摘 要:由于沒有對任何硬件平臺都通用的嵌入式Linux操作系統(tǒng),開發(fā)相應的嵌入式產(chǎn)品時,必須對和驅(qū)動程序進行裁減、移植和調(diào)試。因此調(diào)試器對于程序員來說是不可或缺的必備工具。本文主要講述如何使用BDI2000仿真器與LinuxScope-JTD調(diào)試器進行嵌入式的調(diào)試,為嵌入式調(diào)試提供了一個便捷、高效的解決方案。
          關(guān)鍵詞:嵌入式Linux  內(nèi)核調(diào)試 BDI2000 LinuxScope-JTD

          The Embedded Linux Kernel Debugging Technology
          Abstract: There is no Embedded Linux can work with all CPU, it is reduced、migrated and debugged。So,the debugger is very important. Here we talk about how to use BDI2000 and LinuxScope-JTD to debug Embedded Linux kernel, it is a very convenience and useful method.

          Keywords:Embedded Linux; Kernel Debugging; BDI2000; LinuxScope-JTD

            近年來微電子技術(shù)迅猛發(fā)展,處理器技術(shù)發(fā)展速度也隨之加快,嵌入式領(lǐng)域發(fā)生了翻天覆地的變化。特別是網(wǎng)絡(luò)的普及,消費電子異軍突起,嵌入式與互聯(lián)網(wǎng)成為最熱門的技術(shù)。在所有操作系統(tǒng)中,Linux是發(fā)展最快、應用最廣泛的一種操作系統(tǒng)。Linux的開放性,以及其他優(yōu)秀特性使其越來越成為嵌入式系統(tǒng)開發(fā)的操作系統(tǒng)首選。

          1. 嵌入式系統(tǒng)開發(fā)所面臨的問題

            嵌入式軟件開發(fā)有別于桌面軟件系統(tǒng)開發(fā)的一個顯著的特點是一般需要一個交叉編譯和調(diào)試環(huán)境,即編輯和編譯軟件在主機上進行,編譯好的軟件需要下載到目標機上運行 ,主機和目標機之間建立起通訊連接,并傳輸調(diào)試命令和數(shù)據(jù)。由于主機和目標機往往運行著不同的操作系統(tǒng),而且處理器的體系結(jié)構(gòu)也彼此不同,這就提高了嵌入式開發(fā)的復雜性。
          總的來說,嵌入式開發(fā)所面臨的問題主要表現(xiàn)在以下幾個方面:

          1.1 涉及多種CPU 及多種OS

            嵌入式的CPU或處理器可謂多種多樣,包括MIPS、PPC、ARM,XScale等不同的架構(gòu),而且它們都很廣泛地應用在眾多領(lǐng)域。在這些處理器上運行的操作系統(tǒng)也有不少,如VxWorks、Linux、uC/OS、WinCE等等。在一個公司之內(nèi),可能會同時使用好幾種處理器,甚至幾種嵌入式操作系統(tǒng)。如果需要同時調(diào)試多種類型的板子,那復雜性是可想而知的。這也是我們選用BDI2000的原因之一。BDI2000是一款功能強大且非常穩(wěn)定耐用的JTAG/BDM通用仿真器,由瑞士Abatron公司研制生產(chǎn)的性價比非常高的一款仿真器。它支持多種處理器:PPC/MIPS/ARM/XSCALE/ CPU12/CPU32/M-CORE/ColdFire等,支持Windows/Linux系統(tǒng)平臺,支持多種第三方調(diào)試器,并且對Flash的燒寫也很簡單方便。

          1.2 開發(fā)工具種類繁多

            通常各種操作系統(tǒng)有各自的開發(fā)工具,在同一系統(tǒng)下開發(fā)的不同階段也會應用不同的開發(fā)工具。如在用戶的目標板開發(fā)初期,需要硬件仿真器來調(diào)試硬件系統(tǒng)和基本的引導程序,然后進行操作系統(tǒng)及驅(qū)動程序的開發(fā)調(diào)試。在調(diào)試應用程序階段可以使用交互式的開發(fā)環(huán)境進行軟件調(diào)試,在測試階段需要一些專門的測試工具軟件進行功能和性能的測試。在生產(chǎn)階段需要固化程序及出廠檢測等等。每一種工具都要從不同的供應商購買,都要單獨去學習和掌握,這無疑增加了整個公司的支出和管理的難度。BDI2000可以適應開發(fā)的各個階段,可以節(jié)約企業(yè)的支出和簡化管理難度。

          1.3 對目標系統(tǒng)的觀察和控制

            由于嵌入式硬件系統(tǒng)千差萬別,軟件模塊和系統(tǒng)資源也多種多樣,要使系統(tǒng)能正常工作,軟件開發(fā)者必須要對目標系統(tǒng)具有完全的觀察和控制能力,例如硬件的各種寄存器、內(nèi)存空間,操作系統(tǒng)的信號量、消息隊列、任務(wù)、堆棧等。
            此外,嵌入式系統(tǒng)變化更新比較快,對開發(fā)時間要求比較緊,尤其是消費類產(chǎn)品更是如此,如果有一套功能強大的嵌入式軟件集成開發(fā)工具可以滿足嵌入式軟件開發(fā)各個階段的需求,同時又使用方便,界面友好,那是最理想不過了。LinuxScope-JTD調(diào)試器就是這樣一個理想的選擇,它是美國 Ultimate Solution, Inc公司開發(fā)的專門用于配合BDI2000的一款調(diào)試器:基于Eclipse的集成開發(fā)環(huán)境和插件技術(shù);提供腳本定制功能實現(xiàn)目標機的特殊操作;提供Linux內(nèi)核調(diào)試功能,容易修改和觀察硬件寄存器;增強的MI接口提供在Eclipse下識別硬件斷點及模塊跟蹤;支持標準調(diào)試特性: 觀察/修改內(nèi)存,觀察匯編代碼, 觀察變量,觀察堆棧,跟蹤內(nèi)存斷點(watch point);支持Linux應用程序的開發(fā),支持Windows/Linux系統(tǒng)平臺。

          2. 嵌入式Linux的調(diào)試

          2.1嵌入式Linux內(nèi)核的調(diào)試

          2.1.1 編譯內(nèi)核

            本文所調(diào)試的是Montavista Linux,硬件是Intel xscale pxa250。已經(jīng)擁有超過兩千多用戶和數(shù)以千萬計的Montavista Linux產(chǎn)品在市場上銷售,它們覆蓋從智能手機,高清電視,機器人,無線網(wǎng)絡(luò)設(shè)備到3G電信服務(wù)器等各種嵌入式應用。Montavista Linux本身就是用BDI2000來開發(fā)調(diào)試的。
            進入內(nèi)核源碼目錄下,配置完成相關(guān)選項并準備編譯。配置時不要選中KGDB,否則會和BDI2000沖突。

          {{分頁}}
            為了調(diào)試內(nèi)核,需要在編譯時加入調(diào)試信息,否則將無法看到源代碼。修改內(nèi)核源碼根目錄下的Makefile,在CFLAGS宏定義的末尾添加“–ggdb”選項,保存退出。這里加上gdb是為了更好的使代碼適合gdb調(diào)試器,另外注意Makefile中的優(yōu)化設(shè)置,有些時候優(yōu)化會調(diào)整代碼執(zhí)行的順序,在內(nèi)核的調(diào)試階段,不要加入優(yōu)化選項。
            編譯:make dep; make zImage

          2.1.2 內(nèi)核調(diào)試

            首先,配置BDI2000,確保目標機的正常初始化。通常來說到了調(diào)試內(nèi)核的階段,板子的boot應該是正常的,所以利用boot來完成目標機的初始化;另一種方式是通過BDI的配置文件來完成。
            接下來就是下載代碼進行調(diào)試了。如果代碼已經(jīng)固化,那僅下載調(diào)試信息給仿真器即可;否則需要把代碼下載到RAM里運行,同時下載調(diào)試信息給仿真器。本文所用的是后一種方式。
            由于Linux運行之后會啟動MMU而使地址重映射,因此第一個斷點通常在函數(shù)start_kernel( ),而且只能設(shè)置為硬斷點。硬件斷點是非常有限的,有的處理器甚至只能設(shè)置一個。所以,在調(diào)試Linux內(nèi)核時,使用普通的GDB進行斷點設(shè)置會非常不方便。LinuxScope可以很方便的切換斷點模式,并支持軟斷點,使斷點的設(shè)置不再受到限制,為調(diào)試Linux內(nèi)核提供強有力的支持。具體步驟如下:
          1) BDI配置文件的斷點模式:soft
          2) LinuxScope配置默認的斷點模式:soft /hard 都可以
          3)用BDI下載壓縮的內(nèi)核:load  0x20000 zImage bin
          4) 把PC指針指到內(nèi)核入口地址:ti 0x30000
          5) 運行LinuxScope,在start_kernel處設(shè)置硬件斷點
          6) go,停下來后再設(shè)置軟斷點即可



          2.2 模塊內(nèi)核調(diào)試

            我們使用BDI2000來調(diào)試Linux內(nèi)核的另外一個重要原因就是它可以支持調(diào)試內(nèi)核模塊。內(nèi)核模塊是一些可以讓操作系統(tǒng)內(nèi)核在需要時載入和執(zhí)行的代碼,這意味著它可以在不需要時由操作系統(tǒng)卸載。這種方式可以擴展操作系統(tǒng)內(nèi)核的功能,而不需要重新啟動系統(tǒng),這一點對調(diào)試驅(qū)動的工程師特別有用。因為如果驅(qū)動程序編譯進內(nèi)核的話,會增加內(nèi)核的大小,還要改動內(nèi)核的源文件,而且不能動態(tài)的卸載,不利于調(diào)試,所以推薦使用模塊方式。

          2.2.1 調(diào)試Linux 2.4內(nèi)核模塊

            2.4內(nèi)核模塊的調(diào)試比較簡單,使用命令“insmod -m”來加載模塊。參數(shù)“-m”非常重要,它的功能是在把模塊加載到內(nèi)存時產(chǎn)生一個加載map表。然后通過LinuxScope調(diào)試器加載相應的調(diào)試信息。例如:
          [root@lisl tmp]# insmod -m hello.o >modaddr
          查看模塊加載信息文件modaddr如下:

            .this           00000060  c88d8000  2**2
            .text           00000035  c88d8060  2**2
            .rodata         00000069  c88d80a0  2**5
            ……
            .data           00000000  c88d833c  2**2
            .bss            00000000  c88d833c  2**2
            ……

            在這些信息中,我們用到的只有.text、.rodata、.data、.bss。當然,把相關(guān)的信息輸入LinuxScope調(diào)試器,它會把以上地址信息加入到gdb中進行模塊功能的調(diào)試。

            這里需要注意的是對模塊進行編譯時,也需要增加“-g”選項。
          另外,這種方法也存在一定的不足,它不能調(diào)試模塊初始化的代碼,因為此時模塊初始化代碼已經(jīng)執(zhí)行過了。如果不執(zhí)行模塊的加載又無法獲得模塊插入地址,更不可能在模塊初始化之前設(shè)置斷點了。如果初始化部分有問題,那么將無法進行調(diào)試。遇到這樣的情況可以修改代碼,延遲初始化部分的執(zhí)行。另外,也可以采用以下替代方法:當插入內(nèi)核模塊時,內(nèi)核模塊機制將調(diào)用函數(shù)sys_init_module (kernel/modle.c)執(zhí)行對內(nèi)核模塊的初始化,該函數(shù)將調(diào)用所插入模塊的初始化函數(shù)。程序代碼片斷如下:

            …… ……
          if (mod->init != NULL)
           ret = mod->init();
            …… ……

            在該語句上設(shè)置斷點,也能在執(zhí)行模塊初始化之前停下來。

          2.2.2 調(diào)試Linux 2.6內(nèi)核模塊

            在Linux 2.6內(nèi)核系統(tǒng)中,由于module-init-tools工具的更改,insmod命令不再支持-m參數(shù),只有采取其他的方法來獲取模塊加載到內(nèi)核的地址。
            比較簡單的方式是修改內(nèi)核配置文件,使系統(tǒng)支持CONFIG_KALLSYMS,這樣就可以把相關(guān)的符號信息放到目錄/sys下,然后通過LinuxScope調(diào)試器加載相應的調(diào)試信息。
          Genernal Steup-→
          --- Configure standard kernel features (for small systems) [*] Load all symbols for debugging/ kksymoops
          有的系統(tǒng)可能還要:
          [*] Include all symbols in kallsyms
             當然也可以分析ELF文件以獲得模塊加載到內(nèi)存中的地址。我們知道程序中各段的意義如下:
            .text(代碼段):用來存放可執(zhí)行文件的操作指令,也就是說是它是可執(zhí)行程序在內(nèi)存種的鏡像。
            .data(數(shù)據(jù)段):數(shù)據(jù)段用來存放可執(zhí)行文件中已初始化全局變量,也就是存放程序靜態(tài)分配的變量和全局變量。
            .bss(BSS段):BSS段包含了程序中未初始化全局變量,在內(nèi)存中 bss段全部置零。
            .rodata(只讀段):該段保存著只讀數(shù)據(jù),在進程映象中構(gòu)造不可寫的段。
          通過在模塊初始化函數(shù)中放置一下代碼,也可以獲得模塊加載到內(nèi)存中的地址,只是這樣要麻煩一些。

          2.3 應用程序的調(diào)試 

            到了應用程序調(diào)試的階段,仿真器就可以“功成身退”了,剩下的調(diào)試任務(wù)就由LinuxScope調(diào)試器來獨自完成。此時只要在目標系統(tǒng)中啟動“gdbserver”,調(diào)試應用程序非常的方便。

          3 結(jié)語 

            面向行業(yè),應用和設(shè)備的嵌入式Linux工具軟件和嵌入式Linux操作系統(tǒng)平臺是未來發(fā)展的必然趨勢。跟蹤Linux社區(qū)的發(fā)展,符合標準,遵循開放是大勢所趨,人心所向,嵌入式Linux也不例外。Linux的進步為Linux在嵌入式領(lǐng)域的應用廣泛性提供了保證。本文所講述的仿真器技術(shù)加商業(yè)調(diào)試器技術(shù)可以極大的提高開發(fā)者的效率。

          參考文獻:
          [1] Ultimate Solution, Inc. LinuxScopeUserManual_1.0.0.2007
          [2] Peter Jay Salzman. Linux內(nèi)核驅(qū)動模塊編程指南. 2003
          [3] Karim Yaghmour. Building Embedded Linux Systems. 2003
          [4] Jonathan Corbet, Alessandro Rubini, and Greg Kroah-Hartman. Linux Device Drivers, Third Edition. 2005

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          linux相關(guān)文章:linux教程




          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();