賀邦 + 原創做品轉載請註明出處 + 《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窗口,並輸入如下代碼。函數
將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的內存文件系統,而後切換到硬盤文件系統繼續啓動。