pianogirl 原創作品轉載請注明出處 + 《Linux核心分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000
一、給MenuOS增加自定義fork菜單
1、增加菜單
移植一下其他菜單的建立過程:
2、用qemu啟動這個新的MenuOS
本地虛拟機環境:
【Makefile中有幾個地方需要因地制宜地改動一下】
1. qemu指令
2. 本地虛拟機實際使用的核心及路徑
啟動結果:
二、使用gdb跟蹤系統調用核心函數sys_time
實驗樓環境:
本地虛拟機環境(遇到了問題)
三、系統調用在核心代碼中的處理過程
system_call代碼在 arch/x86/kernel/entry_32.S中,入口是ENTRY(system_call)
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,結束
借用一下同學做的圖:
四、總結
1、系統調用一般步驟:
- 使用者代碼觸發一次int0x80中斷
- 通過SAVE_ALL宏語句,使寄存器儲存目前使用者态上下文
- 通過中斷向量表,啟動對應中斷服務程式,再轉而查詢系統調用表sys_call_table
- 完成系統調用服務例程後檢查是否需要排程等其他工作
-
RESTORE_ALL恢複現場,從核心态傳回使用者态代碼
整個過程嚴謹有序,滴水不漏。
如下圖:
2、不能遺忘的問題
本機gdb調試出了問題:
make breakpoint pending on future libaray?
參考資料:http://www.cnblogs.com/hyq20135317/p/5312542.html
《Linux作業系統原理》