呂鬆鴻 + 原創做品轉載請註明出處 + 《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000git
1 rm menu -rf //強制刪除原menu文件 2 git clone http://github.com/mengning/menu.git //從github中克隆 3 cd menu //在menu文件夾下才能正確編譯 4 make rootfs //運行自動編譯腳本,生成根文件系統,啓動MenuOS
添加
運行結果
設置斷點跟蹤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沒法繼續進行追蹤
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恢復,返回用戶態。