2023-2024-1 20232806《Linux内核原理与分析》第六周作业

实验五 分析 system_call 中断处理过程

一、实验要求

  • 使用 gdb 跟踪分析一个系统调用内核函数(上周选择的那一个系统调用),系统调用列表参见 torvalds/linux。推荐在实验楼
    Linux 虚拟机环境下完成实验。
  • 根据本周所学知识分析系统调用的过程,从 system_call 开始到 iret 结束之间的整个过程,并画出简要准确的流程图。

二、实验过程

1.打开实验楼的终端,进行如下操作
1)更新menu代码至最新版
在这里插入图片描述
2)使用gedit指令打开test.c并在其中添加上次实验使用的getpid的c函数以及汇编代码

gedit test.c

然后添加Getpid和GetpidAsm函数
在这里插入图片描述
在main函数中加入两条MenuConfig语句
在这里插入图片描述
3)在命令行输入如下语句

make rootfs

在这里插入图片描述
4)在QEMU对话框中输入help,可以看到qemu中增加了先前我们添加的命令
在这里插入图片描述
5)执行新增加的命令getpid和getpid_asm
在这里插入图片描述
6)使用gdb跟踪分析一个系统调用内核函数,并在start_kernel处设置断点,输入命令c继续执行,终端和qemu的执行结果如下图:
在这里插入图片描述
在这里插入图片描述

7)继续在sys_getpid处设置断点,发现执行命令getpid时并没有停下,却在执行getpid_asm时停下了
在这里插入图片描述
在这里插入图片描述
8)进行若干次单步执行,发现出现了进程调度函数,并返回了进程调度函数中的一个当前进程任务的值
在这里插入图片描述
9)在system_call处设置断点,程序执行到system_call时会停止,当继续执行时,刚才停下的getpid_asm返回值
在这里插入图片描述
2.使用AI工具辅助学习
在这里插入图片描述
在这里插入图片描述

三、实验原理

1、系统调用在内核代码中的工作机制和初始化

    a、main.c中的start_kernel函数调用trap_init函数,trap_init函数调用set_system_trap_gate函数,set_system_trap_gate(SYSCALL_VECTOR,&system_call)函数绑定了中断向量0x80和system_call中断服务程序入口之后,一旦执行int 0x80,cpu就直接跳转到system_call这个位置来执行。
    b、SYSCALL_VECTOR:系统调用的中断向量。

2、system_call到iret过程流程图
在这里插入图片描述

四、实验总结

系统调用是 Linux 内核中用于处理用户空间程序请求的关键部分之一,通常使用 int 0x80 指令或 syscall 指令触发系统调用。总的来说,通过这次实验,我对系统调用函数的调用过程更加熟悉,对system_call函数的流程也理解地更加透彻,更好的提高了对于Linux内核机制的理解。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

20232806安星宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值