假设向8086发出外部中断请求。处理器将在完成正在执行的当前指令(如果有的话)后处理中断。在处理中断之前,还将保存程序的状态(PSW标志、寄存器等)。通过将数据推送到堆栈段。
现在,大多数教程/文档都描述了指令指针也被推到堆栈段上,这是可以的,因为它指向代码段中的下一个指令字节(就在发出中断请求之前)。
但是指令队列会发生什么呢?当处理中断请求时,它是否也被推到堆栈段上?还是它的内容被清除为零?在这种情况下,不应该减少指令指针以使其能够指向代码段中的先前指令(在中断服务完成后)?
在这里,中断请求后的实际上是指中断请求已被处理后的。这个图表显示的是,在中断请求出现之前,指令被缓存,中的IP指向CS内存段中下一个指令字节的地址。为了服务中断请求,寄存器的内容(包括。IP和标志)被推送到堆栈段上。在请求被处理后,前面的内容被加载回,IP仍然指向7字节 (of )的位置,而队列(缓存)是空的。这就是我所怀疑的。IP是否减少以指向i1?其次,我们需要手动处理IP (比如,在中断时将它推到堆栈上)还是中断服务例程为我们处理这个问题?谢谢,任何帮助都是非常感谢的!
注意:指令队列 - 8086的体系结构有一个6字节的预取指令管道.当执行单元正在执行当前指令时,总线接口单元预先从存储器中读取多达六个字节的操作码。
发布于 2014-05-24 08:46:01
您不太清楚“指令队列”是什么意思。
其中一个意思可能是“预取指令”。在实践中,处理器根据各种类型的分支预测算法,从上一次完成指令的点开始,在指令流中进行推测性读取,跟踪分支或不跟踪分支。由于这些是读的,如果处理器决定放弃当前的指令“流”换另一个指令(例如中断例程),它就会忽略它的预读。
另一个意思可能是“指令部分执行(在飞行/在‘管道’)”,这经常发生在超级标量CPU。在异步中断的情况下,处理器必须完成那些已经影响到系统可见状态的指令(例如,已经提交了对寄存器或内存的写入),并且可以或者不完成其他指令,这取决于特定处理器设计器的奇想。在同步陷阱的情况下,处理器必须完成影响状态的指令,但是简单地放弃其余的指令(OP的短语是“零队列”,它有正确的概念,但措辞错误)。
应OP的要求,我添加了一个注释:您说8086有一个6字节的预取“指令管道”(IMHO这个糟糕的术语)。可能有这样的特性,但这是实现的细节,没有充分的理由相信这是所有8086 s的属性。对于现代CPU来说,实现指令预取的方式仅仅取决于设计者的聪明程度。您可以合理地预测的是会有一些预取方案,除了对性能的影响和关于自修改代码的有趣规则之外,您很难在应用程序中检测到它的存在。
回答OP的第二个问题:第二,我们需要手动处理IP (比如,在中断时将它推到堆栈上),还是中断服务例程为我们处理这个问题?
对于任何类型的陷阱或中断,存储体系结构定义的状态(“寄存器”、PC等)就足够了。对于许多处理器来说,硬件存储架构状态的一个关键子集就足够了,并让中断例程存储(并最终恢复)其余的部分。因此,存储整个状态的责任分为硬件和软件(以节省硬件中的实现工作)。
对于x86家族,指令指针(IP)和标志寄存器通常由硬件推送到当前堆栈,控制传输到中断,并且中断例程具有通常存储在操作系统定义的数据结构(通常称为“上下文块”)中的其余寄存器的指令。中断例程完成其工作,或者通过重新加载寄存器将控制返回给应用程序,然后使用特殊的IRET指令重新加载IP和标志,或者将控制转移到选择运行其他活动的OS调度器,最终使用保存的上下文块内容重新启动应用程序。
一个非常快的中断例程可能会保存足够多的寄存器来完成其关键工作,然后在返回中断程序之前恢复这些寄存器。
发布于 2014-05-24 04:45:29
https://stackoverflow.com/questions/23838410
复制相似问题