我读到this回答,我想我已经有了一个清晰的想法。但后来this答案再次让我困惑。
有人可以给我一个清晰的图片来说明信号、异常、硬件中断和陷阱之间的区别吗?
另外,我想知道这些阻止CPU抢占的内核代码中有哪些?
示例会很有帮助。
最佳答案
•中断由硬件针对处理器内核外部的事件生成。 这些本质上是异步的,这意味着处理器不知道何时会生成中断。这些也称为硬件中断。示例:键盘产生的中断,用于在屏幕上键入字符,或定时器中断。
•异常:当处理器在执行指令时检测到错误情况时,就会发生异常,并被分类为故障、陷阱或<中止取决于报告的方式以及导致异常的指令是否可以在不丢失程序或任务连续性的情况下重新启动。 (这些技术术语至少在 x86 上使用,也许是其他架构或一般情况下使用。)示例:除以零,或页面错误。
•陷阱:基本上是一条指令,告诉内核从用户模式切换到内核模式。示例:在系统调用期间,TRAP 指令将强制内核代表进程执行内核内部(内核模式)的系统调用代码。
陷阱是一种异常。
x86 int 0x80“软件中断”指令是一个陷阱,与外部中断不同。 x86 对中断和异常使用单个处理程序表;其他 ISA 也可能这样做。
有些人更普遍地使用这个术语,作为“异常”的同义词。例如您可能会说“MIPS add
将捕获有符号溢出,因此编译器始终使用 addu
。”
•信号:信号由内核或进程(kill
系统调用)生成。它们最终由操作系统内核管理,并将它们传递到目标线程/进程。例如。除以零指令将导致内核向运行它的进程传递 SIGFPE 信号(算术异常)。 (例如,x86 #DE 故障由内核处理,为当前进程生成软件 SIGFPE。)
相关:
- When an interrupt occurs, what happens to instructions in the pipeline? - @Krazy Glew 的回答还使用英特尔定义定义了一些术语。
- Why are segfaults called faults (and not aborts) if they are not recoverable? - 段错误是页面错误的一种特殊情况,通常是可恢复的。即使用户空间的无效页面错误也不会导致内核崩溃,因此从这个意义上来说它是可以恢复的。
关于linux - 信号、异常、硬件中断、陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45485093/