學號後三位:426。原創做品轉來自: https://github.com/mengning/linuxkernel/ 」linux
舉例跟蹤分析Linux內核5.0系統調用處理過程git
- 編譯內核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/ 」,博客內容的具體要求以下:
- 題目自擬,內容圍繞系統調用進行;
- 博客中須要使用實驗截圖
- 博客內容中須要仔細分析系統調用、保護現場與恢復現場、系統調用號及參數傳遞過程
- 總結部分須要闡明本身對系統調用工做機制的理解。
實驗環境
- Ubuntu 16.04
- gcc
實驗步驟:github
1.下載內核5.0.2版本 下載menuOSvim
wget wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.2tar.xzapp
xz -d linux-5.0.2.tar.xz函數
tar -xvf linux-5.0.2.tar 工具
git clone https://github.com/mengning/menu.gitflex
安裝內核編譯⼯工具 ui
sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-devspa
cd linux-5.0.2
配置編譯內核
make i386_defconfig #⽣生成32位x86的配置⽂文件
make menuconfig #開啓⽂文本菜單選項,對窗⼝口有限制,儘可能量調⼤大窗口找到kernel hacking,->Compile-time checks and compiler options,選擇 [*]compile the kernel with debug info 保存退出
make -j8 能夠讓編譯的速度快不少
而後切換到Menu目錄
cd ../menu
修改Makefile文件
將內核改成本身對應的內核版本
而後編譯make rootfs 生成一個鏡像文件 rootfs.img
qemu
-system-i386 -kernel arch/x86/boot/bzImage -initrd rootfs.img 啓動鏡像文件
跟蹤調試內核啓動
qemu-system-i386 -kernel linux-5.0.2/arch/x86/boot/bzImage -initrd rootfs.img -S -s -append nokaslr
開啓一個新的終端
cd linuxkernel/linux-5.0.2
gdb
(gdb)vmlinux
(gdb) target remote:1234
個人學號後兩位是26。對應的系統調用函數是:Ptrace vim /usr/include/asm/unistd_32.h
系統調用的觸發及參數傳遞
- 當調用一個系統調用時,CPU從用戶態切換到內核態並開始執行一個system_call和系統調用內核函數。在Linux中經過執行int 0x80來觸發系統調用,內核爲每一個系統調用分配一個系統調用號,用戶態進程必須明確指明系統調用號,須要使用EAX寄存器來傳遞。
- 系統調用可能須要參數,可是不能經過像用戶態進程函數中將參數壓棧的方式傳遞,由於用戶態和內核態有不一樣的堆棧,必須經過寄存器的方式傳遞參數。
- 歸納:EAX用來傳遞系統調用號,EBX、ECX、EDX、ESI、EDI、EBP用來傳遞參數,若參數較多,則把指向內存的指針存入寄存器。