operating-system - 有人可以帮我解决一些我无法掌握的操作系统概念 - 重新中断

标签 operating-system interrupt interrupt-handling

抱歉,我不确定这是否是一个合适的地方来问这个问题,但我希望它可以接受,如果不可以,我深表歉意! :)

我目前正在学习操作系统理论模块,但我有一些无法理解的概念 - 这是提问的合适地方吗?

我的主要问题是关于中断。当CPU检测到有中断发生时,我理解它必须找出这个中断源自哪里。我的理解如下,谁能告诉我这是否正确,并解释一下我的知识差距?

为了让 CPU 检测中断的来源,它可以查询所有对象来识别中断源,但这些基于 I/O 的问题将花费很长时间。相反,它使用中断周期,并期望数据总线上有一个中断标识符。如果是8位数据总线,则有256个中断级别(即2^8)。 (这是为什么?)

因此,为每个可能的中断级别编写了一个中断服务例程(ISR),并将其存储在由处理器标准化的固定位置(中断向量)的表中。在我的笔记中说“在获取地址之前必须知道位置”(这是什么意思?)

作为中断周期的一部分接收到的中断级别标识符用作中断向量的索引(有人可以稍微分解一下吗?)。我的理解是,一个值,中断级别标识符被传递给CPU,用来指向中断向量。

此外,当中断被称为“服务”时,这是什么意思?

非常感谢,很抱歉冗长的段落,我只是对这方面的很多方面感到有点困惑!

最佳答案

中断工作的一个重要部分是允许 CPU 被其他设备(例如接收到数据包的网卡)中断。我发现首先理解这个用例更容易。

当网卡需要告诉CPU已经接收到一些数据时,它会向CPU上的“中断引脚”发送一个数字。通常这是一个 8 位数字。该数字称为“中断级别”。

CPU 的构建方式是允许它跳转到某些代码来处理中断,然后返回到它正在执行的操作。这是内置硬件,因此它必须很简单:有一个表将每个中断级别与要调用的函数的地址相匹配。该功能称为“中断服务例程”。正如您所说,该表的位置是标准化的,因为它是在表中查找的硬件(因此其地址被硬编码在芯片中)。

服务中断只是意味着运行与中断相关的代码片段:对于网卡来说,这意味着从网卡读取数据包并将其复制到内存(大概是内存)网卡本身是有限的)。您询问“作为中断周期的一部分收到的中断级别标识符用作中断向量的索引”。这只是我们刚刚所做的事情的另一种表达方式:来自卡的信号(中断级别)被 CPU 用作表中的索引(“中断向量”)。在那里,它找到要运行的代码的地址;该代码是由网卡的设备驱动程序(或者可能是操作系统)放置在那里的。

当 ISR 函数返回时,CPU 将寄存器恢复到收到中断时的状态,因此可以恢复执行,就像什么也没发生一样。一种思考方式是,中断是一种允许 CPU 同时运行多个程序(您的程序和网卡驱动程序)的机制。

同样的中断概念也可以用于“软件中断”,其中信号不是来自 CPU 外部,而是来自内部。

关于operating-system - 有人可以帮我解决一些我无法掌握的操作系统概念 - 重新中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4351199/

相关文章:

python - 分发大型复杂 Python 项目以便其他用户完全安装它们而不考虑操作系统的最佳方式?

linux - 在 Linux 中启用和分配 IRQ

arm - 重新定位 ARM 异常向量?

iphone - openAL 流媒体和中断

multithreading - 一对一的多线程模型

c - 共享 V 内存系统调用的 shmflg 中的 0 标志是什么意思?

assembly - amd64 长模式下的零堆栈段

signals - 在执行结束时执行操作

macos - 在 Mac OS X Intel 上启用浮点中断

linux - 中断上下文下半部分(Softirq 或 tasklet)