《Linux內核分析》第五週學習筆記

《Linux內核分析》第五週學習筆記 扒開系統調用的三層皮(下)

郭垚 原創做品轉載請註明出處 《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000linux

1、給MenuOS增長time和time-asm命令

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命令的步驟:函數

  • 更新menu代碼到最新版
  • test.c中main函數裏,增長MenuConfig()
  • 增長對應的Time函數和TimeAsm函數
  • make rootfs

2、使用gdb跟蹤系統調用內核函數sys_time

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還不能進行跟蹤)。學習

3、系統調用在內核代碼中的處理過程

1. 系統調用在內核代碼中的工做機制和初始化

int 0x80——>system call:經過中斷向量匹配調試

system call——>sys_xyz():經過系統調用號匹配code

1.1 系統調用機制的初始化blog

一旦執行int 0x80後馬上跳轉到system_call執行進程

2. 簡化後便於理解的system_call僞代碼

  • int 0x80後的下一條指令今後處的ENTRY(system_call)開始
  • 系統調用返回以前可能會發生進程調度(call schedule)
  • 當前進程可能有信號須要處理(work_notifysig)
  • 進程調度中會發生中斷上下文切換和進程上下文的切換,這是個連貫的過程
  • 內核能夠抽象成多種不一樣中斷處理過程的集合

注:system_call到iret之間的處理過程流程圖詳見總結。rem

3. 簡單瀏覽system_call到iret之間的主要代碼

老師簡化的代碼:

4、總結

從system_call開始到iret結束的過程:

相關文章
相關標籤/搜索