2019-举例跟踪分析Linux内核5.0系统调用处理过程
时间:2022-04-03 15:08
简介
学号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传递给用户态堆栈。