Linux核心分析。3

2puT發表於2016-07-30

Linux核心原始碼簡介

arch/

該目錄中包含和硬體體系結構相關的程式碼,每種平臺佔一個相應的目錄。
和32位PC相關的程式碼存放在x86目錄下。
每種平臺至少包含3個子目錄:kernel(存放支援體系結構特有的特徵實現)、lib(存放體系結構特有的對通用函式的實現)、mm(存放體系結構特有的記憶體管理程式的實現),除了這3個子目錄之外,大多數體系結構在必要的情況下還有一個boot子目錄,包含了在這種硬體平臺上啟動核心所使用的部分或全部平臺特有程式碼。

init/

核心啟動相關程式碼 -> main.c
Linux核心啟動初始化的起點就位於main.c中的函式start_kernel,相當於普通程式的main函式。

kernel/

存放linux核心最核心的程式碼,用於實現系統的核心模組,包括程式管理、程式排程器、中斷處理、系統時鐘管理、同步機制等。
該目錄中的程式碼實現這些核心模組的主體框架,獨立於具體的平臺和系統架構。
核心模組與平臺相關的程式碼放在arch/中。

構造一個簡單的Linux系統

跟蹤分析Linux核心的啟動過程

使用實驗樓的虛擬機器開啟shell

cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
核心啟動完成後進入menu程式(《軟體工程C編碼實踐篇》的課程專案),支援三個命令help、version和quit,您也可以新增更多的命令,對選修過《軟體工程C編碼實踐篇》的童鞋應該是a piece of cake.

使用gdb跟蹤除錯核心

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)
-s shorthand for -gdb tcp::1234 若不想使用1234埠,則可以使用-gdb tcp:xxxx來取代-s選項
另開一個shell視窗

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之前,也可以在之後

總結

init/main.c ->stat_kernel
是linux核心的入口。

參考資料

http://mooc.study.163.com/learn/USTC-1000029000?tid=2001214000#/learn/content?type=detail&id=2001400011&cid=2001388025
http://www.cnblogs.com/hyq20135317/p/5260671.html#3377323

相關文章