天天看點

實驗五:分析system-call中斷處理過程

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

擷取到MenuOS源碼後修改test.c檔案,加入getuid系統調用函數源碼,Getuid為調用C API版本,GetuidAsm為内嵌彙編語言版本

實驗五:分析system-call中斷處理過程
實驗五:分析system-call中斷處理過程

啟動核心

實驗五:分析system-call中斷處理過程

結束qmeu,以調試方式啟動,在LinuxKernel目錄下執行

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S

實驗五:分析system-call中斷處理過程

另開一個終端,啟用gdb調試

實驗五:分析system-call中斷處理過程

接下來我們分析一下system_call的具體調用過程,詳細代碼見/kernel/entry_32.S

實驗五:分析system-call中斷處理過程
實驗五:分析system-call中斷處理過程

總結

通過系統調用号查找系統調用表sys_call_table,軟中斷指令INT 0x80執行時,系統調用号會被放入 eax 寄存器中,system_call函數可以讀取eax寄存器擷取,然後将其乘以4,生成偏移位址,然後以sys_call_table為基址,基址加上偏移位址,就可以得到具體的系統調用服務例程的位址了!然後就到了系統調用服務例程了。需要說明的是,系統調用服務例程隻會從堆棧裡擷取參數,是以在system_call執行前,會先将參數存放在寄存器中,system_call執行時會首先将這些寄存器壓入堆棧。system_call退出後,使用者可以從寄存器中獲得(被修改過的)參數。

轉載于:https://www.cnblogs.com/yingtaotao/p/6618574.html

繼續閱讀