1. 程式人生 > >linux 核心啟動除錯

linux 核心啟動除錯

使用printascii() 函式

除錯啟動資訊printascii輸出
1.配置核心除錯 DEBUG_LL
2在需要的地方增加函式外部宣告及引用

/****************************************/

在booting the kernel 之後Kernel 最先執行的是start_kernel() 函式,確認start_kernel() 有否執行就是在其開始程式碼段新增 printascii("start_kernel …") ,如果串列埠沒有打印出start_kernel …,說明start_kernel() 沒有執行,那麼可能的原因有Bootloader 配置的啟動引數錯誤、 Kernel 載入到(DDR) SDRAM 的地址不正確, Kernel 編譯時指定的(DDR) SDRAM 執行地址不正確等。這樣就需要一項一項排查錯誤,當錯誤被排查完畢,通常打印出 start_kernel …是種必然,如果打印出這儀資訊說明 Kernel已 進入到start_kernel()執行,如果此時有串列埠啟動列印就比較成功了,如果仍然沒有列印啟動資訊,就需要另外一種除錯技術。

附程式碼修改:init/main.c <<-

extern void printascii(const char*);     // Modify

asmlinkage void __init start_kernel(void)

{

    char * command_line;

    extern struct kernel_param __start___param[], __stop___param[];

    printascii("start_kernel …");        // Modify

    smp_setup_processor_id();

->>

Kernel 啟動除錯技術- 使用printascii() 函式列印printk() 快取資訊 ,如果Kernel已進入到start_kernel() 執行,仍然沒有啟動資訊打印出來,說明串列埠波特率出問題的可能性比較大,啟動資訊是暫時快取到臨時buffer--printk_buf 中的,進入start_kernel() 中會對串列埠波特率重新初始化,當初始化完成後,快取的系統啟動資訊便打印出來,不能列印說明用於串列埠波特率初始化的系統時鐘源沒有初始化正確,通常是系統時鐘源和實際的晶振頻率不一致導致的,通常排查和解決這個問題後,系統啟動資訊是能正確列印的。為了幫助解決問題,可以使用 printascii() 列印printk_buf 內容。這樣就能把 printascii()列印的系統資訊和預想的系統資訊進行比較,從而加快解決問題的進度。

附程式碼修改:kernel/printk.c   <<-

extern void printascii(const char*);    // Modify

static char printk_buf[1024];           // Modify

asmlinkage int printk(const char *fmt, ...)

{

    va_list args;

    int r;

    va_start(args, fmt);

    r = vprintk(fmt, args);

    va_end(args);

    printascii(printk_buf);            // Modify

    return r;

}

static int recursion_bug;

static int new_text_line = 1;

//static char printk_buf[1024];        // Modify

->>

如上是Kernel 裁減移植過程中最重要的兩個啟動除錯技術,靈活使用將帶來工作效率的提升,不管硬體平臺是那種ARM 或者其它型別的CPU ,也不管是哪個 Kernel 版本(如Linux-2.6.24 、Linux-2.6.30 等 都可以採用這兩個啟動除錯技術解決實際問題。為了支援 printascii() 函式,需要在 Kernel 裁減中(make menuconfig )新增Kernel hacking ->[*]Kernel low - level debugging functions 的支援。

我的補充:

1/ 可以在/kernel/head.s裡新增列印看是否跑到mmu開啟前:

__turn_mmu_on:

    //列印一個字元a

    mov r9,r0

    mov r0,'a'

    bl printascii //該函式位於arch/arm/kernel/debug.s,呼叫了 include/mach/debug-macro.S

    mov r0,r9
    //現在開啟mmu
    mov    r0, r0
    mcr    p15, 0, r0, c1, c0, 0        @ write control reg
    mrc    p15, 0, r3, c0, c0, 0        @ read id reg
    mov    r3, r3
    mov    r3, r3
    mov    pc, r13    /*實際呼叫了__switch_data,在head-common.s*/

2/ 一般按樓上方法,在startkernel就可以打印出來,如果:在第一步可以列印,而開啟mmu後不能列印,那絕對是虛擬地址對映問題,這個問題我搞了2天了....

3/ 如果還沒有反應,就要檢查串列埠列印那段 debug-macro.S 是否有問題了。

總結一下:

/compressed/head.s和/kernel/head.s基本上不用改,看檔案頭,2001年寫的,就知道了.呵呵.

相關推薦

linux 核心啟動除錯

使用printascii() 函式 除錯啟動資訊printascii輸出 1.配置核心除錯 DEBUG_LL 2在需要的地方增加函式外部宣告及引用 /****************************************/ 在booting the kernel 之後Kernel 最先執行的是st

初識 Linux Kernel 移植 之 核心啟動除錯

在linux kernel 移植時,從u-boot跳轉到kernel啟動階段後,串列埠控制檯只打印了核心解壓完成的資訊: Uncompressing Linux... done, booting the kernel. 這段訊息的意思是核心解壓完成,接下就進

如何調整Linux核心啟動中的驅動初始化順序-驅動載入優先順序

轉載自:http://zhidao.baidu.com/link?url=adCsiTiI7i3QVYrTx19jkt_FvBV2VlQ4NV18pEu6Kdi4Yhv0ryauD3LHj1pxGE-YP8M_PxZnHNy-hVKBvzJOkPfqehZmR9CQm5GZ5XZDx-O Lin

Linux 核心動態除錯

轉載地址:https://blog.csdn.net/u014782704/article/details/78092846 原始碼使用pr_debug(), pr_info(), pr_err()等pr_xxx()家族列印函式 需要列印時(即動態除錯), 在命令列輸入以下命令, 包含在fu

Linux核心啟動過程分析(十)-----RTC驅動分析

參考https://blog.csdn.net/xuao20060793/article/details/46433263這篇博文 RTC驅動分析: Class.c (drivers\rtc):subsys_initcall(rtc_init); static int __init

Linux核心啟動第二階段之setup_arch函式分析

轉自:http://blog.chinaunix.net/uid-20672257-id-2383451.html 執行setup_arch()函式 回到start_kernel當中,569行,呼叫setup_arch函式,傳給他的引數是

Linux核心啟動流程分析(一)

1. 依據arch/arm/kernel/vmlinux.lds 生成linux核心原始碼根目錄下的vmlinux,這個vmlinux屬於未壓縮,帶除錯資訊、符號表的最初的核心,大小約23MB;  命令:arm-linux-gnu-ld -o vmlinux -T a

linux核心啟動中的初始化

                轉自 http://blog.csdn.net/mayaoyao11/article/details/6636977 【問題】 此處我要實現的是將晶片的ID用於網絡卡MAC地址,網絡卡驅動是enc28j60_init。 但是,讀取晶片ID的函式,在as352x_afe

omapl138移植uboot系列之修改移植TI官方移植的Linux核心(啟動核心第二篇)

修改Linux核心原始碼     實際上,剛剛我們已經成功的啟動了TI移植過的Linux核心,但是從串列埠控制檯的現象來看,“Starting Kernel”之後什麼資訊都沒有輸出,這就需要我們在TI移植過的核心原始碼之上進行相應修改,以適合我們的639A板卡。

Android 8.0 系統啟動流程之Linux核心啟動--kernel_init程序(三)

    在上一篇文章中詳細的分析了kthreadd程序的啟動,init程序也是有idle程序去觸發啟動的,init程序分為前後兩部分,前一部分是在核心啟動的,主要是完成建立和核心初始化工作,內容都是跟Linux核心相關的;後一部分是在使用者空間啟動的,主要完成A

linux 核心啟動錯誤和selinux引數 Kernel panic -not syncing:Attempted to kill init

今天在裝某個軟體的時候,修改了selinux引數。修改selinux 的某個引數值為Disable。導致 linux系統不能啟動。出現如下錯誤 Kernel panic -not syncing:Attempted to kill init! 後經過向群友請教和

國嵌視訊學習---linux核心啟動流程

一、核心檔案uImage的構成 uImage:Uboot header和zImage zImage:解壓程式碼和壓縮後的vmlinux映象 二、zImage核心的構成 其中解壓程式碼由Head.s和misc.s組成。 三、vmlinux核心構成 1.啟動程式碼部分:

Linux核心啟動資訊能過串列埠輸出

只需要在GRUB的配置檔案中加上核心引數 console=tty0 console=ttyS0,115200,如下 linux    /boot/vmlinuz-3.0.0-15-generic root=UUID=eb9f0676-556e-42c2-9681-52d7c

Linux核心啟動過程概述 Linux核心啟動過程概述

Linux核心啟動過程概述    版權宣告:本文原創,轉載需宣告作者ID和原文連結地址。     Hi!大家好,我是CrazyCatJack。今天給大家帶來的是Linux核心啟動過程概述。希望能夠幫助大家更好的理解Linux核心的啟動,並且創造出自己的核

使用gdb跟蹤Linux核心啟動過程

孫業毅 原創作品 轉載請註明出處 第三講構造一個簡單的Linux系統MenuOS  @2015.03 1. 背景介紹 這節課的實驗是使用gdb除錯執行一個簡單的Linxu系統,使用的實驗樓提供的虛擬機器環境(http://www.shiyanlou.com/cou

[Hi3519v101] 核心啟動除錯資訊

System startup U-Boot 2010.06 (Dec 11 2018 - 18:11:51) Check Flash Memory Controller v100 ... Found SPI Nor(cs 0) ID: 0xc2 0x20 0x19 Block:64KB C

linux 核心啟動流程(涉及到根檔案系統的問題)

Linux核心啟動及檔案系統載入過程 當u-boot開始執行bootcmd命令。就進入Linux核心啟動階段,與u-boot類似,普通Linux核心的啟動過程也能夠分為兩個階段,但針對壓縮了的核心如uImage就要包含核心自解壓過程了。本文以linux-2.6.37版原始

Linux 核心啟動資訊的列印 --- dev_driver_string函式/dev_name函式

核心啟動時,常會打印出一些資訊:開頭是 "驅動模組的名字: + 具體的資訊"如:在執行的linux系統裝置上,插入滑鼠,就會打印出滑鼠的相關資訊;[ 402.134068] input: USB Optical Mouse as /devices/soc0/soc/2100

控制Linux核心啟動中的列印

如果正常配置了輸入輸出終端,則核心啟動過程中會將很多資訊輸出到控制檯上。這些資訊中有些表示嚴重錯誤,有些只是一般的提示資訊。 在平臺成熟後,繼續保留這些資訊既不美觀,也會影響啟動速度(串列埠的波特率很低)。因此要儘量遮蔽不重要的資訊。這需要對核心進行一些改造。

Linux Kernel Boot Parameters(Linux核心啟動引數)

The following is a consolidated list of the kernel parameters as implemented (mostly) by the __setup() macro and sorted into English D