Linux实验:跟踪分析Linux5.0.1内核处理系统调用的过程

学号后3位:403
原创作品转载请注明出处,本实验来源 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
给出相关关键源代码及实验截图,撰写一篇博客(署真实姓名或学号最后3位编号),并在博客文章中注明“原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ ”,博客内容的具体要求如下:
题目自拟,内容围绕系统调用进行;
博客中需要使用实验截图
博客内容中需要仔细分析系统调用、保护现场与恢复现场、系统调用号及参数传递过程
总结部分需要阐明自己对系统调用工作机制的理解。
博客URL提交到https://github.com/mengning/linuxkernel/issues/10 截止日期3月19日24:00

实验环境

内核代码:Linux Kernel
Ubuntu虚拟机:运行环境,本次使用VM Ware安装的Ubuntu18
QEMU:本次使用的模拟器,运行内核代码
gdb断点调试工具

实验过程

编译Linux5.0.1

cd mykernel/    
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 menuconfig
make -j 8

在make过程当中会遇到一系列问题,缺失文件包的情况如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对于这一系列情况,只需要根据错误提示,使用

sudo apt-get install ***

安装相应的文件包即可
在进行menuconfig相关配置时,会出现相应图形界面
在这里插入图片描述
在这里插入图片描述
此时只需要配置好相应的选项如下

kernel hacking
->Compile-time checks and compiler options
选择 [*]compile the kernel with debug info

编译的时间较长,编译完成后效果如下
在这里插入图片描述

制作根文件系统

在终端依次输入以下命令

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

由于是64位系统,最后通过qemu完成运行

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

在这里插入图片描述
效果图如下
在这里插入图片描述

跟踪系统调用

由于我的学号后3位是403,所以在 /usr/include/asm/unistd_32.h 中可查得
在这里插入图片描述
通过查询read函数相关的实现,我们可以知道
在这里插入图片描述
read函数的三个参数:
(1)fildes:文件描述符
(2)buf:指定读入数据的数据缓冲区
(3)nbytes:指定读入的字节数
函数返回值:
成功:已读的字节数
0:未读入任何数据
-1:出错

下面在test.txt中添加新的函数
在这里插入图片描述
在这里插入图片描述
对上述c文件进行重新编译制作img
在这里插入图片描述
使用qemu重新运行,效果如下,read读取本地txt文件当中的内容并输出
在这里插入图片描述
下面在使用qemu的时候在后面加入 -s -S -append nokaslr 方便进行gdb断点调试,此时得到的qemu是空白,打开另一个终端,进入linux-5.0.1文件夹,进入调试模式
在这里插入图片描述
在这里插入图片描述

实验总结

系统调用工作原理:
一般情况下,用户进程是不能访问内核的。它既不能访问内核所在的内存空间,也不能调用内核中的函数。系统调用是一个例外。其原理是
(1)进程先用适当的值填充寄存器
(2)然后调用一个特殊的指令
(3)这个指令会让用户程序跳转到一个事先定义好的内核中的一个位置。
(4)进程可以跳转到的固定的内核位置。这个过程检查系统调用号,这个号码告诉内核进程请求哪种服务。然后,它查看系统调用表(sys_call_table)找到所调用的内核函数入口地址。接着,就调用函数,等返回后,做一些系统检查,最后返回到进程。
系统调用中断处理过程
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值