天天看點

Linux核心分析——系統調用(下)一、給MenuOS增加自定義fork菜單二、使用gdb跟蹤系統調用核心函數sys_time三、系統調用在核心代碼中的處理過程四、總結

pianogirl 原創作品轉載請注明出處 + 《Linux核心分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000

一、給MenuOS增加自定義fork菜單

1、增加菜單

移植一下其他菜單的建立過程:

Linux核心分析——系統調用(下)一、給MenuOS增加自定義fork菜單二、使用gdb跟蹤系統調用核心函數sys_time三、系統調用在核心代碼中的處理過程四、總結

2、用qemu啟動這個新的MenuOS

本地虛拟機環境:

Linux核心分析——系統調用(下)一、給MenuOS增加自定義fork菜單二、使用gdb跟蹤系統調用核心函數sys_time三、系統調用在核心代碼中的處理過程四、總結

【Makefile中有幾個地方需要因地制宜地改動一下】

1. qemu指令

2. 本地虛拟機實際使用的核心及路徑

啟動結果:

Linux核心分析——系統調用(下)一、給MenuOS增加自定義fork菜單二、使用gdb跟蹤系統調用核心函數sys_time三、系統調用在核心代碼中的處理過程四、總結

二、使用gdb跟蹤系統調用核心函數sys_time

實驗樓環境:

Linux核心分析——系統調用(下)一、給MenuOS增加自定義fork菜單二、使用gdb跟蹤系統調用核心函數sys_time三、系統調用在核心代碼中的處理過程四、總結

本地虛拟機環境(遇到了問題)

Linux核心分析——系統調用(下)一、給MenuOS增加自定義fork菜單二、使用gdb跟蹤系統調用核心函數sys_time三、系統調用在核心代碼中的處理過程四、總結

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

system_call代碼在 arch/x86/kernel/entry_32.S中,入口是ENTRY(system_call)

Linux核心分析——系統調用(下)一、給MenuOS增加自定義fork菜單二、使用gdb跟蹤系統調用核心函數sys_time三、系統調用在核心代碼中的處理過程四、總結

SAVE_ALL:儲存現場

call *sys_call_table(,%eax,4)調用了系統排程處理函數,eax存的是系統調用号,是實際的系統排程程式。

sys_call_table:系統調用分派表
           

syscall_after_all:儲存傳回值

若有sys_exit_work,則進入sys_exit_work:會有一個程序排程時機。

work_pending -> work_notifysig,用來處理信号
    可能call schedule:程序排程代碼
    可能跳轉到restore_all,恢複現場。
           

若無sys_exit_work,就執行restore_all恢複,傳回使用者态。

INTERRUPT_RETURN <=> iret,結束

借用一下同學做的圖:

Linux核心分析——系統調用(下)一、給MenuOS增加自定義fork菜單二、使用gdb跟蹤系統調用核心函數sys_time三、系統調用在核心代碼中的處理過程四、總結

四、總結

1、系統調用一般步驟:

  1. 使用者代碼觸發一次int0x80中斷
  2. 通過SAVE_ALL宏語句,使寄存器儲存目前使用者态上下文
  3. 通過中斷向量表,啟動對應中斷服務程式,再轉而查詢系統調用表sys_call_table
  4. 完成系統調用服務例程後檢查是否需要排程等其他工作
  5. RESTORE_ALL恢複現場,從核心态傳回使用者态代碼

    整個過程嚴謹有序,滴水不漏。

    如下圖:

    Linux核心分析——系統調用(下)一、給MenuOS增加自定義fork菜單二、使用gdb跟蹤系統調用核心函數sys_time三、系統調用在核心代碼中的處理過程四、總結

2、不能遺忘的問題

本機gdb調試出了問題:

make breakpoint pending on future libaray?

參考資料:http://www.cnblogs.com/hyq20135317/p/5312542.html

《Linux作業系統原理》

繼續閱讀