内核中断体系概括


前言

本文对内核中断进行概括以及讲述中断的具体实现方法在内核是怎么做的,会结合内核源码中的一些 .s 文件和 .c 文件来具体分析一下内核在中断中的实现方式。

  • 学习中断的目的:
    • 1、硬件的中断响应 --------> 内核驱动中的中断
    • 2、系统调用的函数响应(sys_call)--------> 系统调用
    • 3、自定义中断--------> 软件的软中断模式
    • 4、信号中断(kill -signalnum)--------> 对了解信号的使用、创建等有很大帮助
    • 5、系统的异常和错误 --------> 系统的异常获取,了解系统异常的作用

一、Linux的中断机制

1、分类

Linux的中断分为硬件中断和软件中断

  • 硬中断:由电脑中主机的 8259A 类似的硬件中断控制芯片发出的中断或 ARM 中断控制器发出的中断
  • 软中断:称为异常
    • 第一类:CPU 自行保留的中断
    • 第二类:系统调用异常

2、代码结构

汇编文件对应的c文件
linux/kernel/asm.strap.c
linux/kernel/system_call.sfork.c signal.c exit.c sys.c

二、中断的工作流程

1、中断的工作流程

  • ①. 做 CPU 工作模式的转化
  • ②. 进行寄存器的拷贝与压栈
  • ③. 设置中断异常向量表
  • ④. 保存正常运行的函数返回值
  • ⑤. 跳转到对应的中断服务函数上运行
  • ⑥. 进行模式的复原以及寄存器的复原
  • ⑦. 跳转回正常工作的函数地址继续运行

2、Linux 中中断的工作流程

  • ①. 将所有寄存器值入栈
    • (8086中)SS寄存器、EFLAG寄存器、ESP寄存器、CS寄存器、EIP寄存器
    • 错误码
    • ARM 中的 r0-r15
  • ②. 将异常码(中断号)入栈
  • ③. 将当前的函数返回值进行入栈(为了在中断执行后能够找到在哪中断的,能够复原)
  • ④. 调用对应的中断服务函数
  • ⑤. 出栈函数返回值
  • ⑥. 返回所有入栈的寄存器值

asm.s 和 system_call.s所做的工作是 ① ② ③ ⑤ ⑥,剩余 .c 文件所做工作是 ④

如图所示:
在这里插入图片描述
上图与 linux 源码对应关系如下:

中断前的处理过程,中断后的回复过程中断的执行过程
硬件中断的处理过程linux/kernel/asm.straps.c
软件及系统调用的处理过程linux/kernel/system_call.sfork.c signal.c exit.c sys.c

3、中断的代码实现过程

这里仅分析asm.s 和 trap.c

中断前的处理过程,中断后的回复过程中断的执行过程
硬件中断的处理过程linux/kernel/asm.strap.c

在这里插入图片描述

具体详细内容参考Linux内核完全注释:基于0.11内核(修正版V3.0).pdf P55~P62P256~P279
链接:Linux内核完全注释:基于0.11内核(修正版V3.0).pdf
提取码:ygz8

三、内核中断体系结构

  • 1、trap_init
    • set_trap_gate 设置的权限较高,只能由用户程序调用
    • set_system_gate 设置的权限较低,能有用户和系统所有的进程调用
      在这里插入图片描述
  • 2、system_call
    • 所有的系统调用 C 函数放到了一个统一的 sys_call_table
    • 系统调用的操作码
    • fn_ptr sys_call_table[] = { sys_setup, sys_exit, sys_fork, sys_read,
      sys_write, sys_open, sys_close, sys_waitpid, sys_creat, sys_link,
      sys_unlink, sys_execve, sys_chdir, sys_time, sys_mknod, sys_chmod,
      sys_chown, sys_break, sys_stat, sys_lseek, sys_getpid, sys_mount,
      sys_umount, sys_setuid, sys_getuid, sys_stime, sys_ptrace, sys_alarm,
      sys_fstat, sys_pause, sys_utime, sys_stty, sys_gtty, sys_access,
      sys_nice, sys_ftime, sys_sync, sys_kill, sys_rename, sys_mkdir,
      sys_rmdir, sys_dup, sys_pipe, sys_times, sys_prof, sys_brk, sys_setgid,
      sys_getgid, sys_signal, sys_geteuid, sys_getegid, sys_acct, sys_phys,
      sys_lock, sys_ioctl, sys_fcntl, sys_mpx, sys_setpgid, sys_ulimit,
      sys_uname, sys_umask, sys_chroot, sys_ustat, sys_dup2, sys_getppid,
      sys_getpgrp, sys_setsid, sys_sigaction, sys_sgetmask, sys_ssetmask,
      sys_setreuid,sys_setregid };
    • system_call.s ----------> Sched.c

我的qq:2442391036,欢迎交流!


  • 26
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Jupyter Notebook中,内核中断通常是由于代码执行时间过长或者代码出现死循环等问题导致的。解决内核中断的方法有以下几种: 1. 重新启动内核:在Jupyter Notebook界面的菜单栏中选择"Kernel",然后选择"Restart"来重新启动内核。这会清除内核的状态并重新运行代码。 2. 检查代码:内核中断通常是由于代码执行时间过长或者出现死循环等问题导致的。可以检查代码是否存在无限循环、大量计算或者需要较长时间才能完成的操作。可以尝试优化代码,减少计算量或者使用更高效的算法。 3. 分块执行:如果代码执行时间过长,可以将代码分成多个块进行执行。这样可以避免一次性执行大量代码导致内核中断。可以使用Jupyter Notebook的"Cell"菜单中的"Run All Above"或者"Run All Below"来分块执行代码。 4. 增加超时时间:可以通过设置超时时间来避免代码执行时间过长导致的内核中断。可以在代码块中使用`%timeit`魔术命令来测量代码执行时间,并根据实际情况设置合适的超时时间。 5. 使用并行计算:如果代码需要进行大量计算,可以考虑使用并行计算来加速代码执行。可以使用Python的多线程或者多进程库,如`concurrent.futures`、`multiprocessing`等来实现并行计算。 6. 更新软件包:有时内核中断可能是由于软件包版本不兼容或者存在bug导致的。可以尝试更新相关的软件包到最新版本,或者降级到稳定版本。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

须尽欢~~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值