《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,恢復現場。