异常的执行如下:
发出一条cld
指令以清除DF
的方向标记eflags
,从而确保
edi
和esi
寄存器上的自动递增将与字符串指令一起使用。 [*]
[*]
诸如rep;movsb
之类的单一汇编语言“字符串指令”能够
对整个数据块(字符串)起作用。
esp+36
中位置edx
处堆栈中保存的硬件错误代码。将值-1
存储在
相同的堆栈位置。我们将在第11章的“重新执行系统调用”部分中看到
值用于将0x80
异常与其他异常分开。edi
C函数的地址加载do_handler_name( )
在位置esp+32
;将es
的内容写入该堆栈位置。eax
寄存器中加载当前内核模式堆栈的顶部位置。该地址标识
包含步骤1中保存的最后一个寄存器值的存储单元。ds
和es
寄存器中。edi
中。在第6步中,为什么在这种情况下需要加载数据段选择器?在这种情况下,gates的作用是什么?
对于中断,代码也是->
for (i = 0; i < NR_IRQS; i++)
if (i+32 != 128)
set_intr_gate(i+32,interrupt[i]);