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

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

一、系统调用实验:

1.打开实验楼,按照之前做过的实验,打开QEMU

在这里插入图片描述

2.编辑 menu 中的 text.c 文件,给MenuOS增加 rename 和 rename_asm 命令:

在这里插入图片描述
在这里插入图片描述

3、再次运行Menu不难发现命令中添加了rename和rename_asm

在这里插入图片描述

4、在 start_kernel 处设置断点,在gdb中按c会在设置断点的 start_kernel 处停下来,在设置一个断点sys_rename,继续运行结果如下

在这里插入图片描述

二、system_call中断的机制

1 system_call并不是一个普通的函数,只是一段汇编代码的起点,且内部没有严格遵守函数调用堆栈机制。

2 通过set_system_trap_gate函数绑定了中断向量0x80和system_call中断服务程序入口之后,一旦执行0x80,CPU就直接跳转到system_call这个位置来执行。即系统调用的工作机制在start_kernel里初始化之后,CPU一旦执行到int 0x80指令就会立即跳转到system_call的位置。

3 代码中的sys_call_table是一个系统调用的表,EAX寄存器传递的系统调用号,使用者在调用它时会根据EAX寄存器值来调用对应的系统调用内核处理函数。

4 中断向量0x80和system_call中断服务程序入口的关系0x80对应着system_call中断服务程序入口,在start_kernel函数中调用了trap_init函数,trap_init函数中调用了set_system_trap_gate函数,其中有系统调用的中断向量0x80和system_call中断服务程序入口的函数指针,system_call被声明为一个函数,通过set_system_trap_gate函数绑定了中断向量0x80和system_call中断服务程序入口之后,一旦执行int 0x80,CPU就直接跳转到system_call这个位置执行。

5 系统调用用户态接口和系统调用的内核处理函数是通过系统调用号匹配起来的

6 system_call中断服务程序执行流程:从entry(system_call)开始执行,根据系统调用号来查sys_call_table表中的位置,调用系统调用对应的处理函数,在syscall_exit里面判断当前任务是否需要处理syscall_exit_work,进入syscall_exit_work,这是最常见的进程调度时机点。 其中sys_call_table(,%eax,4)可以理解为,分派表中每个表项占4个字节,所以先把系统调用号(eax)乘以4,再加上sys_call_table分派表的起始地址,得到系统调用号对应的系统调用内核处理函数的指针。
在这里插入图片描述

三、总结

通过本章的学习和实验,明白了系统调用是一种特殊的中断,初步理解了系统调用的过程。在系统调用时,我们需要SAVE_ALL,用于保存系统调用时的上下文。同样,中断处理的第一步应该也要保存中断程序现场。目的:在中断处理完之后,可以返回到原来被中断的地方,在原有的运行环境下继续正确的执行下去。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值