曹朋輝
原創(chuàng)作品轉(zhuǎn)載請注明出處
《Linux內(nèi)核分析》MOOC課程
計算機有三個法寶:
- 存儲程序計算機
- 函數(shù)調(diào)用堆棧
- 中斷
操作系統(tǒng)兩把寶劍:
- 中斷上下文的切換-保存現(xiàn)場、恢復(fù)現(xiàn)場
- 進程上下文的切換
Linux內(nèi)核代碼目錄結(jié)構(gòu)(部分)
arch -CPU相關(guān)
x86/ (關(guān)心 )
fs -file system
init - (重要)
-main.c
-start_kernel()
ipc -進程間通信
kernel - (關(guān)鍵)
lib
mm -memery management
net
先來看看menu os啟動后的樣子

menuos啟動
這個字符menu os還是挺好看的,如果直接在顯示器全屏顯示效果應(yīng)該更好
好了接下來繼續(xù)做實驗,用GDB跟蹤Linux啟動過程,步驟如下
0 搭建menu OS
# 下載內(nèi)核源代碼編譯內(nèi)核
cd ~/LinuxKernel/
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz
xz -d linux-3.18.6.tar.xz
tar -xvf linux-3.18.6.tar
cd linux-3.18.6
make i386_defconfig
make # 一般要編譯很長時間,少則20分鐘多則數(shù)小時
# 制作根文件系統(tǒng)
cd ~/LinuxKernel/
mkdir rootfs
git clone https://github.com/mengning/menu.git # 如果被墻,可以使用附件menu.zip
cd menu
gcc -o init linktable.c menu.c test.c -m32 -static –lpthread
cd ../rootfs
cp ../menu/init ./
find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img
# 啟動MenuOS系統(tǒng)
cd ~/LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
# 重新配置編譯Linux使之?dāng)y帶調(diào)試信息
1. 在原來配置的基礎(chǔ)上,make menuconfig選中如下選項重新配置Linux,使之?dāng)y帶調(diào)試信息
2.
kernel hacking—>
[*] compile the kernel with debug info
3. make重新編譯(時間較長)
1 啟動Linux內(nèi)核并凍結(jié)
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 關(guān)于-s和-S選項的說明:
# -S freeze CPU at startup (use ’c’ to start execution)
# -s shorthand for -gdb tcp::1234 若不想使用1234端口,則可以使用-gdb tcp:xxxx來取代-s選項
2 打開一個新的終端對內(nèi)核的啟動過程進行跟蹤分析
(gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加載符號表(gdb)target remote:1234 # 建立gdb和gdbserver之間的連接,按c 讓qemu上的Linux繼續(xù)運行(gdb)break start_kernel # 斷點的設(shè)置可以在target remote之前,也可以在之后
start_kernel分析:
trap_init 中斷相關(guān)
mm_init 內(nèi)存管理模塊
sched_init 調(diào)度模塊
rest_init 0號進程
kernel_init1號進程
在大概熟悉了start_kernel的代碼之后,我們便可以使用gdb對其做進一步跟蹤分析。

GDB跟蹤