嵌入式Linux之Kernel(裁減移植)啟動調(diào)試打印技術(shù)_第1頁
嵌入式Linux之Kernel(裁減移植)啟動調(diào)試打印技術(shù)_第2頁
嵌入式Linux之Kernel(裁減移植)啟動調(diào)試打印技術(shù)_第3頁
嵌入式Linux之Kernel(裁減移植)啟動調(diào)試打印技術(shù)_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、嵌入式系統(tǒng)搭建過程中,對于系統(tǒng)平臺搭建工程師在完成Bootloader的調(diào)試之后就進(jìn)入Kernel裁減移植的階段,其中最重要的一步是 Kernel 啟動的調(diào)試,在調(diào)試 Kernel 過程中通常遇到最常見的問題是啟動異常 :Uncompressing Linux. done, booting the kernel.(掛死在此處 )注意:這里是arch/arm/boot/compressed/head.S的解壓過程,調(diào)用了錄下的 misc.c)->include/asm-arm/arch-xxx/uncompress.h的 putc()的,用的是物理地址,因為此時內(nèi)核還沒有起來。decomp

2、ress_kernel()(同目實現(xiàn)。這是在uboot 中初始化而 printascii則是調(diào)用了匯編。 printascii()位于 arch/arm/kernel/debug.S,他需要調(diào)用虛擬地址,此虛擬地址通過machine_start提供,而相關(guān)的宏在include/asm/arch-xxx/debug-macro.S現(xiàn),這下明白了。實10-05-14 添加: debug.s段的 head.s ,mmu是 1:1是虛擬地址了。里面需要判斷一下當(dāng)前是否打開了映射,目的是加快速度。到了內(nèi)核的mmu,然后指定 uart 的基址。在解壓階 head.s ,就是真正的 mmu了,此時就導(dǎo)致驅(qū)動

3、異常(啟動掛死)的原因有很多,如基于 EVM 板的 硬件做了修改(如更改了 FLASH 空間大小、地址和型號,更改了 SDRAM、DDR SDRAM空間大小、地址和型號,更改了晶振頻率等),板卡ID 號不支持等。那么如何進(jìn)行調(diào)試那,其實有兩種調(diào)試技術(shù)比較有效。Kernelkernel啟動調(diào)試技術(shù)之后 Kernel- 使用 printascii()函數(shù)跟蹤最先執(zhí)行的是start_kernel()start_kernel()有沒運行,在 booting the函數(shù),確認(rèn) start_kernel()有否執(zhí)行就是在其開始代碼段添加printascii("start_kernel"

4、),如果串口沒有打印出start_kernel,說明start_kernel()沒有運行,那么可能的原因有Bootloader配置的啟動參數(shù)錯誤、Kernel加載到(DDR) SDRAM的地址不正確,Kernel編譯時指定的 (DDR) SDRAM運行地址不正確等。這樣就需要一項一項排查錯誤,當(dāng)錯誤被排查完畢,通常打印出 start_kernel 是種必然,如果打印出這儀信息說明 Kernel 已 進(jìn)入到 start_kernel() 執(zhí)行,如果此時有串口啟動打印就比較成功了, 如果仍然沒有打印啟動信息,就需要另外一種調(diào)試技術(shù)。附代碼修改:init/main.c <<-extern

5、 void printascii(const char*); asmlinkage void _init start_kernel(void)/ Modifychar * command_line;extern struct kernel_param _start_param, _stop_param;printascii("start_kernel");/ Modifysmp_setup_processor_id();->>Kernel 啟動調(diào)試技術(shù) - 使用 printascii()函數(shù)打印 printk()緩存信息 ,如果 Kernel 已進(jìn)入到start

6、_kernel()執(zhí)行,仍然沒有啟動信息打印出來,說明串口波特率出問題的可能性比較大,啟動信息是暫時緩存到臨時 buffer-printk_buf中的,進(jìn)入 start_kernel()中會對串口波特率重新初始化,當(dāng)初始化完成后,緩存的系統(tǒng)啟動信息便打印出來,不能打印說明用于串口波特率初始化的系統(tǒng)時鐘源沒有初始化正確, 通常是系統(tǒng)時鐘源和實際的晶振頻率不一致導(dǎo)致的,通常排查和解決這個問題后,系統(tǒng)啟動信息是能正確打印的。 為了幫助解決問題, 可以使用 printascii()打印 printk_buf內(nèi)容。這樣就能把 printascii()打印的系統(tǒng)信息和預(yù)想的系統(tǒng)信息進(jìn)行比較,從而加快解決問

7、題的進(jìn)度。附代碼修改: kernel/printk.c<<-extern void printascii(const char*);/ Modifystatic char printk_buf1024;/ Modifyasmlinkage int printk(const char *fmt, .)va_list args;int r;va_start(args, fmt);r = vprintk(fmt, args);va_end(args);printascii(printk_buf);/ Modifyreturn r;static int recursion_bug;stat

8、ic int new_text_line = 1;/static char printk_buf1024;/ Modify->>如上是 Kernel 裁減移植過程中最重要的兩個啟動調(diào)試技術(shù),靈活使用將帶來工作效率的提升,不管硬件平臺是那種 ARM或者其它類型的 CPU ,也不管是哪個 Kernel 版本(如、等 都可以采用這兩個啟動調(diào)試技術(shù)解決實際問題。為了支持 printascii()函數(shù),需要在 Kernel裁減中( make menuconfig)添加 Kernel hacking ->? Kernel low - level debugging functions的支

9、持。我的補充 :1/可以在 /kernel/head.s里添加打印看是否跑到mmu開啟前 :_turn_mmu_on:/ 打印一個字符 a mov r9,r0mov r0,'a'blprintascii/該函數(shù)位于arch/arm/kernel/debug.s,調(diào)用了include/mach/debug-macro.Smov r0,r9/ 現(xiàn)在開啟 mmumovr0, r0mcrp15, 0, r0, c1, c0, 0 write control regmrcp15, 0, r3, c0, c0, 0 read id regmovr3, r3movr3, r3movpc, r13/* 實際調(diào)用了 _switch_data,在 head-common.s*/2/一般按樓上方法 , 在 startkernel就可以打印出來 , 如果 : 在第一步可以打印, 而開啟 mmu后不能打

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論