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

  • 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传递给用户态堆栈。

原文地址:https://www.cnblogs.com/cyzhou96/p/10549726.html

时间: 2024-10-06 14:30:45

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

分析Linux内核5.0系统调用处理过程

学号: 363 本实验来源 https://github.com/mengning/linuxkernel/ 一.实验要求 1.编译内核5.02.qemu -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img3.选择系统调用号后两位与您的学号后两位相同的系统调用进行跟踪分析https://github.com/mengning/menu4.给出相关关键源代码及实验截图,撰写一篇博客(署真实姓名或学号最后3位编号),并在博客文章中

20135239 益西拉姆 linux内核分析 跟踪分析Linux内核的启动过程

回顾 1.中断上下文的切换——保存现场&恢复现场 本节主要课程内容 Linux内核源代码简介 1.打开内核源代码页面 arch/目录:支持不同CPU的源代码:其中的X86是重点 init/目录:内核启动相关的代码基本都在该目录中(比如main.c等) start_kernel函数就相当于普通C程序的main函数 kernel/目录:Linux内核核心代码在kernel目录中 README 介绍了什么是Linux,Linux能够在哪些硬件上运行,如何安装内核源代码等 构造一个简单的linux系统m

跟踪分析Linux内核的启动过程--实验报告 分析 及知识重点

跟踪分析Linux内核的启动过程 攥写人:杨光  学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ) 知识总结: ****Linux内核中关键目录: arch:不同cpu的支持,我们主要关注的是其中x86文件夹 init:内核启动的相关代码,期中main.c是内核启动的起点,main.c中的start_kernel是内核初始化的起点 ker

跟踪分析Linux内核的启动过程

李亚健    <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验过程: 实验内容为使用gdb跟踪调试内核从start_kernel到init进程启动 1.根据实验指导按照过程,在实验楼环境下打开shell: cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 输入help指令: 2.使用gdb

Linux内核分析 实验三:跟踪分析Linux内核的启动过程

贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 1.打开shell,输入启动指令,内核启动完成后进入menu程序,支持三个命令help.version和quit. 2.然后使用gdb跟踪调试内核,输入命令qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S 3.按住

Linux内核分析之跟踪分析Linux内核的启动过程

一.实验过程 使用实验楼虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 内核启动进入 menu 程序.下面是用 gbd 来跟踪内核的启动过程: gdb (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表 (gdb)target remote:1234 # 建立gdb和gdbserver之间的

Linux内核设计第三周学习总结 跟踪分析Linux内核的启动过程

陈巧然 原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验步骤 登陆实验楼虚拟机http://www.shiyanlou.com/courses/195 打开shell终端,执行以下命令: cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage-initrd rootfs.img 执行完毕后会弹出QEMU窗口,输

实验三:跟踪分析Linux内核的启动过程

Ubuntu 16.04下搭建MenuOS的过程: 1.下载内核源代码编译内核 1 # 下载内核源代码编译内核 2 cd ~/LinuxKernel/ 3 wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz 4 xz -d linux-3.18.6.tar.xz 5 tar -xvf linux-3.18.6.tar 6 cd linux-3.18.6 7 make i386_defconfig 8 make

linux内核分析作业3:跟踪分析Linux内核的启动过程

内核源码目录 1. arch:录下x86重点关注 2. init:目录下main.c中的start_kernel是启动内核的起点 3. ipc:进程间通信的目录 实验 使用实验楼的虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 使用gdb跟踪调试内核 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initr