在黑暗时代,在 Apple 2 上,你根本没有中断。一切都是通过投票类型的方案完成的。你会读取 I/O 端口,并根据不同的位知道你是否读取新数据。例如,要从软盘加载一个字节,您将循环直到一个字节为负(第 7 位已设置):
$1
LDA 0xC030
BPL $1
请注意,在 Intel 处理器(可能还有其他处理器)上,中断非常重载。也就是说,无论是VBL中断、USB端口中断,还是全新的SSD硬盘中断,都可能使用中断0x20。然后 CPU 的工作就是确定需要为哪一个或哪些服务。在最后一种情况下,即多个设备同时引发相同的中断,您必须确保在返回之前它们都得到服务,因为您不会再收到另一个中断(即大多数设备发送一个中断信号,它们不会重复它直到服务)。
更详细的一点是,在处理一个中断时,CPU 会阻止更多中断(在 Intel 处理器上为STI/ )。CLI这意味着它可以完成当前中断的所有工作,然后最终它必须处理另一个中断。这确保了 I/O 数据处理中的序列化。这就是为什么我们经常从设备获取相对少量的数据。这允许将数据放置在用户空间中,然后可以由任意数量的线程处理。在现代 CPU 上,每个特定的中断都可以由单独的 CPU 处理。这允许并行处理多个中断。不过,根据我目前所见,您必须提前决定哪个 CPU 将处理哪个中断。它不会在 CPU 之间进行乒乓。
你把它放在或标题中是一件好事,因为答案是肯定的。
也就是说,确切的答案取决于您所询问的确切中断。我们以 SPI 端口和 DMA 为例。SPI 是一个双向串行接口。
例如,DMA 中断标记所谓的水位是很常见的。当 DMA 缓冲区已满、“几乎满”(例如 3/4)、“几乎为空”(例如 1/4)以及完全为空时,您将获得中断。
对于 SPI 端口,您将有两个 DMA 通道。一个将处理来自外部设备的数据,另一个将处理从您的计算机发送到设备的数据。
因此,当输出 DMA 通道中断指示缓冲区为空时,这意味着输出已完成。当输入 DMA 通道中断指示缓冲区不为空时,这意味着输入数据可用。
是的。
考虑写入串行端口设备。该设备有一个称为 FIFO 的接收缓冲区,用于存储少量数据,例如 16 字节。
当
tcdrain()
在Linux上实现的。据称“在更改影响输出的参数时应使用此功能”。例如,当你想改变串行端口的“波特率”(频率)时,你可以使用它来等待,直到所有缓冲数据都已使用当前波特率传输。也许。不过,我不确定这里有两种不同的东西,至少在我的例子中是这样。
考虑从串行端口设备读取。该设备有一个称为 FIFO 的传输缓冲区,用于存储少量数据,例如 16 字节。
当 FIFO 从输入中收集到至少一个字节时,设备将发送一个中断。例如,它可能会在连接到 CPU 的线路上从低电压变为高电压。
CPU 可以通过从 IO 端口或 IO 内存读取来消耗缓冲区中的字节。
旁注:此类事务可能比从系统 RAM 中读取花费的时间更长。为此,IO 设备必须在总线上插入“等待状态”。即有一个简短的握手,在 IO 设备设置“数据就绪”位之前可能需要几个总线频率周期。写入 IO 端口/IO 内存时,同样可以应用等待状态。但是,等待状态仅用于覆盖不同设备之间已知的操作频率/延迟差异。它们不用于等待外部输入或输出。这是因为它们会阻止 CPU 继续执行任何其他操作。
因此,当输入可用时,会发出中断信号。如果愿意,当 CPU 读入输入字节时,您可以说输入“完成”。但是不需要中断来发出这个信号。正如不需要中断来表示从内存中读取已完成一样。
输入缓冲区已满的情况实际上看起来更像是错误情况 - 它表明缓冲区溢出。该条件可能确实被设备记录下来,从而使操作系统能够检测到错误。但是,我认为没有理由专门针对溢出发送中断。因为当输入可用时,设备可能已经发送了中断。
当重要事件发生时,大多数现代设备确实会产生中断。
然而,中断是有代价的。它停止处理器当前正在执行的操作,迫使它处理中断。如果你收到太多中断,它实际上会破坏你的操作系统。我遇到过蓝牙中断过多(即每秒超过 700,000 次)之类的问题。
在黑暗时代,在 Apple 2 上,你根本没有中断。一切都是通过投票类型的方案完成的。你会读取 I/O 端口,并根据不同的位知道你是否读取新数据。例如,要从软盘加载一个字节,您将循环直到一个字节为负(第 7 位已设置):
请注意,在 Intel 处理器(可能还有其他处理器)上,中断非常重载。也就是说,无论是VBL中断、USB端口中断,还是全新的SSD硬盘中断,都可能使用中断0x20。然后 CPU 的工作就是确定需要为哪一个或哪些服务。在最后一种情况下,即多个设备同时引发相同的中断,您必须确保在返回之前它们都得到服务,因为您不会再收到另一个中断(即大多数设备发送一个中断信号,它们不会重复它直到服务)。
更详细的一点是,在处理一个中断时,CPU 会阻止更多中断(在 Intel 处理器上为
STI
/ )。CLI
这意味着它可以完成当前中断的所有工作,然后最终它必须处理另一个中断。这确保了 I/O 数据处理中的序列化。这就是为什么我们经常从设备获取相对少量的数据。这允许将数据放置在用户空间中,然后可以由任意数量的线程处理。在现代 CPU 上,每个特定的中断都可以由单独的 CPU 处理。这允许并行处理多个中断。不过,根据我目前所见,您必须提前决定哪个 CPU 将处理哪个中断。它不会在 CPU 之间进行乒乓。