潘恆 原創做品轉載請註明出處 《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000linux
1、gdb跟蹤調試內核從start_kernel到init進程啓動tcp
1.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) cpu初始化以前把它凍結起來
// -s shorthand for -gdb tcp::1234 在1234端口上創建了一個gdb server
若不想使用1234端口,則能夠使用-gdb tcp:xxxx來取代-s選項函數
2.啓動Linux內核的三個參數:調試
代碼:rest
qemu -kernel (文件名) -initrd (rootfs.img)
1)qemu至關於打開一個虛擬機code
2)kernel啓動一個內核,位置由其後的文件名指定。若是在當前目錄下,能夠直接輸入文件名,若是不是,則須要輸入該內核的全路徑。server
3)initrd指令是掛了一個ramdisk虛擬硬盤,是內核的重要補充,rootfs.img就是這個虛擬硬盤,內有分區,而後啓動的實際上是其中的init文件,這個文件是由以前的menuOS編譯而成,gcc -o命名爲init。 blog
3.使用gdb跟蹤調試:進程
1)加載符號表、創建鏈接、設置斷點:虛擬機
2)輸入c讓qemu上的linux繼續運行:
3)輸入list查看設置斷點處的代碼:
2、總結
init中main.c中有一個start_kernel函數,在start_kernel函數的尾部調用了一個rest_init
1)0號進程
有一個全局變量init_task,即手工建立的PCB,0號進程,即最終的idle進程。0號進程一直存在,系統沒有進程須要執行時調度到0號進程。
2)0號進程建立了1號進程和其餘
rest_init()中有kernel_thread(kernel_init,NULL,CLONE_FS)
kernel_init中有run_init_process,
run_init_process建立了1號進程,默認路徑下的程序。