前言
上篇我们分析了bochs对于int产生的interrupt事件的模拟处理流程,只是我们还没看看其返回如何实现的,我们这篇文章来分析一下。
虽然源代码还没看,但我估计这篇文章有点短,昨晚失眠到两点多,今天早上还是七点起来,中午竟然睡不着,我人麻了,早写完回家洗个澡休息。
bochs-dbg定位
这个之间按上篇文章 int 指令往前jmp几条指令后就很容易看见,不用ida来逆向分析了,因为其还要逆向lib32库挺麻烦的。
代码分析
其iret与int一样,在不同模式下其行为不一样,因此iret指令一上来就需要做当前CPU模式判断,在保护模式中,之后其按顺序出栈,加载段选择子,这些很好理解,在上篇文章中这些具体操作我们都分析过了,这里就不过多解释了。
值得注意的是,好像无论trap还是interrupt,其iret时执行的行为方式没有差别,在分析过程中没有看到对此的区分,之后我们还会对trap再来一轮分析。
BX_CPU_C::iret_protected(bxInstruction_c *i)
{
/* 16bit opsize | 32bit opsize
* ==============================
* SS eSP+8 | SS eSP+16
* SP eSP+6