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

学号375
转载请注明出处 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

内核编译

1.首先下载linux内核5.0源码

wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.tar.xz

2.解压缩并编译

xz  -d  linux-5.0.tar.xz
tar -xvf linux-5.0.tar
cd linux-5.0
make menuconfig
make

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
内核编译
在这里插入图片描述

制作文件

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

运行menuOS

qemu -kernel /home/wxy/linux-5.0.1/arch/x86/boot/bzImage -initrd ../rootfs.img

在这里插入图片描述

跟踪调试内核启动

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

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

按c后qemu继续执行
在这里插入图片描述

我的学号是375,后两位是75。查看可知系统调用为 __NR_setrlimit。

在这里插入图片描述
该函数为:

#include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);

功能是获取或设定资源使用限制。每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,硬限制是软限制的最大值。非授权调用进程只可以将其软限制指定为0~硬限制范围中的某个值,同时能不可逆转地降低其硬限制。授权进程可以任意改变其软硬限制。RLIM_INFINITY的值表示不对资源限制。
在test.c中增加下列函数,准备跟踪:
在这里插入图片描述
在这里插入图片描述
重新编译执行
在这里插入图片描述
成功显示出重新设置空间大小后的值。
下面调用gdb进行调试:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验总结

	总的流程就是当发生系统调用时,int 0x80触发中断,系统保存现场后进入内核态,根据调用号寻找到相应的处理程序完成中断处理,结束后再返回。

系统调用的工作机制是:当用户态进程调用一个系统调用时,CPU切换到内核态并执行对应的内核函数,内核函数由操作系统预先定义并分配了编号,调用过程中系统通过eax寄存器传递调用函数的编号,通过编号寻找相应的中断处理程序完成所需的功能,完成后通过已保存的现场返回并继续往下执行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值