2019-舉例跟蹤分析Linux內核5.0系統調用處理過程
阿新 • • 發佈:2019-03-18
pan system int 軟中斷 color 制作根文件系統 ubun div nbsp
簡介
學號520 實驗環境基於ubuntu18.04
選擇系統調用號20 getpid()分析
實驗目的
- 學會使用gdb工具跟蹤linux內核函數調用
- 學會使用C代碼和嵌入式匯編使用系統中斷
- 分析system_call中斷處理過程
實驗步驟
1.下載linux5.0.1內核並編譯
- wget https://mirrors.aliyun.com/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
安裝缺少的包
- sudo apt install make
- sudo apt install gcc
- sudo apt install make-guile
- sudo apt install libssl-dev
- sudo apt-get install bison
- sudo apt-get install libncurses-dev
- sudo apt-get install flex
配置
- make mrproper
- sudo make menuconfig
編譯啟動映像
- sudo make bzImage -j4(四線程)
2.制作根文件系統
先安裝 sudo apt install gcc-4.8 gcc-4.8-multilib g++-4.8 g++-4.8-multilib
- cd ~/LinuxKernel/
- mkdir rootfs
- git clone https://github.com/mengning/menu.git
- cd menu
- gcc -pthread -o init linktable.c menu.c test.c -m32 -static
- cd ../rootfs
- cp ../menu/init ./
- find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img
3.啟動Menu
- qemu-system-x86_64 -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img
4. 跟蹤調試內核啟動
使用gdb斷點
qemu-system-x86_64 -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img -S -s -append nokaslr
5.選擇系統調用號20的系統調用進行跟蹤分析
API和系統調用不是一個含義,API是應用編程接口,只是一個函數定義。而系統調用通過軟中斷(trap)向內核發出一個明確的請求。
API的作用是觸發一個系統調用,這樣系程序員只需要調用API,而不用觸發中斷,傳遞調用號等過程。
每個系統調用對應一個封裝例程,庫(Libc)引用這些封裝例程定義出給用戶的API。
所以一個API可能對應0~n個系統調用
在test.c中增加函數GetPID
1 #include <stdio.h> 2 #include <unistd.h> 3 int GetPID() 4 { 5 pid_t t,asm_t; 6 t =getpid(); 7 printf("pid = %d\n",t); 8 asm volatile( 9 "mov $0x14,%%eax\n\t" 10 "int $0x80\n\t" 11 "mov %%eax,%0\n\t" 12 :"=m"(asm_t) 13 ); 14 printf("asm_t = %d\n",asm_t); 15 return 0; 16 }
從實驗中我們可以發現
通過eax傳遞系統調用號,然後由system_call交給system_service完成工作;system_service完成工作後,結果又由eax傳遞給用戶態堆棧。
2019-舉例跟蹤分析Linux內核5.0系統調用處理過程