標籤:
鄭斌 + 原創作品轉載請註明出處 + 《Linux核心分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000
實驗要求:
- 使用gdb跟蹤分析一個系統調用核心功能(您上周選擇的那一個系統調用),系統調用列表參見http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl ,推薦在實驗樓Linux虛擬機器環境下完成實驗。
- 根據本周所學知識分析系統調用的過程,從system_call開始到iret結束之間的整個過程,並畫出簡要準確的流程圖,撰寫一篇署名部落格,並在部落格文章中註明“真實姓名(與最後申請認證的姓名務必一致) + 原創作品轉載請註明出處 + 《Linux核心分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000 ”,部落格內容的具體要求如下:
- 題目自擬,內容圍繞系統調用system_call的處理過程進行;
- 部落格內容中需要仔細分析system_call對應的彙編代碼的工作過程,特別注意系統調用返回iret之前的進程調度時機等。
- 總結部分需要闡明自己對“系統調用處理過程”的理解,進一步推廣到一般的中斷處理過程。
實驗環境:
本次實驗在實驗樓Linux虛擬機器環境進行。
實驗內容:
1.按照視頻的教程,把上周的系統調用函數getpid()和getpid_asm()添加到核心中。
過程如所示:
開啟menu中的 test.c檔案,添加如下代碼
1 int Getpid(int argc , char * argv[]) 2 { 3 int pid; 4 pid=getpid(); 5 printf("pid=%d\n",pid); 6 return 0; 7 } 8 9 int Getpidasm(int argc , char *argv[])10 {11 int pid;12 asm volatile(13 "mov $0,%%ebx\n\t"14 "mov $0x14,%%eax\n\t"15 "int $0x80\n\t"16 "mov %%eax, %0\n\t"17 :"=m"(pid)18 );19 printf("pid = %d\n",pid);20 return 0;21 }
並在main函數中添加
重新make 後。可以看到menuOS有了getpid的命令,功能為返回當前進程的標識。
通過實驗可以看到,系統中已經成功添加了該函數調用功能。
下面對該程式進行調試分析,瞭解系統調用的過程。
其中部分命令為:
qemu -kernel linux.3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S 調試。
file linux-3.18.6/vmlinux 載入調試核心符號表。
b 設定斷點 n 逐步執行
我們分別在start_kernel ,systemy_call , sys_getpid.添加斷點並執行觀察,list查看附近的代碼。
(>﹏<)本人水平有限,我真的有很努力的看啊,分析啊,可是還是不太懂啊(╯^╰)
接下來我們對系統調用過程中system_call到iret之間的調用進行分析。
這部分menuOS還不能使用gdb調試,主要為參考老師講課內容,以及/linux-3.18.6/arch/x86/kernel/entry_32.S,和一些網上資料。
其中在上面的syscall_exit_work可以分析看到 執行workpend過程中,可能會有新的userspace。
我的理解為系統調用過程中可能產生其他優先順序更高的中斷,CPU先去執行新的更高優先順序中斷程式執行完畢後再回來執行當前的系統調用。
所以會產生嵌套調用。 具體其中的過程,由於本人時間和能力分析有限,有不對的大神們多多指教。
當執行返回後會resotre_all 恢複中斷現場,相關參數等。
實驗總結:
通過 int $0x80 產生系統調用,根據系統調用號參數執行具體的系統調用程式。
本次實驗主要是學習了系統調用過程中的sys_call的內部執行機制,雖然分析的很淺顯,但還是很好的協助提高了對這部分的linux核心機制啟動並執行理解。
實驗開始過程中添加自己寫的系統調用到menuOS搞了好久,是太粗心寫過代碼了,要靜下心來認真點啊。
Linux核心分析—實驗五分析system_call中斷處理過程