1. 程式人生 > >Linux核心工程導論——核心除錯

Linux核心工程導論——核心除錯

         核心也是一個程式,一般的,除錯程式常用的方法有3種:列印資訊、斷點執行和插入探測點。

列印資訊

printk

         最常用的是printk,可以修改核心程式碼,在任何想要列印的地方列印資訊。

健壯性是printk最容易被接受的一個特質,幾乎在任何地方,任何時候核心都可以呼叫它(中斷上下文、程序上下文、持有鎖時、多處理器處理時等)。

在系統啟動過程中,終端初始化之前,在某些地方是不能呼叫的。如果真的需要除錯系統啟動過程最開始的地方,有以下方法可以使用:

l  使用串列埠除錯,將除錯資訊輸出到其他終端裝置。

l  使用early_printk(),該函式在系統啟動初期就有列印能力。但它只支援部分硬體體系。

printk和printf一個主要的區別就是前者可以指定一個LOG等級。核心根據這個等級來判斷是否在終端上列印訊息。核心把比指定等級高的所有訊息顯示在終端。可以使用下面的方式指定一個LOG級別:

printk(KERN_CRIT  “Hello, world!\n”);

注意,第一個引數並不一個真正的引數,因為其中沒有用於分隔級別(KERN_CRIT)和格式字元的逗號(,)。KERN_CRIT本身只是一個普通的字串(事實上,它表示的是字串 "<2>";表 1 列出了完整的日誌級別清單)。作為預處理程式的一部分,C 會自動地使用一個名為字串串聯 的功能將這兩個字串組合在一起。組合的結果是將日誌級別和使用者指定的格式字串包含在一個字串中。

核心使用這個指定LOG級別與當前終端LOG等級console_loglevel來決定是不是向終端列印。

注意,如果呼叫者未將日誌級別提供給printk,那麼系統就會使用預設值 KERN_WARNING "<4>"(表示只有KERN_WARNING 級別以上的日誌訊息會被記錄)。由於預設值存在變化,所以在使用時最好指定LOG級別。有LOG級別的一個好處就是我們可以選擇性的輸出LOG。比如平時我們只需要列印KERN_WARNING級別以上的關鍵性LOG,但是除錯的時候,我們可以選擇列印KERN_DEBUG等以上的詳細LOG。而這些都不需要我們修改程式碼,只需要通過命令修改預設日誌輸出級別:

[email protected] :~$ cat /proc/sys/kernel/printk

4 4 1 7

[email protected] :~$ cat/proc/sys/kernel/printk_delay

0

[email protected] :~$ cat/proc/sys/kernel/printk_ratelimit

5

[email protected] :~$ cat/proc/sys/kernel/printk_ratelimit_burst

10

第一項定義了 printk API 當前使用的日誌級別。這些日誌級別表示了控制檯的日誌級別、預設訊息日誌級別、最小控制檯日誌級別和預設控制檯日誌級別。printk_delay 值表示的是 printk 訊息之間的延遲毫秒數(用於提高某些場景的可讀性)。注意,這裡它的值為 0,而它是不可以通過 /proc 設定的。printk_ratelimit 定義了訊息之間允許的最小時間間隔(當前定義為每 5 秒內的某個核心訊息數)。訊息數量是由 printk_ratelimit_burst 定義的(當前定義為 10)。如果您擁有一個非正式核心而又使用有頻寬限制的控制檯裝置(如通過串列埠),那麼這非常有用。注意,在核心中,速度限制是由呼叫者控制的,而不是在printk 中實現的。如果一個 printk 使用者要求進行速度限制,那麼該使用者就需要呼叫printk_ratelimit 函式。

·核心訊息都被儲存在一個LOG_BUF_LEN大小的環形佇列中。

  關於LOG_BUF_LEN定義:

CONFIG_LOG_BUF_SHIFT=18

  記錄緩衝區操作:

  ① 訊息被讀出到使用者空間時,此訊息就會從環形佇列中刪除。

  ② 當訊息緩衝區滿時,如果再有printk()呼叫時,新訊息將覆蓋佇列中的老訊息。

  ③ 在讀寫環形佇列時,同步問題很容易得到解決。

  ※ 這個紀錄緩衝區之所以稱為環形,是因為它的讀寫都是按照環形佇列的方式進行操作的。

oops與ksymoops、kallsyms

oops是程式執行崩潰,應用程式或核心執行緒的崩潰都會產生oops訊息,通常發生oops時,系統不會發生宕機,而在終端或日誌中列印oops資訊。當使用NULL指標或不正確的指標值時,通常會引發一個 oops 訊息,這是因為當引用一個非法指標時,頁面對映機制無法將虛擬地址映像到實體地址,處理器就會向作業系統發出一個"頁面失效"的訊號。核心無法"換頁"到並不存在的地址上,系統就會產生一個"oops"。

oops 顯示發生錯誤時處理器的狀態,包括 CPU 暫存器的內容、頁描述符表的位置,以及其一些難理解的資訊。這些訊息由失效處理函式(arch *(int *)0 = 0; return 0; }

在 Linux 中,除錯系統崩潰的傳統方法是分析在發生崩潰時傳送到系統控制檯的 Oops 訊息。一旦您掌握了細節,就可以將訊息傳送到 ksymoops 實用程式,它將試圖將程式碼轉換為指令並將堆疊值對映到核心符號。

※ 如:回溯線索中的地址,會通過ksymoops轉化成名稱可見的函式名。

還可以直接在核心編譯時新增kallsyms,就不需要使用ksymoops工具了。

klogd

klogd 提供了許多資訊來幫助分析。為了使 klogd 正確地工作,必須在 /boot 中提供符號表檔案 System.map。如果符號表與當前核心不匹配,klogd 就會拒絕解析符號。

核心本身的列印資訊會通過/proc/kmsg顯示,或者呼叫dmsg命令檢視。

BUG_ON

在程式碼裡面老能看到 BUG_ON() ,WARN_ON() 這樣的巨集,類似我們日常程式設計裡面的斷言(assert)。在include/asm-generic/bug.h裡定義。

動態除錯

動態除錯是通過動態的開啟和禁止某些核心程式碼來獲取額外的核心資訊。

首先核心選項CONFIG_DYNAMIC_DEBUG應該被設定。所有通過pr_debug()/dev_debug()列印的資訊都可以動態的顯示或不顯示。

可以通過簡單的查詢語句來篩選需要顯示的資訊。原始檔名、函式名、行號(包括指定範圍的行號)、模組名、格式化字串。將要列印資訊的格式寫入<debugfs>/dynamic_debug/control中。

插入探測點:kprobe

         核心中的對應機制是kprobe。kprobe是由IBM的Dprobe專案發展而來。使用過iptables的都知道,定義的規則實際上是在正常的核心程式碼執行流程中插入的鉤子函式。而鉤子函式不但能用來過濾和執行變化,還能用來除錯。

         kprobe支援3種除錯方式:第一種就叫做kprobe,用來在特定的核心程式碼位置新增程式碼(相當於自己手動添加了核心程式碼再編譯執行)。第二種jprobe,可以用於除錯核心函式的傳入引數。第三種是kretprobe,用於除錯核心函式的返回值。

         kprobe是通過回撥的形式執行的,因此就有三種可能的回撥方式:執行前、執行後和出錯時的回撥。

         使用kprobe一方面要在核心配置中開啟kprobe支援,另一方面要在使用者端使用工具,這個工具是systemtab。使用這個工具編寫的指令碼在執行時其會在後臺編譯生成核心模組,插入核心與kprobe的核心部分協作完成功能。

         那麼kprobe是如何做到的呢?利用異常。當定義了插入點後,kprobe的核心部分就會在記憶體中將插入點附近的程式碼儲存起來,用觸發異常的程式碼替換,當執行到這裡的時候異常被觸發,回撥函式被執行,執行完畢後恢復被儲存的正常程式碼執行。

斷點執行

kgdb

kgdb提供了一種使用 gdb除錯 Linux 核心的機制。使用KGDB可以象除錯普通的應用程式那樣,在核心中進行設定斷點、檢查變數值、單步跟蹤程式執行等操作。使用KGDB除錯時需要兩臺機器,一臺作為開發機(Development Machine),另一臺作為目標機(Target Machine),兩臺機器之間通過串列埠或者乙太網口相連。串列埠連線線是一根RS-232介面的電纜,在其內部兩端的第2腳(TXD)與第3腳(RXD)交叉相連,第7腳(接地腳)直接相連。除錯過程中,被除錯的核心執行在目標機上,gdb偵錯程式執行在開發機上。

kgdb補丁的主要作用是在Linux核心中添加了一個除錯Stub。除錯Stub是Linux核心中的一小段程式碼,提供了執行gdb的開發機和所除錯核心之間的一個媒介。gdb和除錯stub之間通過gdb序列協議進行通訊。gdb序列協議是一種基於訊息的ASCII碼協議,包含了各種除錯命令。當設定斷點時,kgdb負責在設定斷點的指令前增加一條trap指令,當執行到斷點時控制權就轉移到除錯stub中去。此時,除錯stub的任務就是使用遠端序列通訊協議將當前環境傳送給gdb,然後從gdb處接受命令。gdb命令告訴stub下一步該做什麼,當stub收到繼續執行的命令時,將恢復程式的執行環境,把對CPU的控制權重新交還給核心。

這個流程與kprobe很相似。

kdb核心偵錯程式

Kdb(Kernel Debug)是SGI公司開發的遵循GPL的內建Linux核心除錯工具。標準的Linux核心不包括kdb,需要從ftp://oss.sgi.com/www/projects/kdb/download/ix86下載對應標準版本核心的kdb補丁,對標準核心打補丁,然後,編譯打過補丁的核心程式碼。目前kdb支援包括x86(IA32)、IA64和MIPS在內的體系結構。

Kdb偵錯程式是Linux核心的一部分,提供了檢查記憶體和資料結構的方法。通過附加命令,它可以格式化顯示給定地址或ID的基本系統資料結構。kdb當前的命令集可以完全控制核心的操作,包括單步執行一個處理器、在指定的指令執行處理暫停、在訪問或修改指定虛擬記憶體的位置暫停、在輸入-輸出地址空間對一個暫存器訪問處暫停、通過程序ID跟蹤任務、指令反彙編等。

其他方法:

kexec

kexec是一套系統呼叫,允許使用者從當前正執行的核心裝載另一個核心。使用者可用shell命令"yum install kexec-tools"安裝kexec工具包,安裝後,就可以使用kexec命令。

工具kexec直接啟動進入一個新核心,它通過系統呼叫使使用者能夠從當前核心裝載並啟動進入另一個核心。在當前核心中,kexec執行BootLoader的功能。在標準系統啟動和kexec啟動之間的主要區別是:在kexec啟動期間,依賴於硬體構架的韌體或BIOS不會被執行來進行硬體初始化。這將大大降低重啟動的時間。

為了讓核心的kexec功能起作用,核心編譯配置是應確認先擇了"CONFIG_KEXEC=y",在配置後生成的.config檔案中應可看到此條目。

工具kexec的使用分為兩步,首先,用kexec將除錯的核心裝載進記憶體,接著,用kexec啟動裝載的核心。

裝載核心的語法列出如下:

kexec -lkernel-image --append=command-line-options --initrd=initrd-image

上述命令中,引數kernel-image為裝載核心的對映檔案,該命令不支援壓縮的核心映像檔案bzImage,應使用非壓縮的核心對映檔案vmlinux;引數initrd-image為啟動時使用initrd對映檔案;引數command-line-options為命令列選項,應來自當前核心的命令列選項,可從檔案"/proc/cmdline"中提取,該檔案的內容列出如下:

^-^$ cat/proc/cmdline

roroot=/dev/VolGroup00/LogVol00 rhgb quiet

例如:使用者想啟動的核心對映為/boot/vmlinux,initrd為/boot/initrd,則kexec載入命令列出如下:

Kexec –l/boot/vmlinux –append=/dev/VolGroup00/LogVol00 initrd=/boot/initrd

還可以加上選項-p或--load-panic,表示裝載新核心在系統核心崩潰使用。

在核心裝載後,用下述命令啟動裝載的核心,並進行新的核心中執行:

kexec -e

當kexec將當前核心遷移到新核心上執行時,kexec拷貝新核心到預保留記憶體塊,該保留位置如圖1所示,原系統核心給kexec裝載核心預保留一塊記憶體(在圖中的陰影部分),用於裝載新核心,其他記憶體區域在未裝載新核心時,由原系統核心使用。

kdump

kdump是基於kexec的崩潰轉儲機制(kexec-basedCrash Dumping),無論核心核心需要轉儲時,如:系統崩潰時,kdump使用kexec快速啟動進入轉儲捕捉的核心。在這裡,原執行的核心稱為系統核心或原核心,新裝載執行的核心稱為轉儲捕捉的核心或裝載核心或新核心。

在重啟動過程中,原核心的記憶體映像被儲存下來,並且轉儲捕捉的核心(新裝載的核心)可以訪問轉儲的映像。使用者可以使用命令cp和scp將記憶體對映拷貝到一個本地硬碟上的轉儲檔案或通過網路拷貝到遠端計算機上。

當前僅x86, x86_64, ppc64和ia64構架支援kdump和kexec。

當系統核心啟動時,它保留小部分記憶體給轉儲(dump)捕捉的核心,確保了來自系統核心正進行的直接記憶體訪問(Direct Memory Access:DMA)不會破壞轉儲捕捉的核心。命令kexec –p裝載新核心到這個保留的記憶體。

在崩潰前,所有系統核心的核心映像編碼為ELF格式,並存儲在核心的保留區域。ELF頭的開始實體地址通過引數elfcorehdr=boot傳遞到轉儲捕捉的核心。

通過使用轉儲捕捉的核心,使用者可以下面兩種方式訪問記憶體映像或舊記憶體:

(1)通過/dev/oldmem裝置介面,捕捉工具程式能讀取裝置檔案並以原始流的格式寫出記憶體,它是一個記憶體原始流的轉儲。分析和捕捉工具必須足夠智慧以判斷查詢正確資訊的位置。

(2)通過/proc/vmcore,能以ELF格式檔案輸出轉儲資訊,使用者可以用GDB(GNU Debugger)和崩潰除錯工具等分析工具除錯轉儲檔案。

(3)建立快速重啟動機制和安裝工具

1)安裝工具kexec-tools

可以下載原始碼編譯安裝工具kexec-tools。由於工具kexec-tools還依賴於一些其他的庫,因此,最好的方法是使用命令"yum install kexec-tools"從網上下載安裝並自動解決依賴關係。

2)編譯系統和轉儲捕捉的核心

可編譯獨立的轉儲捕捉核心用於捕捉核心的轉儲,還可以使用原系統核心作為轉儲捕捉核心,在這種情況下,不需要再編譯獨立的轉儲捕捉核心,但僅支援重定位核心的構架才可以用作轉儲捕捉的核心,如:構架i386和ia64支援重定位核心。

SysRq魔術組合鍵列印核心資訊

SysRq"魔術組合鍵"是一組按鍵,由鍵盤上的"Alt+SysRq+[CommandKey]"三個鍵組成,其中CommandKey為可選的按鍵。SysRq魔術組合鍵根據組合鍵的不同,可提供控制核心或列印核心資訊的功能。SysRq魔術組合鍵的功能說明如表1所示。

1 SysRq組合鍵的功能說明

鍵名

功能說明

b

在沒有同步或解除安裝硬碟的情況下立即啟動。

c

為了獲取崩潰轉儲執行kexe重啟動。

d

顯示被持的所有鎖。

e

傳送訊號SIGTERM給所有程序,除了init外。

f

將呼叫oom_kill殺死記憶體熱程序。

g

在平臺ppcsh上被kgdb使用。

h

顯示幫助資訊。

i

傳送訊號SIGKILL給所有的程序,除了init外。

k

安全訪問金鑰(Secure Access KeySAK)殺死在當前虛擬終端上的所有程式。

m

轉儲當前的記憶體資訊到控制檯。

n

用於設定實時任務為可調整nice的。

o

將關閉系統(如果配置為支援)。

p

列印當前暫存器和標識到控制檯。

q

將轉儲所有正執行定時器的列表。

r

關閉鍵盤Raw模式並設定為XLATE模式。

s

嘗試同步所有掛接的檔案系統。

t

將轉儲當前的任務列表和它們的資訊到控制檯。

u

嘗試以僅讀的方式重掛接所有已掛接的檔案系統。

v

轉儲Voyager SMP處理器資訊到控制檯。

w

轉儲的所有非可中斷(已阻塞)狀態的任務。

x

在平臺ppc/powerpc上被xmonX監視器)介面使用。

0~9

裝置控制檯日誌級別,控制將列印到控制檯的核心資訊。例如:0僅列印緊急資訊,如:PANICOOPS資訊。

預設SysRq組合鍵是關閉的。可用下面的命令開啟此功能:

# echo 1> /proc/sys/kernel/sysrq

關閉此功能的命令列出如下:

# echo 0> /proc/sys/kernel/sysrq

命令strace

命令strace 顯示程式呼叫的所有系統呼叫。使用 strace 工具,使用者可以清楚地看到這些呼叫過程及其使用的引數,瞭解它們與作業系統之間的底層互動。當系統呼叫失敗時,錯誤的符號值(如 ENOMEM)和對應的字串(如Out of memory)都能被顯示出來。

strace 的另一個用處是解決和動態庫相關的問題。當對一個可執行檔案執行ldd時,它會告訴你程式使用的動態庫和找到動態庫的位置。

鎖驗證器

鎖除錯核心鎖驗證器(Kernel lockvalidator)可以在死鎖發生前檢測到死鎖,即使是很少發生的死鎖。它將每個自旋鎖與一個鍵值相關,相似的鎖僅處理一次。加鎖時,檢視所有已獲取的鎖,並確信在其他上下文中沒有已獲取的鎖,在新獲取鎖之後被獲取。解鎖時,確信正被解開的鎖在已獲取鎖的頂部。

當加鎖動態發生時,鎖驗證器對映所有加鎖規則,該檢測由核心的spinlocks、rwlocks、mutexes和rwsems等鎖機制觸發。不管何時鎖合法性檢測器子系統檢測到一個新加鎖場景,它檢查新規則是否違反正存在的規則集,如果新規則與正存在的規則集一致,則加入新規則,核心正常執行。如果新規則可能建立一個死鎖場景,那麼這種建立死鎖的條件會被打印出來。

當判斷加鎖的有效性時,所有可能的"死鎖場景"會被考慮到:假定任意數量的CPU、任意的中斷上下文和任務上下文群、執行所有正存在的加鎖場景的任意組合。在一個典型系統中,這意味著有成千上萬個獨立的場景。這就是為什麼稱它為"加鎖正確性"驗證器,對於所有被觀察的規則來說,鎖驗證器用數學的確定性證明死鎖不可能發生,假定鎖驗證器實現本身正確,並且它內部的資料結構不會被其他核心子系統弄壞。

硬體模擬

         vmware建立虛擬機器,可以模擬兩臺電腦的互連,由於vmware軟體的高質量,不必擔心模擬的不如真實的。

         skyeye也可以模擬硬體,它是一個純粹的硬體模擬平臺,對於開發arm的嵌入式系統上的linux十分有用。

使用UML除錯Linux核心是在本機的linux上除錯linux的好方法,User-modeLinux(UML)可以在使用者端作為程序執行linux核心,如此可以輕鬆的使用gdb等使用者端除錯程式。

相關推薦

Linux核心工程導論——核心除錯

         核心也是一個程式,一般的,除錯程式常用的方法有3種:列印資訊、斷點執行和插入探測點。 列印資訊 printk          最常用的是printk,可以修改核心程式碼,在任何想要列印的地方列印資訊。 健壯性是printk最容易被接受的一個特質,幾乎在任

Linux核心工程導論——資料結構:樹

樹 樹作為一種很常用的資料結構,主要包括二叉搜尋數(BST)、多路搜尋樹(B-樹)、B樹根據葉子節點樹分為二叉樹和多叉樹。根據左右節點是否高度上對稱,分為平衡樹和非平衡樹,平衡樹的一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡樹。簡單的說

Linux核心工程導論——資料結構:連結串列與雜湊

         scatterlist table由於可以被拼接(chain),不同的scatterlist如果所指向的記憶體是相鄰的還可以被合併,所以其遍歷格外複雜。1.4 llistllist全稱是Lock-less NULL terminated single linked list,意思是不需要加鎖

Linux核心工程導論——程序:ELF檔案執行原理(2)

ELF強符號與弱符號(本小節是轉別人的)我們經常在程式設計中碰到一種情況叫符號重複定義。多個目標檔案中含有相同名字全域性符號的定義,那麼這些目標檔案連結的時候將會出現符號重複定義的錯誤。比如我們在目標檔案A和目標檔案B都定義了一個全域性整形變數global,並將它們都初始化,

Linux核心工程導論——前言

想要研究linux核心,使用linux核心,首先要知道linux核心能做到什麼,提供了什麼。我看過很多初學者一進入公司就開始使用linux核心開發核心模組,使用的無論是通訊方式、記憶體介面還是裝置介面仍都是核心早已淘汰掉的。原因是他們通常是直接在網路上搜索來如何完成工作的。

linux核心工程導論-Linux使用者和許可權系統

Linux使用者和許可權系統簡介我們使用linux系統,一定會使用一個使用者,沒有使用者就不可能使用任何的系統功能,包括系統呼叫。因為系統呼叫本身也是要有使用者的。我們剛登入一個系統,需要一個login程式,驗證了使用者名稱密碼之後,就會返回給你一個shell。後面執行的內容

Linux核心工程導論——網路:Netfilter概覽

簡介最早的核心包過濾機制是ipfwadm,後來是ipchains,再後來就是iptables/netfilter了。再往後,也就是現在是nftables。不過nftables與iptables還處於爭雄階段,誰能勝出目前還沒有定論。但是他們都屬於netfilter專案的子成員

Linux核心工程導論——linux學習和職業曲線(初學者,中級,高階都可參考)

Linux世界介紹 給自己定級 門外漢: 不會安裝作業系統 不會用虛擬機器(安裝和使用) 入門級: 熟悉常見的發行版,甚至裝過並且能用一些特殊發行版(例如kali)做過一些簡單的圖形介面的使用。 會一些最基礎的命令(例如cd、ps、top、ls、

linux核心工程導論-網路:tcp擁塞控制

這篇文章本來是在tcp那篇裡面的,但是那篇太長了,不專一。就完善了一下提取出來了。 TCP擁塞控制        擁塞控制討論的是很多個同時存在的tcp連線應該怎麼規劃自己的資料包傳送和接收速度,以在彼此之間共享頻寬,同時與其他實體的機器公平的競爭頻寬,

建立、編輯linux核心工程

用過source insight、vim(未使用外掛)建立編寫linux核心工程,一直想找個更合適的工具。畢竟,source insight是商業軟體,而vim如果不使用外掛還是不怎麼方便。瞭解到vim和emacs都可以用外掛構建出原始碼工程,嘗試過emacs沒能成功,也許是我用vim已經習慣了,最

Linux核心之GDB基本除錯方法

Oops[#1]:Cpu 0$ 0   : 00000000 10008d00 00000000 ffffffea$ 4   : fffffdfd 10008d01 00000001 00000000$ 8   : 00000000 7fed2e40 00001cb2 00000b3b$12   : 0003

linux核心:systemtap核心除錯 例子

¶ virtualization/kvm_service_time.stp - Time Statistics on KVM Exit Reasons keywords: VIRTUALIZATION KVM  The kvm_service_time.stp script tracks the st

linux-2-6-11核心除錯環境搭建

linux核心除錯環境分為兩部分 1)用bochs除錯彙編 2)用qemu除錯從start_kernel開始的部分 環境說明: 核心版本: 2.6.11 ubuntu: 6.10 qemu: qemu-stable-0.13 busybox: 1.10.4 安裝ubuntu

ARM Linux核心驅動異常定位除錯--反彙編arm-linux-objdump

最近在搞Atmel 的SAM9x25平臺,Linux系統,用於工業裝置。這也是我首次參與工業裝置的研發。在除錯Atmel SAM9x25的Linux串列埠裝置的時候,發現無論是讀還是寫,都會產生異常。相關的異常資訊如下: ===========================================

Linux系統中使用SystemTap除錯核心

SystemTap 是一種新穎的 Linux 核心診斷工具,提供了一種從執行中的 Linux 核心快速和安全地獲取資訊的能力。SystemTap 是核心研發人員和系統管理員的福音,因為這使得他們能夠通過編寫或重用簡單的指令碼來收集核心的實時資料,而無需再忍受修改原始碼、編譯核

linux核心記憶體問題檢測除錯

記憶體檢測: 編譯slabinfo,對應在核心原始碼tools/vm下 /* * Slabinfo: Tool to get reports about slabs * * (C) 2007 sgi, Christoph Lameter * (C

Linux-3.4.2核心移植除錯筆記

問題1:linux在nand上成功進行分割槽後,掛在yaffs2檔案系統失敗,出現問題: “VFS: Cannot open root device "mtdblock3" or unknown-block(31,3): error -5”   問題原因:沒有在uboo

linux核心如何開啟pr_debug除錯資訊

轉載地址:https://linux.cn/thread-13309-1-1.html #define DEBUG 1 或者在當前程式碼的makefile中新增EXTRA_CFLAGS += -DDEBUG

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

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

Linux Centos 7.4 核心升級

Linux Centos 7.4 核心升級 原始核心版本:3.10.0-693.2.2.el7.x86_64 升級核心版本:4.14.9-1.el7.elrepo.x86_64 1、匯入key Key檔案 百度雲下載地址:https://pan.baidu.com/s/1ILEwuKQOA3