操作的步骤如下:
1、记录中断处理函数的段内偏移
2、获取或指定段选择子
3、对idt表赋值(本操作是对所有的中断都采用同一的函数(MyIntFunc)处理)
注: _idt 中断描述符表的基址
idt_descr 中断描述符操作的参数
图示如下:63.55.47.39.31.23.15.7.0
|MyIntFunc[2] |MyIntFunc[3] |0x8e |0x00 |0x00 |0x08 |MyIntFunc[1] |MyIntFunc[0] |
setup_idt:
lea MyIntFunc,%edx # 将 ignore_int的有效地址(偏移值)值 edx寄存器
movl $0x00080000,%eax # 将指定段选择子 0x0008置入 eax 的高 16位中。
movw %dx,%ax /* 偏移低两字放入ax 对应中断描述符的低两字节(0,1) */
movw $0x8E00,%dx /* 状态字 interrupt gate - dpl=0, present */
lea _idt,%edi # _idt是中断描述符表的地址。
mov $256,%ecx
rp_sidt:
movl %eax,(%edi)# 将哑中断门描述符存入表中。
movl %edx,4(%edi)
addl $8,%edi# edi指向表中下一项。
dec %ecx
jne rp_sidt
lidt idt_descr # 加载中断描述符表寄存器值。
ret
idt_descr: #下面两行是lidt 指令的6 字节操作数:长度,基址。
.word 256*8-1 # idt contains 256 entries
long _idt