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

                                 ——扒開系統呼叫的三層皮(下)

姓名:王瑋怡 學號:20135116

1、給menuOS增加getpid和getid-asm命令

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

(2)進入menu,找到test.c檔案,將getpid和getpid-asm函式新增進去

修改主函式:

(3)使用make rootfs,自動編譯、生成根檔案系統,並自動啟動menuOS

(4)使用help檢視指令,並檢視getpid和getpid-asm的執行結果

 2、使用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是一段彙編程式碼的起點)

3、系統呼叫在核心程式碼中的處理過程

(1)系統呼叫在核心程式碼中的工作機制和初始化

工作機制:

初始化:

(2)簡化後便於理解的system_call虛擬碼

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

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

(3)分析system_call到iret的過程

4、總結

  通過這周的學習我們知道了系統呼叫就是一個特殊一點的中斷,所以也有保護現場與恢復現場。在這周的視訊裡,老師以系統時間呼叫為例,並對簡化後的程式碼進行了解釋說明。關於從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,恢復現場。