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)找到所调用的内核函数入口地址。接着,就调用函数,等返回后,做一些系统检查,最后返回到进程。
系统调用中断处理过程