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

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

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系統調用處理過程