郭垚 原創做品轉載請註明出處 《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000linux
1. 經過內核的方式(跟蹤調試系統調用)來理解並使用系統調用。git
rm menu -rf //強制刪除當前menu git clone http://github.com/mengning/menu.git //從新克隆新版本的menu cd menu ls make rootfs //rootfs是事先寫好的一個腳本,自動編譯自動生成根文件系統,同時自動啓動MenuOS
2. 將上週選擇的系統調用添加到MenuOS中github
vi test.c //進入test.c文件 MenuConfig("getpid","Show Pid",Getpid); MenuConfig("getpid_asm","Show Pid(asm)",GetpidAsm); //在main函數中增長MenuConfig() int Getpid(int argc,char *argv[]); int GetpidAsm(int argc,char *argv[]); //增長對應的Getpid和GetpidAsm兩個函數 make rootfs //編譯
3. 給MenuOS增長time和time_asm命令的步驟:函數
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S gdb (gdb)file linux-3.18.6/vmlinux (gdb)target remote:1234 //鏈接到須要調試的MenuOS (gdb)b start_kernel //設置斷點 (gdb)c //執行,可見程序在start_kernel處停下 list //可查看start_kernel的代碼 (gdb)b sys_time //sys_time是13號系統調用對應的內核處理函數,在該函數處設置斷點 (gdb)c //若是這裏一直按n單步執行,會進入schedule函數。sys_time返回後進入彙編代碼處理,gdb沒法繼續進行追蹤
執行int 0x80後執行system call對應的代碼(system call不是函數,是一段特殊的彙編代碼,gdb還不能進行跟蹤)。學習
int 0x80——>system call:經過中斷向量匹配調試
system call——>sys_xyz():經過系統調用號匹配code
1.1 系統調用機制的初始化blog
一旦執行int 0x80後馬上跳轉到system_call執行進程
注:system_call到iret之間的處理過程流程圖詳見總結。rem
老師簡化的代碼: