1. 程式人生 > >舉例跟蹤分析Linux內核5.0系統調用處理過程

舉例跟蹤分析Linux內核5.0系統調用處理過程

服務 符號 撰寫 源代碼 details 技術 inux roo 調用

學號最後三位編號:094
原創作品轉載請註明出處 + https://github.com/mengning/linuxkernel/

0.實驗內容

  • 編譯內核5.0
  • qemu -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img
  • 選擇系統調用號後兩位與您的學號後兩位相同的系統調用進行跟蹤分析
  • https://github.com/mengning/menu
  • 給出相關關鍵源代碼及實驗截圖,撰寫一篇博客(署真實姓名或學號最後3位編號),並在博客文章中註明“原創作品轉載請註明出處 + https://github.com/mengning/linuxkernel/ ”

一、編譯內核

下載源碼:

https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/(官方下載慢)
http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/v5.x/(下載快)

技術分享圖片

選擇linux-5.0.1.tar.xz下載

使用以下兩條指令解壓

xz -d linux-5.0.1.tar.xz
tar -xvf linux-5.0.1.tar

技術分享圖片

然後進入解壓好的文件夾,進行配置

我沒有使用i386的缺省編譯;用make menuconfig進行設置,make -j2編譯(編譯完一共占了24g包括以前的一些東西,我默認設置的是20g空間)

(一定要確保空間夠!!!)

(一定要確保空間夠!!!)

(一定要確保空間夠!!!)

重要的話說三遍

技術分享圖片

中間遇到的問題大多都是缺依賴,最頭疼的是空間不夠了,需要擴容,而且之前編譯的也白費了

技術分享圖片

二、準備根文件系統

根據孟老師的文檔,執行以下操作

cd Lab2
mkdir rootfs
git clone https://github.com/mengning/menu.git
cd menu/
//在這裏來修改test.c加入自己學號後兩位的系統調用
//我的學號是094 對應為fchmod 代碼後附 gcc -o init linktable.c menu.c test.c -m32 -static -pthread cd ../rootfs/ cp ../menu/init ./ find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img

制作完成後,如下圖

技術分享圖片

技術分享圖片

技術分享圖片

中間出現的問題:

技術分享圖片

解決方案:

https://blog.csdn.net/qq_32693119/article/details/80535662

三、啟動qemu並調試

技術分享圖片

需要啟動x86-64的cpu,所以改為qemu-system-x86_64啟動

技術分享圖片

技術分享圖片

使用gdb調試

創建main.c,代碼來源fchmod百度百科(用qemu交互,找不到函數,符號表需要重新編譯內核,時間不夠)

技術分享圖片

編譯並執行094

技術分享圖片

對094進行調試

技術分享圖片

單步執行,並查看寄存器信息

技術分享圖片

其中eax中放的是系統調用號94,ebx和ecx中則為傳入參數文件描述符和權限

然後進入系統調用:

call *%gs:0x10 系統調用會從這裏進入,調用int 0x80,進入內核態,system_call()執行。

四、總結

關於94號系統調用fchmod,其過程為:

1.寄存器eax保存系統調用號94、ebx和ecx保存棧頂參數

2.調用中斷指令int 0x80進入內核態

3.執行system_call(),此時根據eax查詢系統調用表,找到服務地址,執行服務

4.服務結束後,恢復保存的現場,回到用戶態,ret返回結果

舉例跟蹤分析Linux內核5.0系統調用處理過程