3

知道中断向量是中断处理程序的内存地址,或者是称为中断向量表的数组的索引,该数组包含中断处理程序的内存地址。产生中断时,操作系统通过上下文切换保存其执行状态,并在中断向量处开始执行中断处理程序。

我有一些问题,我一直在搜索,但还没有答案。

中断向量是否存储在 RAM 中?如果它存储在 RAM 中,谁将它设置为 ram?操作系统?

4

4 回答 4

2

interrupt vector is the memory address of an interrupt handler

内存是 RAM 的同义词,因此是存储在 RAM 中的中断向量。如果设备驱动程序想要注册中断处理程序函数,则需要调用适当的操作系统调用(如果是 linux 的话request_irqs),它会在中断向量表。此条目将指向您中断处理函数驻留在内存/RAM 中的任何位置。负责管理中断向量表的是操作系统。

因此,无论何时发生该特定中断,都会调用您的中断处理函数。

于 2012-11-16T20:49:52.777 回答
2

它在闪存中。不在内存中。寄存器在 RAM 中。因为 RAM 是用来存储所有数据的。但是FLASH是存储所有程序的。中断向量由 Compiler 生成。

于 2012-12-03T00:20:45.800 回答
0

这取决于硬件。

如果 CPU 只能在中断时跳转到一个地址,那么该地址是 ROM 还是 RAM 取决于系统围绕 CPU 构建的内存映射。预定义的中断向量表同上。如果 CPU 允许为中断表设置基地址,那么这显然取决于操作系统。

一般来说,完全从磁盘加载的操作系统(如 Windows)显然会将其保存在 RAM 中。

部分或全部存储在 ROM 中的操作系统通常将向量表保存在 RAM 中,以便在运行时对其进行修改。在像 8 位 Acorn MOS 这样非常受限且定义明确的系统上,这是因为软件可能想要完全控制硬件——如果内存服务,那么由于内存映射的基础,特定系统在 ROM 中具有硬件向量但在那里放置一个例程,然后通过 RAM 进行软向量。所以这是一个非常慎重的决定。

在相对更宽敞的系统(如经典 Mac OS)上,这是因为它允许在事后修补 ROM。如果在机器出厂后在特定中断例程中发现错误,则可以发出操作系统更新,该更新将为例程加载 RAM 替换并仅更改向量表。这在 Mac OS 中特别有用,因为对系统的所有调用都使用类似于中断的陷阱机制。

于 2012-11-16T20:52:51.393 回答
-1

在现代 Windows 操作系统下的 PC 上,中断向量存储在中断描述符表 (IDT) 中。您可以使用 LIDT 指令(加载中断描述符表)找到该表的位置。但是你不能在那里改变一个值,除非你可以让你的代码在特权级别零(环 o)下运行,并且微软和英特尔已经密谋使这在 Windows 下几乎不可能,因为所有的指令都会改变代码段寄存器( CS) 到响铃 0 被阻止对用户程序。这就是为什么 WINTEL 和南方古猿一样,在进化方面可能被证明是一条死胡同(我希望如此)。基本上,PC 无非是一个智能终端;你必须把它们当作你自己机器上的终端来做真正的工作,比如控制一些东西。

于 2012-11-19T20:59:59.937 回答