知道中断向量是中断处理程序的内存地址,或者是称为中断向量表的数组的索引,该数组包含中断处理程序的内存地址。产生中断时,操作系统通过上下文切换保存其执行状态,并在中断向量处开始执行中断处理程序。
我有一些问题,我一直在搜索,但还没有答案。
中断向量是否存储在 RAM 中?如果它存储在 RAM 中,谁将它设置为 ram?操作系统?
知道中断向量是中断处理程序的内存地址,或者是称为中断向量表的数组的索引,该数组包含中断处理程序的内存地址。产生中断时,操作系统通过上下文切换保存其执行状态,并在中断向量处开始执行中断处理程序。
我有一些问题,我一直在搜索,但还没有答案。
中断向量是否存储在 RAM 中?如果它存储在 RAM 中,谁将它设置为 ram?操作系统?
interrupt vector is the memory address of an interrupt handler
内存是 RAM 的同义词,因此是存储在 RAM 中的中断向量。如果设备驱动程序想要注册中断处理程序函数,则需要调用适当的操作系统调用(如果是 linux 的话request_irqs
),它会在中断向量表。此条目将指向您中断处理函数驻留在内存/RAM 中的任何位置。负责管理中断向量表的是操作系统。
因此,无论何时发生该特定中断,都会调用您的中断处理函数。
它在闪存中。不在内存中。寄存器在 RAM 中。因为 RAM 是用来存储所有数据的。但是FLASH是存储所有程序的。中断向量由 Compiler 生成。
这取决于硬件。
如果 CPU 只能在中断时跳转到一个地址,那么该地址是 ROM 还是 RAM 取决于系统围绕 CPU 构建的内存映射。预定义的中断向量表同上。如果 CPU 允许为中断表设置基地址,那么这显然取决于操作系统。
一般来说,完全从磁盘加载的操作系统(如 Windows)显然会将其保存在 RAM 中。
部分或全部存储在 ROM 中的操作系统通常将向量表保存在 RAM 中,以便在运行时对其进行修改。在像 8 位 Acorn MOS 这样非常受限且定义明确的系统上,这是因为软件可能想要完全控制硬件——如果内存服务,那么由于内存映射的基础,特定系统在 ROM 中具有硬件向量但在那里放置一个例程,然后通过 RAM 进行软向量。所以这是一个非常慎重的决定。
在相对更宽敞的系统(如经典 Mac OS)上,这是因为它允许在事后修补 ROM。如果在机器出厂后在特定中断例程中发现错误,则可以发出操作系统更新,该更新将为例程加载 RAM 替换并仅更改向量表。这在 Mac OS 中特别有用,因为对系统的所有调用都使用类似于中断的陷阱机制。
在现代 Windows 操作系统下的 PC 上,中断向量存储在中断描述符表 (IDT) 中。您可以使用 LIDT 指令(加载中断描述符表)找到该表的位置。但是你不能在那里改变一个值,除非你可以让你的代码在特权级别零(环 o)下运行,并且微软和英特尔已经密谋使这在 Windows 下几乎不可能,因为所有的指令都会改变代码段寄存器( CS) 到响铃 0 被阻止对用户程序。这就是为什么 WINTEL 和南方古猿一样,在进化方面可能被证明是一条死胡同(我希望如此)。基本上,PC 无非是一个智能终端;你必须把它们当作你自己机器上的终端来做真正的工作,比如控制一些东西。