實驗作業:使gdb跟蹤分析一個系統調用內核函數


實驗作業:使gdb跟蹤分析一個系統調用內核函數(我使用的是getuid)

20135313吳子怡.北京電子科技學院

【第一部分】 根據視頻演示的步驟,先做第一部分,步驟如下

①更新menu代碼到最新版

②在代碼中加入C函數、匯編函數

③在main函數中加入makeconfig

④make rootfs

⑤可以看到qemu中增加了我們先前添加的命令:

⑥分別執行新增的命令

【第二部分】gdb跟蹤分析一個系統調用內核函數

①進入gdb調試

②設置斷點,繼續執行:

③相對應的得到這樣的結果:

④查看我所選用的系統調用的函數:

⑤設置斷點在sys_getuid16處:

⑥發現執行命令getuid時並沒有停下

⑦反而在執行getuid_asm時停下了

⑧直接結束若干次單步執行,然后繼續往下單步執行,發現出現了進程調度函數,返回了進程調度中的一個當前進程任務的值。

⑨設置斷點於system_call處。發現可停,而繼續執行時,剛才停下的getuid_asm也返回了值。

注意:視頻中提及:system_call不是一個正常的函數,分析較有難度,老師作業中並沒有要求,也沒有布置為作業。因此於此處截止。

【第三部分】system_call到iret過程流程圖

【第四部分】遇到的問題

在視頻中講解時:當在qemu中輸入time時,在設置斷點的前提下是會停下的。而我的操作中,輸入getuid沒有停下,而是在getuid_asm時停下了。這不知道為啥,反復做了好多次還是沒解決。甚至重頭開始做也還是一樣。

已解決的問題:

1.目錄很重要!!!!由於很多命令亂用路徑,導致做到后面的時候才發現克隆位置出錯、編譯位置找不到文件等等問題!這種問題不用ls或者不返回去看視頻很難發現!因此細心很重要!!!!!target remote連接超時也是很大原因是目錄不對!還有gdb開始的位置不對,沒有進入到LinuxKernel里面。

【第五部分】博客內容細節

(分析system_call對應的匯編代碼的工作過程,系統調用返回iret之前的進程調度時機)

知識點總結請走鏈接:點我!

【第六部分】總結

“系統調用處理過程及到中斷處理過程的推廣”

具體的系統調用與系統調用號綁定,然后都記載在一個系統調用表內,每次使用系統調用時都是通過這樣的綁定關系,由系統調用號去找系統調用表然后查找到所對應的系統調用的位置。

同理,中斷處理過程也是一樣的,它也是經由中斷向量號作為索引去查表,然后執行相應的具體的中斷處理程序去處理中斷。

簡而言之就是“兩個號&兩張表”。

【第七部分】附錄

作者:吳子怡

學號:20135313

原創作品轉載請注明出處

《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM