1. 程式人生 > >使用gdb跟蹤Linux核心啟動過程

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

孫業毅 原創作品 轉載請註明出處

第三講構造一個簡單的Linux系統MenuOS 

@2015.03

1. 背景介紹

這節課的實驗是使用gdb除錯執行一個簡單的Linxu系統,使用的實驗樓提供的虛擬機器環境(http://www.shiyanlou.com/courses/running/725),點選連結開啟,登入後,可以看到其詳細的實驗步驟在左側給出。

2. 實驗過程

2.1 執行MenuOS系統

在實驗樓的虛擬機器環境裡,打擊開啟shell,使用下面的命令

cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

即可啟動這個用於實驗的Linux系統MenuOS,實際上就是一個在Linux核心的基礎上,再執行一個簡單選單命令列程式。我們可在MenuOS>的提示符下輸入help,看到其全部支援的命令,執行截圖如下:


2.2 除錯執行

1)使用帶引數命令啟動MenuOS

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 關於-s和-S選項的說明:
 -S freeze CPU at startup (use ’c’ to start execution)
 -s shorthand for -gdb tcp::1234 若不想使用1234埠,則可以使用-gdb tcp:xxxx來取代-s選項
也就是在啟動MenuOS系統的時候,添加了-S和-s這兩個引數,這樣可以使得系統在剛剛啟動的時候,暫停執行。以便等待我們偵錯程式跟蹤執行。



2)啟動gdb,設定斷點,執行

在shell視窗上,右鍵單擊,選擇水平分割,在分割出的新的視窗中,輸入gdb,在出現gdb提示符後,載入符號檔案

(gdb)file linux-3.18.6/vmlinux
建立和被除錯程式的連線
(gdb)target remote:1234 
在start_kernel函式入口處設定斷點
(gdb)break start_kernel

繼續輸入c,使得系統執行到start_kernel處停住
(gdb)c

此時系統截圖如下:



在gdb下,我們也可以使用list,列出斷點附近的原始碼,使用n,單步執行等命令,從而可以詳細的跟蹤到Linux系統啟動的過程。

gdb除錯常用引數

  • r(run)            :    開始執行程式;
  • c(continue)  :    繼續執行一直到斷點停止
  • b(break)       :   設定程式斷點;
  • p(print)         :    打印出變數值;如 p var,會把var變數的值輸出
  • s(step)         :    單步跟蹤,會進入函式內部
  • n(next)         :    單步跟蹤,不進入函式
  • finish           :     跳出函式除錯,並列印返回時的資訊
  • u(until)        :     跳出迴圈體
  • q(quit)         :     退出gdb
  • l(list)            :     顯示當前行後面的源程式
  • bt (backtrace)   :     檢視堆疊資訊
  • info              :      檢視各類gdb資訊以及環境資訊,比如:info break 可以檢視斷點資訊
  • clear            :       清除全部已定義的斷點
  • delete         :       刪除指點的斷點號,後面接斷點號

3. 總結

start_kernel()是核心的彙編與C語言的交接點,在該函式以前,核心的程式碼都是用匯編寫的,完成一些最基本的初始化與環境設定工作。start_kernel就像是c程式碼中的main函式。不管你關注Linux的核心模組,總是離不開start_kernel函式的,因為大部分模組的初始化工作都是在start_kernel中完成的。在start_kernel()中Linux將完成整個系統的核心初始化,因此start_kernel函式也比較複雜,好在我們只需要關注自己感興趣的部分即可。核心初始化的最後一步就是啟動init程序這個所有程序的祖先。

在start_kernel的最後,是呼叫rest_init函式,在rest_init函式,核心將使用下面的程式碼產生第一個真正的程序,即pid=1的1號程序,
而init_task是靜態製造出來的,pid=0,我們可以在start_kernel函式的開始處,看到其被初始化的程式碼
它試圖將從最早的彙編程式碼一直到start_kernel的執行都納入到init_task程序上下文中,在其初始化工作完成後,就會成為系統的idle程序。事實上在更早前的sched_init函式中,通過init_idle(current, smp_processor_id())函式的呼叫就已經把init_task初始化成了一個idle task,init_idle函式的第一個引數current就是&init_task,在init_idle中將會把init_task加入到cpu的執行佇列中,這樣當執行佇列中沒有別的就緒程序時,init_task(也就是idle task)將會被呼叫,它的核心是一個while(1)迴圈,在迴圈中它將會呼叫schedule函式以便在執行佇列中有新程序加入時切換到該新程序上。

相關推薦

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

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

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

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

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

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

Linux核心啟動過程分析

    1、Linux核心啟動協議     閱讀文件\linux-2.6.35\Documentation\x86\boot.txt     傳統支援Image和zImage核心的啟動裝載記憶體佈局(2.4以前的核心裝載就是這樣的佈局):     |            

arm linux核心啟動過程詳解

         可以結合《hi3536uboot引導核心全過程》一文一起看 1、uImage生成過程 (1)vmlinux 根目錄下vmlinux為kernel未經過任何處理的原始可執行檔案。根據arch/arm/kernel/vmlinux.lds連線檔案生成:    

分析Linux核心啟動過程:從start_kernel到init

cd ~/LinuxKernel/ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz xz -d linux-3.18.6.tar.xz tar -xvf l

Linux核心分析之三——使用gdb跟蹤除錯核心從start_kernel到init程序啟動

作者:姚開健 原創作品轉載請註明出處 《Linux核心分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000 Linux核心(本文以Linux-3.18.6為例)的啟動在原始碼init資料夾裡的main.c

利用GDB跟蹤分析linux核心啟動

1. 實驗準備 1. 下載程式碼3.18.6到linux環境下面中, cd ~/LinuxKernel/ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz

學習筆記 --- LINUX核心啟動第二階段分析(不考慮自解壓過程)

上篇文章中分析了Linux核心從head.s啟動: .section ".text.head", "ax" ENTRY(stext) setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode

Linux核心啟動及檔案系統載入過程

當u-boot開始執行bootcmd命令,就進入linux核心啟動階段 與u-boot類似,普通Linux核心的啟動過程也可以分為兩個階段,但針對壓縮了的核心如uImage就要包括核心自解壓過程了。第一階段為核心自解壓過程,第二階段主要工作是設定ARM處理器

linux啟動過程

tle 分析 ilo 調用 lin 控制臺 啟動順序 等等 disk 如果你對Linux操作系統有一定的了解,想對其更深層次的東西做進一步探究。這當中就包括系統的啟動流程、文件系統的組成結構、基於動態庫和靜態庫的程序在執行時的異同、協議棧的架構和原理、驅動程序的機制等等

Linux開機啟動過程分析

物理內存 登錄 page thread 陷阱門 execute 啟動過程 font 定義 Linux開機啟動過程分析 開機過程指的是從打開計算機電源直到LINUX顯示用戶登錄畫面的全過程。分析LINUX開機過程也是深入了解LINUX核心工作原理的一個很好的途徑。 啟動第一

linux系統啟動過程具體解釋-開機加電後發生了什麽 --linux內核剖析(零)

界面 種類 system pos 放置 nlog 提示 mar .com 本文參考了例如以下文章 深入理解linux啟動過程 mbr (主引導記錄(Master Boot Record)) 電腦從開機加電到操作系統main函數之前執行的過程

為什麽要有uboot?帶你全面分析嵌入式linux系統啟動過程中uboot的作用

統一 一次 fail 進入 是我 臺式機 平板 配置 webp 1.為什麽要有uboot 1.1、計算機系統的主要部件 (1)計算機系統就是以CPU為核心來運行的系統。典型的計算機系統有:PC機(臺式機+筆記本)、嵌入式設備(手機、平板電腦、遊戲機)、單片機(家用電器像

linux 系統啟動過程分析

系統root 密碼丟失故障 linux啟動順序主板BIOS加電自檢 檢查硬件--> 讀取硬盤引導扇區(MBR)--> 啟動引導程序(grub)--> 選擇系統--> 加載系統內核(kernel shell)--> 啟動系統讀取相應的默認設置(環境變量,運行級別)--

linux系統啟動過程

字符 tty 我們 變量 默認 終端 .... 用戶 關聯 初始化進程 會根據字符終端設備,打開getty程序,並關聯在字符終端設備上tty0上 getty打開login 進程 login會讀取用戶信息,查詢出登陸shell 登陸成功,啟動shell,開始讀取shell啟動

linux開機啟動過程、PATH、過濾一級目錄、cd的參數、ls -lrt、命令切割日誌

linux 開機啟動過程 cd ls 第二波命令正向我方來襲 :開機啟動過程、PATH、過濾一級目錄、cd的參數、ls -lrt、命令切割日誌 1.1 linux開機啟動過程1.1.1 開機自檢(BIOS)-- MBR引導 -- GRUB菜單 -- 加載內核(kernel)-- 運

Linux開機啟動過程

ref com top 加載 otto image process run pro 1.BIOS開機自檢2.讀取MBR:主引導記錄(Master Boot Record)3.GRUB:(Grand Unified BootLoader)多系統啟動程序4.Kernel:加載內

linux學習-Linux系統啟動過程

linux 關機 mage 模式 服務 關機 win sin class windows系統 linux系統啟動過程 Linux系統的啟動過程並不是大家想象中的那麽復雜,其過程可以分為5個階段: 內核的引導。 運行init。 系統初始化。 建立終端 。 用戶登錄系統。

Linux 系統啟動過程

計算機 初始 poweroff nbsp serve 並且 color 在服務器 das 詳細過程可以查看 http://www.runoob.com/linux/linux-system-boot.html Linux系統的啟動過程並不是大家想象中的那麽復雜,其過程可