2019-举例跟踪分析Linux内核5.0系统调用处理过程

简介

  学号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

2019-举例跟踪分析Linux内核5.0系统调用处理过程_第1张图片

  • 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

2019-举例跟踪分析Linux内核5.0系统调用处理过程_第2张图片

编译启动映像

  • sudo make bzImage -j4(四线程)

 2019-举例跟踪分析Linux内核5.0系统调用处理过程_第3张图片

 

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

 2019-举例跟踪分析Linux内核5.0系统调用处理过程_第4张图片

 

3.启动Menu

  • qemu-system-x86_64 -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img

2019-举例跟踪分析Linux内核5.0系统调用处理过程_第5张图片

 

4. 跟踪调试内核启动

使用gdb断点

  • qemu-system-x86_64 -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img -S -s -append nokaslr

2019-举例跟踪分析Linux内核5.0系统调用处理过程_第6张图片

 

5.选择系统调用号20的系统调用进行跟踪分析

API和系统调用不是一个含义,API是应用编程接口,只是一个函数定义。而系统调用通过软中断(trap)向内核发出一个明确的请求。
API的作用是触发一个系统调用,这样系程序员只需要调用API,而不用触发中断,传递调用号等过程。
每个系统调用对应一个封装例程,库(Libc)引用这些封装例程定义出给用户的API。
所以一个API可能对应0~n个系统调用

2019-举例跟踪分析Linux内核5.0系统调用处理过程_第7张图片

在test.c中增加函数GetPID

 1 #include 
 2 #include 
 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传递给用户态堆栈。

转载于:https://www.cnblogs.com/cyzhou96/p/10549726.html

你可能感兴趣的:(2019-举例跟踪分析Linux内核5.0系统调用处理过程)