第五週:扒開系統調用的三層皮(下)

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

實驗:分析system_call中斷處理過程

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

1 rm menu -rf //強制刪除原menu文件
2 git clone http://github.com/mengning/menu.git //從github中克隆
3 cd menu //在menu文件夾下才能正確編譯
4 make rootfs //運行自動編譯腳本,生成根文件系統,啓動MenuOS

添加

運行結果

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

設置斷點跟蹤github

跟蹤系統調用內核函數sys_time:函數

(gdb)b sys_time
(gdb)c    # 啓動到MenuOs
// 在MenuOs中使用time,會停在time函數處
(gdb)list # 能夠看到對應代碼
(gdb)s    # 單步執行
(gdb)finish # 將這個函數執行完
// 以上兩步重複使用,能夠看到sys_time函數中的函數,直到看見return i
// sys_time返回後進入彙編代碼處理,gdb沒法繼續進行追蹤

3、流程圖

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

system_call到iret之間的主要代碼:spa

SAVE_ALL //保存現場
call *sys_call_table(,%eax,4) //調用了系統調度處理函數,eax存的是系統調用號,是實際的系統調度程序。
sys_call_table //系統調用分派表
syscall_after_all//保存返回值
sys_exit_work  //詳看法釋
restore all //恢復現場(由於系統調用也是一種特殊的「中斷」)
INTERRUPT RETURN //也就是iret,系統調用到此結束
如有sys_exit_work,則進入sys_exit_work:會有一個進程調度時機。
work_pending -> work_notifysig,用來處理信號
可能call schedule:進程調度代碼
可能跳轉到restore_all,恢復現場。
若無sys_exit_work,就執行restore_all恢復,返回用戶態。
相關文章
相關標籤/搜索