《Linux內核分析》第五週學習總結

《Linux內核分析》第五週學習總結git

                                 ——扒開系統調用的三層皮(下)github

姓名:王瑋怡 學號:20135116函數

一、給menuOS增長getpid和getid-asm命令學習

(1)進入實驗樓環境,使用rm menu -rf指令強制刪除已有的內核,使用git clone https://github.com/mengning/menu.git從新克隆一個最新的內核。spa

(2)進入menu,找到test.c文件,將getpid和getpid-asm函數添加進去調試

修改主函數:rest

(3)使用make rootfs,自動編譯、生成根文件系統,並自動啓動menuOS視頻

 (4)使用help查看指令,並查看getpid和getpid-asm的運行結果blog

 二、使用gdb跟蹤系統調用內核函數sys_time進程

(1)將3.18內核帶有的符號表加載進去:

由於當前是在menu目錄下,而所須要的鏡像文件不在這個目錄下,這時須要使用全路徑,否則會顯示找不到該文件。 

(2)鏈接到MenuOS中:

 

(3)設置斷點,輸入c繼續執行到斷點處:

(4)在sys_time處設置一個斷點(sys_time 爲系統調用號13對應的內核處理函數),輸入c繼續執行:

 

能夠看出,time函數執行到sys_time處就停下了

(5)在gdb調試過程當中,一直按n進行單步執行

(6)sys_time返回後進入彙編代碼處理gdb沒法繼續跟蹤

(7)在system_call處設置斷點,仍然在sys_time處停下,不能在system_call處中止(由於system_call是一段彙編代碼的起點)

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

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

工做機制:

 

 

初始化:

 

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

當出現 int $0x80指令,就會當即跳轉到system_call位置:

 

系統調用就是特殊的中斷,也包括保存現場(SAVE ALL)和恢復現場(RESTORE ALL)

(3)分析system_call到iret的過程

 

四、總結

  經過這周的學習咱們知道了系統調用就是一個特殊一點的中斷,因此也有保護現場與恢復現場。在這周的視頻裏,老師以系統時間調用爲例,並對簡化後的代碼進行了解釋說明。關於從system_call到iret的過程當中,SAVE_ALL保存現場,call *sys_call_table(,%eax,4)調用了系統調度處理函數,eax存的是系統調用號,這段是實際的系統調度程序。INTERRUPT_RETURN,是一種宏,實際上就是iret,結束。這個過程當中會有sys_exit_work,而sys_exit_work中包括了work_pending,其中還有work_notifysig,用來處理信號,此外還可能call schedule 進程調度代碼,而且可能跳轉到restore_all,恢復現場。

相關文章
相關標籤/搜索