繁体   English   中英

8086 中的中断、指令指针和指令队列

[英]Interrupts, Instruction Pointer, and Instruction Queue in 8086

假设向 8086 发出外部中断请求。处理器将在完成当前正在执行的指令(如果有)后处理中断。 在处理中断之前,还将通过将数据压入堆栈段来保存程序的状态(PSW 标志、寄存器等)。

现在,大多数教程/文档都描述指令指针也被压入堆栈段,这没关系,因为它指向代码段中指令的下一个字节(就在发出中断请求之前)。

但是指令队列会发生什么? 在处理中断请求时是否也被压入堆栈段? 还是它的内容被清零了? 在这种情况下,指令指针是否应该递减以便它可以指向代码段中的先前指令(在中断服务之后)?

IP 入栈

这里, After interrupt request实际上是指After interrupt request has been served 这张图显示的是在中断请求到来之前,指令被缓存起来, IP指向CS内存段中下一条指令字节的地址 为了服务于中断请求,寄存器的内容(包括 IP 和标志)被压入堆栈段。 服务请求后,之前的内容被加载回来 - IP 仍然指向第 7 个字节(指令)的位置,队列(缓存)为空。 这就是我的疑惑。 IP 是否递减以指向 i1 其次,我们是否需要手动处理 IP(例如,在中断时将其压入堆栈)还是由中断服务例程为我们处理? 请,任何帮助表示赞赏,谢谢!


注意: 指令队列——8086 架构有一个六字节的预取指令流水线。 当执行单元正在执行当前指令时,总线接口单元会预先从内存中读取最多六个字节的操作码。

您不太清楚“指令队列”的含义。

一个含义可能是“预取指令”。 实际上,处理器基于各种类型的分支预测算法,在分支之后或者不分支之后,在指令流中从最后完成的指令的点推测性地预读。 由于这些是读操作 ,如果处理器决定放弃当前指令“流”用于另一个(例如,中断例程),则它只是忽略其预读。

另一个含义可能是“部分执行的指令(在飞行中/在'管道中')”,这经常发生在超标量CPU上。 在异步中断的情况下,处理器必须完成那些影响系统可见状态的处理器(例如,已经提交了对寄存器或存储器的写入),并且可能会或可能不会完成其他指令,具体取决于特定处理器的设计者。 在同步陷阱的情况下,处理器必须完成影响状态的指令,但只是放弃其余的(OP的短语是“队列零”,其具有正确的概念但错误的措辞)。

[根据OP的要求添加我做的评论]:你说8086有一个6字节的预取“指令管道”(坏的术语恕我直言)。 可能有一个属性,但这是实现的细节,并没有充分的理由相信这是所有8086的属性。 对于现代CPU,实现指令预取的方式仅取决于设计者的聪明才智。 关于所有你可以合理预测的是,会有一些预取方案,除了对性能的影响和有关自修改代码的有趣规则之外,你很难在应用程序中检测它的存在。

[回答OP的第二个问题]: 其次,我们需要手动处理IP(比如,在中断时将其推入堆栈)还是中断服务程序为我们处理这个问题?

对于任何类型的陷阱或中断,存储架构定义的状态(“寄存器”,PC等)就足够了。 对于许多处理器,硬件存储架构状态的关键子集就足够了,让中断例程存储(并最终恢复)其余的处理器。 因此,存储整个状态的责任在硬件和软件之间分配(以节省硬件中的实现工作量)。

对于x86系列,通常指令指针(IP)和标志寄存器由硬件推送到当前堆栈,控制转移到中断,而中断例程具有通常在操作中存储其余寄存器的指令。系统定义的数据结构通常称为“上下文块”。 中断例程完成其工作,并通过重新加载寄存器将控制返回给应用程序,然后使用特殊的IRET指令重新加载IP和标志,或者将控制转移到选择运行其他活动的OS调度程序,最终使用保存的上下文块内容重新启动应用程序。

一个非常快速的中断例程可能会保存足够的寄存器来完成其关键工作,然后在返回到中断之前恢复这些寄存器。

  • 当发生中断或陷阱时,CPU通过停止与高速缓存同步,直到所有挂起的高速缓存操作完成或被抢占为止。
  • 如果缓存加载已在进行中,则表示已完成,但队列中等待的其他操作将被抢占。
  • 队列存储为缓存内部状态的一部分,因此在恢复上下文时,抢占的操作将重新排队。

8086 处理器有一个 6 字节的指令预取队列。 要回答这个问题,当中断发生时,程序计数器(指令指针)被压入堆栈并丢弃队列。 棘手的部分是内部程序计数器指向下一个要预取的字节,这与下一个要执行的字节不同。 解决方案是通过使用小常量表和寻址加法器减去队列大小来校正程序计数器值。 对子程序调用和相对跳转进行相同的更正,因为它们也需要真实的 PC 值。

引用8086专利第8栏第27行:

PC 不是真正的或真实的程序计数器,因为它不会,也不会在 CPU 内的任何其他寄存器中随时维护实际执行点。 PC实际指向下一个要输入队列的字节。 每当需要相对跳转或调用时,通过从 PC 减去队列中仍未使用的已访问指令数,即可按指令计算实际程序计数器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM