【发布时间】:2012-11-16 20:35:19
【问题描述】:
知道中断向量是中断处理程序的内存地址,或者是包含中断处理程序内存地址的称为中断向量表的数组的索引。当产生中断时,操作系统通过上下文切换保存其执行状态,并在中断向量处开始执行中断处理程序。
我有一些问题,我一直在寻找但还没有答案。
中断向量是否存储在 RAM 中?如果它存储在 RAM 中,谁将它设置为 ram?操作系统?
【问题讨论】:
标签: operating-system interrupt
知道中断向量是中断处理程序的内存地址,或者是包含中断处理程序内存地址的称为中断向量表的数组的索引。当产生中断时,操作系统通过上下文切换保存其执行状态,并在中断向量处开始执行中断处理程序。
我有一些问题,我一直在寻找但还没有答案。
中断向量是否存储在 RAM 中?如果它存储在 RAM 中,谁将它设置为 ram?操作系统?
【问题讨论】:
标签: operating-system interrupt
interrupt vector is the memory address of an interrupt handler
内存是 RAM 的同义词,所以是的中断向量存储在 RAM 中。如果设备驱动程序想要注册中断处理函数,则需要调用适当的操作系统调用(如果是 linux,则为request_irqs),并且它将在中断向量表中创建一个条目。此条目将指向您中断处理函数驻留在内存/RAM 中的任何位置。 操作系统负责管理中断向量表。
因此,无论何时发生特定中断,都会调用您的中断处理函数。
【讨论】:
它在 FLASH 中。不在内存中。寄存器在 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 无非是一个智能终端;你必须把它们当作你自己机器上的终端来做真正的工作,比如控制一些东西。
【讨论】: