system_call中断处理过程

网易云课堂《Linux内核分析》MOOC课程:http://mooc.study.163.com/course/USTC-1000029000,欢迎前往共同学习。
一、课堂内容概述
  在本讲中,继续上节内容,先是讲述了如何将自己编写的系统调用程序加载到MenuOS系统中。主要分为以下几步:
  1、删除原有MenuOS系统,用github clone新版MenuOS。主要指令如下:
rm menu -rf
git clone https://github.com/mengning/menu.git
  2、将上节课完成的系统调用函数添加到 menu 目录下的 test.c 中:添加 MenuConfig 及相应的系统调用函数。
  3、在 menu 目录下,重新编译 MenuOS 系统。
make rootfs
  编译完成后,MenuOS 系统会自动启动。与旧版相比,新版主要是增加了 time 与 timeasm 这两个课堂实例 。

  接下来,就是使用 gdb 跟踪 新增函数的系统调用过程了。这一部分,我结合自己的实例来加以说明与分析。
二、添加自定义系统调用函数,重新编译 MenuOS
  在上节课中,我实验的系统调用是执行删除目录功能的 rmdir 函数。现将其加入到 MenuOS 系统的 test.c中,代码如下:

  代码修改完毕,重新编译 MenuOS系统,以使新增函数生效。

  由 help 命令可知,新的函数已经添加到系统命令中了,本想验证下自己的函数的功能的,可现有系统下没有目录可删,尝试着又加入了一个 mkdir 指令,可没有权限在 MenuOS 中添加目录。好吧,自己选的材,做出的菜再难看,也得尝尝不是?那就将错就错,继续跟踪分析吧。
三、跟踪分析
  先关闭MenuOS,再以前面学习过的 linux 内核启动跟踪方法启动 MenuOS。
qemu - kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
(gdb) file linux-3.18.6/vmlinux
(gdb) target remote:1234
  接下来是设置断点。因为是要跟踪用户的系统调用函数,所以直接在rmdir 函数所使用的系统调用接口 sys_rmdir 处设置断点。至于伪函数 system_call(只是一段汇编代码的入口标记,因为 gdb 无法在此处停下,这里的断点设置也就可有可无。为了多充点字数,还是加上好了。
(gdb) b sys_rmdir
(gdb) b system_call
  接下来,按下 “c”,让 MenuOS 完全启动。再无参执行 rmdir 命令,还好,gdb还是抓到了一个sys_rmdir:
rmdir

  不知道这个出错信息是什么意思,又按了几次n,一直显示这个,那就按“c“让 rmdir 运行完好了。又多试了几回 rmdir,MenuOS 与 gdb 居然都成了“僵尸”,只好"kill 无赦"了。

  换老师的 time 指令跟踪,一到 sys_time 断点,MenuOS 与 gdb 又都卡死了。。。
  看来实验是做不成了,咱就直接以老师在课堂上提供的伪代码来分析系统调用过程吧。由这段伪代码生成的流程图如下:

  由流程图可知,发生系统调用时,要先执行 SAVE_ALL,保存所有的现场信息,再根据保存在 eax 寄存器中的系统调用号,执行相应的的系统功能,返回值同样保存在eax寄存器中,需要用户及时取出,以免被其他系统调用破坏。系统调用执行完毕,并不是直接返回调用函数,而是先判断当前进程有没有其他需要处理的调度情况、信号处理等,如有,先处理这些情况,没有则直接跳过。接着通过 restore_all 恢复调用前现场信息,最后返回调用函数,结束系统调用过程。
四、总结
  执行系统调用时,先保存现场,准备调用参数,接着执行系统调用,保存调用结果。处理必需的调度、信号等,恢复现场,返回调用函数,这便是system_call中断处理的大概过程。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "Interrupted system call" 是指一个系统调用被一个信号中断了。在Unix或类Unix系统中,信号可以被进程或操作系统发送给进程,以通知它发生了某些事件或错误。当一个进程在执行系统调用时,如果它接收到一个信号,系统调用可能会被中断并返回一个错误代码 EINTR,表示这个操作被中断了。这个错误代码通常需要被处理,以确保系统调用能够继续执行或恢复执行。 ### 回答2: "interrupted system call" 是一个指在操作系统中经常遇到的错误消息,通常会出现在一个进程正在执行系统调用(system call)的过程中被中断时。这个错误消息表明在执行过程中发生了某种中断事件,导致系统调用无法完成。 中断事件可以是多种原因引起的,例如,当进程收到一个信号时,操作系统可能会中断当前的系统调用来处理该信号。另外,计时器到期、输入/输出操作出现错误、内存访问违规等情况也可能导致系统调用中断。 当一个系统调用被中断时,操作系统会将正在执行的系统调用的状态保存起来,然后将控制权返回到调用它的进程。进程可以通过检查系统调用的返回值来确定系统调用是否成功完成,如果系统调用被中断,则通常返回一个特殊的错误码。 对于开发者而言,处理 "interrupted system call" 错误通常需要检查系统调用的返回值,并根据具体情况采取相应的处理措施。这可能包括重新尝试系统调用、忽略中断事件、处理发生的错误等。 总之,"interrupted system call" 是一个常见的操作系统错误消息,表示在执行系统调用的过程中发生了中断事件,进程需要根据错误码和具体情况来进行处理。 ### 回答3: "interrupted system call"是一个指在进行系统调用过程中被中断的情况。在操作系统中,系统调用是应用程序与操作系统之间进行交互的机制。当应用程序需要执行一些特权操作或访问底层资源时,就会发起一个系统调用。 在执行系统调用期间,操作系统可能会发生一些中断事件,例如定时器中断、硬件中断等。当中断事件发生时,操作系统会暂停当前正在执行的进程,切换到中断处理程序中执行。一旦中断事件的处理完成,操作系统会再次返回原来的进程继续执行。 在这个过程中,如果一个系统调用未能完成,就会出现"interrupted system call"的情况。这通常是由于中断事件中断了系统调用的执行。例如,在进行IO操作时,如果设备中断发生,操作系统会中断当前的系统调用,并开始处理设备中断。一旦设备中断处理完成,操作系统会再次返回原来的系统调用。 当出现"interrupted system call"时,操作系统会将一个特定的错误码返回给应用程序,以表示系统调用被中断的原因。应用程序可以根据错误码来做相应的处理,例如重新发起系统调用或进行错误处理。 总之,"interrupted system call"表示在系统调用过程中由于中断事件的发生而导致系统调用被中断。这是操作系统的正常行为,应用程序可以根据错误码来进行相应的处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值