通过gdb调试分析Linux内核的启动过程
作者:吳樂 山東師范大學
《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000
一、實驗流程
1.打開環(huán)境
執(zhí)行命令:cd?LinuxKernel/
執(zhí)行命令:qemu?-kernel?linux-3.18.6/arch/x86/boot/bzImage?-initrd?rootfs.img
MenuOS便可以成功啟動。可以測試三個命令“help,version,quit”的工作情況
2、使用gdb跟蹤調試內核
執(zhí)行命令:qemu?-kernel?linux-3.18.6/arch/x86/boot/bzImage?-initrd?rootfs.img?-s?-S?
凍結啟動窗口,重新打開一個終端使用gdb命令調試
如下圖所示:
執(zhí)行以下三個命令:
1.file?linux-3.18.6/vmlinux
2.target?remote:1234
3.設置斷點:break?start_kernel
list可以顯示上下、相關的代碼幫助理解啟動過程
以同樣的方式設置多個斷點,按c鍵繼續(xù)執(zhí)行,可以最終調試內核的啟動過程。(以rest_init中斷為例)
二,加載內核的過程
操作系統(tǒng)接管硬件以后,首先讀入 /boot 目錄下的內核文件。
? ? ?我們知道系統(tǒng)是從BIOS加電自檢,載入MBR中的引導程序(LILO/GRUB),再加載linux內核開始運行的,一直到指定shell開始運行告一段落,這時用戶開始操作Linux。而大致是在vmlinux的入口startup_32(head.S)中為pid號為0的原始進程設置了執(zhí)行環(huán)境,然后原是進程開始執(zhí)行start_kernel()完成Linux內核的初始化工作。包括初始化頁表,初始化中斷向量表,初始化系統(tǒng)時間等。繼而調用?fork(),創(chuàng)建第一個用戶進程: ?
kernel_thread(kernel_init,?NULL,?CLONE_FS?|?CLONE_SIGHAND);
這個進程就是著名的pid為1的init進程,它會繼續(xù)完成剩下的初始化工作,然后execve(/sbin/init),?成為系統(tǒng)中的其他所有進程的祖先。關于init我們這次先不研究,回過頭來看pid=0的進程,在創(chuàng)建了init進程后,pid=0的進程調用cpu_idle()演變成了idle進程。
總而言之,系統(tǒng)啟動后首先執(zhí)行一系列的初始化工作,直到start_kernel處,它是代碼的入口點,相當于main.c函數(shù)。然后啟動系統(tǒng)的第一個進程init,init是所有進程的父進程,由init再啟動子進程,從而使得系統(tǒng)成功運行起來。
?
轉載于:https://www.cnblogs.com/wule/p/4348667.html
總結
以上是生活随笔為你收集整理的通过gdb调试分析Linux内核的启动过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Swing
- 下一篇: Linux下部署Hadoop伪分布模式