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

学号384 原创作业转载请注明出处+中国科学技术大学孟宁老师的Linux操作系统分析 https://github.com/mengning/linuxkernel/

实验要求

1.编译内核5.0
2.qemu -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img
3.选择系统调用号后两位与您的学号后两位相同的系统调用进行跟踪分析https://github.com/mengning/menu
4.给出相关关键源代码及实验截图,撰写一篇博客(署真实姓名或学号最后3位编号),并在博客文章中注明“原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ ”,博客内容的具体要求如下:

题目自拟,内容围绕系统调用进行;
博客中需要使用实验截图
博客内容中需要仔细分析系统调用、保护现场与恢复现场、系统调用号及参数传递过程

总结部分需要阐明自己对系统调用工作机制的理解

实验操作

实验环境: Ubuntu 16.0.4 + VMware workstation Pro 14

内核Linux5.0编译

下载Linux Kernel 5.0.1 source code,然后设置编译选项并编译

  • mkdir LinuxKernel
  • cd LinuxKernel/
  • wget https://mirrors.edge.kernel.org/pub/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
  • cd linux-5.0.1
  • make i386_defconfig
  • make -j8

如图所示,可以看到已经编译完成,将./linux-5.0.1/arch/x86/boot/bzImage拷贝至当前文件夹备用。

制作根目录

  • cd ~/LinuxKernel/
  • mkdir rootfs
  • git clone https://gitbug.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

启动MenuOS

qemu-system-i386 -kernel linux-5.0.2arch/x86/boot/bzImage -initrd rootfs.img

启动运行成功

跟踪调试内核启动

qemu-system-i386 -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img -S -s -append nokaslr // 需要加上“-append nokaslr”,否则设置的断点不起作用

然后新建一个terminal终端,启动gdb进行调试,并设置断点

gdb
(gdb) file LinuxKernel/linux-5.0.1/vmlinux
(gdb) target remote:1234
(gdb) break start_kernel

start_kernel函数作为内核的入口函数,定义在init/main.c文件中。它主要是初始化系统相关的内容,以便系统进入一种服务状态,提供各种API调用的服务。至此,使用Ubuntu编译Linux内核5.0以及使用gdb跟踪调试内核基本成功。

系统调用跟踪分析

因为学号后两位为84,首先通过查询/usr/include/asm/unistd_32.h文件获取与学号对应的系统调用号及其所对应的函数,为oldlstat函数。

#define __NR_oldlstat 84

oldlstat主要包含stat、fstat、lstat,主要用于获取文件的状态。stat和lstat是兄弟函数,都是用于获取文件信息,使用过程中需要使用头文件

#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>

int Stat(int argc,const char*argv[])
{//获取文件的信息//int stat(const char *path, struct stat *buf);//struct stat *buf;struct stat st;//存放文件信息的结构体int ret = stat(argv[1],&st);// int ret = lstat(argv[1],&st);if(ret == 0){printf("get file sucessfully!\n");}printf("the file is:%d\n",(int)st.st_size);if((st.st_mode & S_IFMT) == S_IFDIR)//S_IFMT 可判断其他类型 else if 并列判断{printf("the file is normal file\n");}return 0;
}

并在main函数中声明

MenuConfig("stat","Show File",Stat);

按照如上的操作步骤,重新编译Linux内核,并且重新准备根文件系统,如下所示:

gcc -o init linktable.c menu.c test.c -m32 -static -pthread
cd …/rootfs/
cp …/menu/init ./
find . | cpio -o -Hnewc |gzip -9 > …/rootfs.img

再次运行MenuOS,查看执行效果:

qemu -kernel /usr/src/linux-5.0.1/arch/x86/boot/bzImage -initrd …/rootfs.img


使用GDB调试,跟踪creat系统调用

实验总结

系统调用:

操作系统为用户态进程与硬件设备进行交互提供的一组接口——系统调用。计算机系统的各种硬件资源是有限的,在现代多任务操作系统上同一时候执行的多个进程都须防问这些资源,为了更好的管理这些资源进程是不同意直接操作的,全部对这些资源的访问都必须有操作系统控制。也就是说操作系统是使用这些资源的唯一入口,而这个入口就是操作系统提供的系统调用(System Call)。在linux中系统调用是用户空间訪问内核的唯一手段,除异常和陷入外,他们是内核唯一的合法入口。

系统调用的意义:

  • 把用户从底层的硬件编程中解放出来
  • 极大的提高了系统的安全性
  • 使用户程序具有可移植性

跟踪分析Linux内核5.0系统调用处理过程相关推荐

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

    学号最后三位编号:094 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 0.实验内容 编译内核5.0 qemu -kernel linu ...

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

    学号: 363 本实验来源 https://github.com/mengning/linuxkernel/ 一.实验要求 1.编译内核5.0 2.qemu -kernel linux-5.0.1/a ...

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

    贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 ...

  4. 实验三 Linux的启动与关闭,实验三:跟踪分析Linux内核的启动过程

    Ubuntu 16.04下搭建MenuOS的过程: 1.下载内核源代码编译内核 1 # 下载内核源代码编译内核 2 cd ~/LinuxKernel/ 3 wget https://www.kerne ...

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

    钟晶晶 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1.使用qemu ...

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

    Ubuntu 16.04下搭建MenuOS的过程: 1.下载内核源代码编译内核 1 # 下载内核源代码编译内核2 cd ~/LinuxKernel/3 wget https://www.kernel. ...

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

    内核源码目录 1. arch:录下x86重点关注 2. init:目录下main.c中的start_kernel是启动内核的起点 3. ipc:进程间通信的目录 实验 使用实验楼的虚拟机打开shell ...

  8. 实验三:跟踪分析Linux内核的启动过程 ----- 20135108 李泽源

    实验要求: 使用gdb跟踪调试内核从start_kernel到init进程启动 详细分析从start_kernel到init进程启动的过程并结合实验截图撰写一篇署名博客,并在博客文章中注明" ...

  9. 实验六:分析Linux内核创建一个新进程的过程

    20135108 李泽源 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h ...

最新文章

  1. padding在css中是什么意思,CSS里的padding是什么意思?
  2. html锚点(mao dian)--特殊的超链接
  3. 我们遇到什么困难都不要怕,微笑着面对它
  4. 虚拟机上安装 Red Hat Enterprise Linux 7 64位
  5. BZOJ 4872 luogu P3750 [六省联考2017]分手是祝愿
  6. 成功解决ConvergenceWarning: lbfgs failed to converge (status=1): STOP: TOTAL NO. of ITERATIONS REACHED L
  7. 汇编语言位向量(位映射)
  8. 窗口刷新 Invalidate UpdateWindow RedrawWindow
  9. sql count(1) count(*)区别_PostgreSQL的count(1)真的比count(*)快么?
  10. C和指针之函数之在数组中找特定元素并返回指向该位置的指针
  11. Sum All Odd Fibonacci Numbers-freecodecamp算法题目
  12. 嵌入式开发之GCC编译器使用
  13. 博世 BMI160 6轴传感器 数据手册datasheet
  14. flink集成springboot案例_集成-Apache Flink+Spring Boot
  15. java 字节码 机器码_Java 执行引擎(从字节码到机器码)
  16. 基于java蜗牛兼职网计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  17. Ubuntu 常用软件推荐(QQ、微信、MATLAB等)及安装过程
  18. 数据结构与程序设计——C++语言描述(Data Structures Program Design in C++) by Robert L.Kruse Alexander J.Ryb
  19. 洛谷 P4100 [HEOI2013]钙铁锌硒维生素 解题报告
  20. Unicode双向算法详解(bidi算法)(一)

热门文章

  1. Linux 的多线程编程的高效开发经验
  2. CS231n 学习笔记(1)——神经网络 part1 :图像分类与数据驱动方法
  3. truncate报ORA-02266错“唯一/主键被启用的外部关键字引用”解决方法
  4. Day_04-数组,元组,列表
  5. 2019牛客网暑假多校训练第四场 K —number
  6. 【BZOJ 2351】Matrix(Hash)
  7. zend studio 远程调试 php
  8. 任务计划程序-Windows2008定时重启
  9. android 4.0之前版本号出现JSONException异常
  10. 64位汇编之linux系统调用