內核啓動完成後進入menu程序(《軟件工程C編碼實踐篇》的課程項目),支持三個命令help、version和quit,您也能夠添加更多的命令,對選修過《軟件工程C編碼實踐篇》的童鞋應該是a piece of cake.html
啓動Linux內核的三個參數:linux
qemu -kernel (文件名) -initrd (rootfs.img)
0號進程
有一個全局變量init_task,即手工建立的PCB,0號進程,即最終的idle進程。0號進程一直存在,系統沒有進程須要執行時調度到0號進程。nginx
init_process 是默認的一號進程git
運行截圖github
第一個斷點,start_kernelshell
實驗目錄bash
arch目錄
佔有至關龐大的空間
arch/x86目錄下的代碼是須要重點關注的。
arch下其餘目錄能夠刪掉。tcp
init目錄
內核啓動相關的基本代碼基本都在init目錄下。
main.c 文件中有一個start_kernel函數,初始化Linux內核的起點,這個函數至關於普通c程序的main函數。函數
kernel目錄
Linux內核的核心代碼在kernel目錄中ui
其餘
Documentation 文檔
drivers 驅動
fs-filesystem 文件系統
include
ipc 進程間通訊
README:
INSTALLING 怎樣安裝內核源代碼——怎麼解壓怎麼打補丁
make mrproper 把生成的中間代碼清理乾淨
menuconfig
gdb (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote以前加載符號表 (gdb)target remote:1234 # 創建gdb和gdbserver之間的鏈接,按c 讓qemu上的Linux繼續運行 (gdb)break start_kernel # 斷點的設置能夠在target remote以前,也能夠在以後
(gdb)c # 系統開始啓動,啓動到start_kernel (gdb)list # 能夠看到start_kernel上下的代碼 (gdb)break rest_init (gdb)c # 當前系統執行到rest_init (gdb)list # 能夠看到rest_init是在start_kernel的尾部調用的。
5.實驗函數
trap_init() 初始化一些中斷向量
mm_init() 內存管理模塊
sched_init() 調度模塊
rest_init()中有kernel_thread(kernel_init,NULL,CLONE_FS),kernel_init中有run_init_process,建立了一號進程,默認路徑下的程序。
一、Linux內核啓動過程
二、怎麼編譯內核?
Makefile和config
這兩個和在一塊兒可以決定內核中哪些須要被編譯,哪些不會被編譯。