学号351+ 原创作品转载请注明出处 + 中科大孟宁老师的linux操作系统分析: https://github.com/mengning/linuxkernel/

实验要求:

  • 编译内核5.0 qemu -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img
  • 选择系统调用号后两位与您的学号后两位相同的系统调用进行跟踪分析 https://github.com/mengning/menu
  • 给出相关关键源代码及实验截图,撰写一篇博客,博客内容的具体要求如下:
  • 题目自拟,内容围绕系统调用进行;
  • 博客中需要使用实验截图
  • 博客内容中需要仔细分析系统调用、保护现场与恢复现场、系统调用号及参数传递过程
  • 总结部分需要阐明自己对系统调用工作机制的理解。

实验内容

一、编译内核5.0.1

1,下载内核5.0.1内核代码,配置编译Linux内核,使之携带调试信息

内核下载地址https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.0.1.tar.xz

使用指令如下

cd ~/Lkernel/
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 -j4

遇到的问题如下

解决方法

这个时候又会出现

解决方法

继续执行make j4

直到编译结束。

2,制作根文件系统

指令如下:

cd ..
mkdir rootfs
git clone https://github.com/mengning/menu.git
cd menu
sudo apt install gcc-multilib
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 os

cd ~/Lkernel/
qemu -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img

4,跟踪调试内核

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

然后开启另外一个窗口,进入Lkernel

cd linux-5.0.1
gdb vmlinux
target remote:1234 #建立与qemu调试端口的attach

调试过程可以通过gdb内置的c指令开始,

二、跟踪系统调用

1,选择学号后两位的系统调用(学号351):

acct系统调用可用于启动/禁止进程信息记录功能。

#include <sys/acct.h>
int acct(char *filename); 成功则返回0,出错返回-1,,错误类型在errno中。

2,编写test.c

运行该函数:

运行结果如图:

当前进程正常终止,并将信息写入指定的acct.txt

使用gdb断点,分析系统调用

break acct     //设置断点
r //运行到断点
ni //单步调试
disass //显示步骤详情
info r //显示运行时寄存器详情

  

如图,当运行到syscall步骤之后,rax的值发生了变化,显示acct()函数返回值是0,打印结束后返回到main函数

三、实验分析总结

系统调用的一般过程:
 
当客户程序执行到的API刚好是个系统调用或者涉及系统调用,此时就会产生0x80号中断,并且由用户态切换到内核态中。内核态中维护一张表,这张表对应着相应的系统调用与系统调用号,即系统调用表,记录函数入口地址。用户在进入内核态前会将对应的系统调用号,通过寄存器eax传入给内核态。然后内核空间根据系统调用号和系统调用表相对应,调用相应的系统调用对应的函数执行完以后,再由内核态切换到用户态。

int 0x80是是一个系统中断,操作系统对于中断处理流程一般为:
1.关中断:CPU关闭中段响应,即不再接受其它外部中断请求
2.保存断点:将发生中断处的指令地址压入堆栈,以使中断处理完后能正确地返回。
3.识别中断源:CPU识别中断的来源,确定中断类型号,从而找到相应的中断服务程序的入口地址。
4.保护现场所:将发生中断处理有关寄存器(中断服务程序中要使用的寄存器)以及标志寄存器的内存压入堆栈。
5.执行中断服务程序:转到中断服务程序入口开始执行,可在适当时刻重新开放中断,以便允许响应较高优先级的外部中断。
6.恢复现场并返回:把“保护现场”时压入堆栈的信息弹回原寄存器,然后执行中断返回指令(IRET),从而返回主程序继续运行。
前3项通常由处理中断的硬件电路完成,后3项通常由软件(中断服务程序)完成。

系统调用中断处理流程

举例跟踪linux内核系统调用的更多相关文章

  1. Linux内核-系统调用

    Linux内核-系统调用 1.与内核通信 #系统调用在用户空间进程和硬件设备之间添加了一个中间层 作用:1.为用户空间提供了一种硬件的抽象接口 2.系统调用保证了系统的稳定和安全 3.出于每一个进程都 ...

  2. 通过gdb跟踪Linux内核装载和启动可执行程序过程

    作者:吴乐 山东师范大学 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的:通过对一个简单的可执 ...

  3. 使用gdb跟踪Linux内核启动过程(从start_kernel到init进程启动)

    本次实验过程如下: 1. 运行MenuOS系统 在实验楼的虚拟机环境里,打击打开shell,使用下面的命令 cd LinuxKernel/ qemu -kernel linux-/arch/x86/b ...

  4. Linux内核系统调用处理过程

    原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 学号末三位:168 下载并编译Linux5.0 xz -d linux-.tar.xz . ...

  5. Linux内核系统调用列表

    一.进程控制: fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 _exit 立即中止当前进程 getdtablesize 进程所能打开的最 ...

  6. linux内核系统调用--sendfile函数

    在apache,nginx,lighttpd等webserver其中,都有一项sendfile相关的配置,在一些网上的资料都有谈到sendfile会提升文件传输性能,那sendfile究竟是什么呢?它 ...

  7. linux内核系统调用和标准C库函数的关系分析

    http://blog.csdn.net/skyflying2012/article/details/10044343

  8. LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...

  9. Linux内核分析学习总结

    20135125陈智威 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这学期开 ...

随机推荐

  1. kNN算法基本原理与Python代码实践

    kNN是一种常见的监督学习方法.工作机制简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k各训练样本,然后基于这k个“邻居”的信息来进行预测,通常,在分类任务中可使用“投票法”,即选择这k ...

  2. NBC朴素贝叶斯分类器 ————机器学习实战 python代码

    这里的p(y=1|x)计算基于朴素贝叶斯模型(周志华老师机器学习书上说的p(xi|y=1)=|Dc,xi|/|Dc|) 也可以基于文本分类的事件模型 见http://blog.csdn.net/app ...

  3. 一.MySQL安装

    版本:linux7.6 一.编译安装 1.下载epel源 [root@db01 ~]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyu ...

  4. Redis集群(单机多实例)

    Redis介绍   Redis是一个分布式缓存数据库服务器,提供基于内存访问的缓存服务,并且无论是在单服务器还是服务器集群上都有着较为灵活方便的扩展能力.   单个的Redis实例是单进程单线程的,由 ...

  5. MapReduce实现PageRank算法(稀疏图法)

    前言 本文用Python编写代码,并通过hadoop streaming框架运行. 算法思想 下图是一个网络: 考虑转移矩阵是一个很多的稀疏矩阵,我们可以用稀疏矩阵的形式表示,我们把web图中的每一个 ...

  6. acm:屁屁上的巴掌

    涉及算法:深度搜索 题目: 题目描述 小新是个调皮的孩子,他总是会把衣服搞脏,他的妈妈美伢非常的生气,于是在<和妈妈的约定条款>加上了第三百七十七条:小新衣服上每有一块污渍妈妈就会打小新的 ...

  7. Error: listen EADDRINUSE :::3000

    解释:端口已被占用 解决方法: 修改本服务要用的端口.如 3001 停止 3000 端口. lsof -i:3000 # 查看 3000 端口被占用情况 kill -9 xxx PID 为上调命令查看 ...

  8. Java问题解决:"错误:编码GBK 的不可映射字符"

    参考资料:http://blog.csdn.net/l1028386804/article/details/46583279 场景: 在使用javac编译java文件时出现以下错误: 解决方法: 使用 ...

  9. 大牛的IT经验,方法【跟,帮】

    学习方法一:实践,应用,坚持. [swoole-韩天峰] 我最开始工作也是在2家小公司,后来加入腾讯阿里,主要原因还是我坚持学习基础知识,从而得到了这个机会.有几个方面的基础知识,我建议每一位PHP程 ...

  10. 容器虚拟网卡与网桥docker0虚拟网卡的veth pair的配对

    一)基本知识: Docker 安装时会自动在 host 上创建三个网络:none,host,和bridge:详细说明可参考其它文档.我们可用 docker network ls 命令查看: 基于DRI ...