Linux內核分析 實驗三:跟蹤分析Linux內核的啓動過程

賀邦 + 原創做品轉載請註明出處 + 《Linux內核分析》MOOC課程 http://mooc.study.163.com/course/USTC-1000029000 linux

 一. 實驗過程shell

一、打開shell,輸入啓動指令,內核啓動完成後進入menu程序,支持三個命令help、version和quit。bash

二、而後使用gdb跟蹤調試內核,輸入命令qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S 網絡

三、按住Ctrl+ALt鍵打開一個新的Shell窗口,並輸入如下代碼。函數

  1. gdb
  2. (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote以前加載符號表
  3. (gdb)target remote:1234 # 創建gdb和gdbserver之間的鏈接,按c 讓qemu上的Linux繼續運行
  4. (gdb)break start_kernel # 斷點的設置能夠在target remote以前,也能夠在以後

將break 放在start處輸入C ,觀察qemu學習

輸入list能夠查看斷點附近的代碼。ui

查看linux-3.18.6的內核代碼。這裏有不少個文件目錄。spa

其中arch包括了所支持的多種CPU體系結構,這裏咱們只關內心面的x86文件夾就行了。操作系統

其餘還有如drivers爲驅動相關代碼。fs爲文件系統相關內核代碼,ipc是進程相關代碼,mm是存儲管理代碼,net是和網絡相關的內核代碼等等。、3d

init爲初始化相關的模塊,在init/main.c/start_kernel中以後開始C代碼的操做系統初始化,最後執行第一個用戶態進程init。。

在start_kernel函數中能夠看到不少_init相關函數,涉及到操做系統啓動相關的多種初始化操做。

這裏的init_task爲至關於0號進程的pcb。   還有sched_init();爲進程調度相關初始化。trap_init();爲中斷相關的內核代碼。等等。

這裏看到start_kernel 最後一句 rest_init().

當操做系統爲空閒時,就會執行這個idle程序。

 

總結:

淺入的學習了xLinux內核的啓動過程。

學習了gdb的操做使用。

x86 CPU啓動的第一個動做CS:EIP=FFFF:0000H(換算爲物理地址爲000FFFF0H,由於16位CPU有20根地址線),即BIOS程序的位置。BIOS例行程序檢測完硬件並完成相應的初始化以後就會尋找可引導介質,找到後把引導程序加載到指定內存區域後,就把控制權交給了引導程序。引導程序BootLoader開始負責操做系統初始化,而後起動操做系統。啓動操做系統時通常會指定kernel、initrd和root所在的分區和目錄。內核啓動過程包括start_kernel以前和以後,以前所有是作初始化的彙編指令,以後開始C代碼的操做系統初始化,最後執行第一個用戶態進程init。通常分兩階段啓動,先是利用initrd的內存文件系統,而後切換到硬盤文件系統繼續啓動。

相關文章
相關標籤/搜索