前言
上篇文章我们讲了如何调试bochs的cpu代码,这篇文章我们尝试结合intel手册来一起研究一下其cpu代码的实现。
定位到cli指令的代码
还是利用ext3-2中的代码,其0x7c00处的指令是cli,利用ph 0x7c00定位到该指令处。然后在vscode中设置断点,单步进入“BX_CPU_CALL_METHOD(i->execute1, (i));”函数中,代码如下。

void BX_CPP_AttrRegparmN(1) BX_CPU_C::CLI(bxInstruction_c *i)
{
Bit32u IOPL = BX_CPU_THIS_PTR get_IOPL();
if (protected_mode())
{
#if BX_CPU_LEVEL >= 5
if (BX_CPU_THIS_PTR cr4.get_PVI() && (CPL == 3))
{
if (IOPL < 3) {
BX_CPU_THIS_PTR clear_VIF();
BX_NEXT_INSTR(i);
}
}
else
#endif
{
if (IOPL < CPL) {
BX_DEBUG(("CLI: IOPL < CPL in protected mode"));
exception(BX_GP_EXCEPTION, 0);
}
}
}
else if (v8086_mode())
{
if (IOPL != 3) {
#if BX_CPU_LEVEL >= 5
if (BX_CPU_THIS_PTR cr4.get_VME()) {
BX_CPU_THIS_PTR clear_VIF();
BX_NEXT_INSTR(i);
}
#endif
BX_DEBUG(("CLI: IOPL != 3 in v8086 mode"));
exception(BX_GP_EXCEPTION, 0);
}
}
BX_CPU_THIS_PTR clear_IF();
BX_NEXT_INSTR(i);
}
INTEL手册中对cli的说明
我们该如何阅读cpu代码的呢,我们计划与Intel的CPU手册中对该指令的解释来进行对比。我们先看intel手册中对该指令的描述(https://www.felixcloutier.com/x86/cli)
in most cases, CLI clears the IF flag in the EFLAGS register and no other flags are affected. Clearing the IF flag causes the processor to ignore maskable external interrupts. The IF flag and the CLI and STI instruction have no effect on the generation of exceptions and NMI interrupts.
Operation is different in two modes defined as follows:
- PVI mode (protected-mode virtual interrupts): CR0.PE = 1, EFLAGS.VM = 0, CPL = 3, and CR4.PVI = 1;
- VME mode (virtual-8086 mode extensions): CR0.PE = 1, EFLAGS.VM = 1, and CR4.VME = 1.
If IOPL < 3 and either VME mode or PVI mode is active, CLI clears the VIF flag in the EFLAGS register, leaving IF unaffected.
看Intel手册,其CLI指令清除ELFAGS中的IF标志位,其他的标志位不会受映像。清除IF标志位可以让intel忽视可屏蔽中断,而其余的异常和NMI中断不会受影响,操作在保护模式(PVI)与虚拟8086模式(VME)模式下是不同的。
如果IOPL<3 并且 (VME 或 PVI模式被激活),CLI将清除EFLAGS的cr4.VLF标志位,IF标志位不会受到影响。
CPU代码解读
我们来解读其CPU代码,这块比较简洁,同时intel也给出了各种清空,因此综合来看绘制成表格比较清晰。

因为我们现在是在实模式地址中,其仅仅将IF标志位置为零,之后调用inhibit_interrupts函数来屏蔽可屏蔽中断,其中的很多细节我们暂时还接触不到,之后随着深入学习,我们会逐渐了解其bochs中断的实现原理。
总结
这篇文章只是尝试结合intel手册初步分析一下指令,可以看出,bochs的代码还是比较简洁的,通过intel手册中对指令的描述非常容易地来理解代码。
1491




被折叠的 条评论
为什么被折叠?



