<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 嵌入式Linux內核調試技術(shù)

嵌入式Linux內核調試技術(shù)

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

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

本文引用地址:http://dyxdggzs.com/article/73300.htm

摘 要:由于沒(méi)有對任何硬件平臺都通用的嵌入式Linux操作系統,開(kāi)發(fā)相應的嵌入式產(chǎn)品時(shí),必須對和驅動(dòng)程序進(jìn)行裁減、移植和調試。因此調試器對于程序員來(lái)說(shuō)是不可或缺的必備工具。本文主要講述如何使用BDI2000仿真器與LinuxScope-JTD調試器進(jìn)行嵌入式的調試,為嵌入式調試提供了一個(gè)便捷、高效的解決方案。
關(guān)鍵詞:嵌入式Linux  內核調試 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

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

1. 嵌入式系統開(kāi)發(fā)所面臨的問(wèn)題

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

1.1 涉及多種CPU 及多種OS

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

1.2 開(kāi)發(fā)工具種類(lèi)繁多

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

1.3 對目標系統的觀(guān)察和控制

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

2. 嵌入式Linux的調試

2.1嵌入式Linux內核的調試

2.1.1 編譯內核

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

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

2.1.2 內核調試

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



2.2 模塊內核調試

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

2.2.1 調試Linux 2.4內核模塊

  2.4內核模塊的調試比較簡(jiǎn)單,使用命令“insmod -m”來(lái)加載模塊。參數“-m”非常重要,它的功能是在把模塊加載到內存時(shí)產(chǎn)生一個(gè)加載map表。然后通過(guò)LinuxScope調試器加載相應的調試信息。例如:
[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調試器,它會(huì )把以上地址信息加入到gdb中進(jìn)行模塊功能的調試。

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

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

  在該語(yǔ)句上設置斷點(diǎn),也能在執行模塊初始化之前停下來(lái)。

2.2.2 調試Linux 2.6內核模塊

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

2.3 應用程序的調試 

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

3 結語(yǔ) 

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

參考文獻:
[1] Ultimate Solution, Inc. LinuxScopeUserManual_1.0.0.2007
[2] Peter Jay Salzman. Linux內核驅動(dòng)模塊編程指南. 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操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

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




關(guān)鍵詞: Linux內核 調試技術(shù)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>