OS实验2-3 课堂练习2.2 中断/异常的处理过程
第1关:除零异常分析
本关任务:
解题过程:
1.查看idiv指令地址
使用list命令查看函数语句
jiffies = jiffies/0在main函数147行,故可设置断点
b 147
c
使用disas命令或x/6i $eip命令即可查看汇编指令,idiv指令地址为0x0000690e
2.查看当前指令位置和栈位置
运行到idiv指令位置(si,或设断点)
使用info register(info reg)命令即可查看寄存器保存值
2.查看新指令位置和栈位置、栈中保存的恢复点位置和用户栈位置
si执行idiv指令
使用info register(info reg)命令查看此时寄存器保存值
x/5wx $esp
查看栈顶保存内容,故栈中保存的恢复点位置为0xf:0x690e;用户栈位置为0x17:0x25760
补充知识:
1.当前指令位置和栈位置
CS:EIP 两个寄存器指示了 CPU 当前将要读取的指令的地址,其中 CS 为代码段寄存器,而 EIP 为指令指针寄存器 SS寄存器中存着栈顶的段地址,SP寄存器中存放着偏移地址,通过这两个寄存器中的值就可以判断栈顶的位置。
2.栈中中断现场的结构
(OLD SS:OLD ESP) 描述了用户栈顶的位置,(OLD CS:OLD EIP) 描述了恢复点的位置
注意:x86 中栈是从高地址向低地址方向增长的,这里的栈顶位置是 0x1fa2c,但查看仍要从高地址向低地址查看!故SS:ESP值为0xf:0x690e 而非反过来
执行idiv指令后,栈中保存的恢复点与栈顶位置为执行idiv指令前当前指令位置与栈顶位置
第2关:int指令分析
本关任务:
解题过程:
1.int 0x81执行之前当前指令位置和栈位置
首先找到task1函数入口
在task1处设置断点
再通过查看汇编指令找到第一处int 0x81指令位置
使用disas命令后,使用si命令到达int 0x81执行之前
使用info reg命令查看当前指令位置和栈位置
2.int 0x81执行之后当前指令位置和栈位置
si命令执行int 0x81,再使用info reg查看
3.查看栈中保存的恢复点位置和用户栈位置
同第一关