课堂练习2.2:中断/异常的处理过程
第1关:除零异常分析
第1关 任务描述
分析版本 1.1 内核,回答下列问题:
1.在函数 main 的语句jiffies = jiffies/0
;所对应的汇编指令片段中,有一个 idiv 指令,此指令的地址是多少?
2.在该 idiv 指令执行之前,当前指令位置(CS:EIP)和栈位置(SS:ESP)分别是多少?
3.使用 si 命令执行了该指令后,新指令位置和栈位置分别是多少?此时栈中保存的恢复点位置和用户栈位置分别是多少?
第1关 任务过程
1.1 打开终端,输入以下命令
cp /data/workspace/myshixun/exp1/1.1.tgz ~/os
cd ~/os/linux-0.11-lab
tar -zxvf ../1.1.tgz 1.1
rm -rf cur
ln -s 1.1 cur
cd 1.1/linux
make
1.2 打开另一个终端,输入以下命令
cd ~/os/linux-0.11-lab
./rungdb
1.3 在第一个终端继续输入
cd ../..
./mygdb
1.4 gdb调试输入
b main.c:147
c
x/6i $eip
si
si
si
info registers
si
info registers
1.5 退出gdb调试,保证下一关环境正常运行
kill
y
quit
第2关:int指令分析
第2关 任务描述
分析版本1内核,回答下列问题:
1.函数 task1 的第一个int 0x81指令执行之前,当前指令位置(CS:EIP)和栈位置(SS:ESP)分别是多少?
2.使用 si 命令执行了该指令后,新指令位置和栈位置分别是多少?此时栈中保存的恢复点位置和用户栈位置分别是多少?
第2关 任务过程
2.1 在第一个终端输入
cp /data/workspace/myshixun/exp2/1.tgz ~/os
cd ~/os/linux-0.11-lab
tar -zxvf ../1.tgz 1
rm -rf cur
ln -s 1 cur
cd 1/linux
make
2.2 在第二个终端输入
cd ~/os/linux-0.11-lab
./rungdb
2.3 在第一个终端继续输入
cd ~/os/linux-0.11-lab
./mygdb
2.4 gdb调试输入
b task1
c
x/5i $eip
si
x/5i $eip
info registers
si
info registers
x/5wx $esp
2.5 退出gdb调试,保证下一关环境正常运行
kill
y
quit
第3关:
第3关 任务描述
本关任务回答问题:
1.函数 task1 的第一个int 0x81指令执行时,会转到对应的中断/异常处理程序去运行,请问在该处理程序的 iret 指令执行之前,指令位置(CS:EIP)和栈位置(SS:ESP)分别是多少?此时栈中保存的恢复点位置和用户栈位置分别是多少?
2.使用 si 命令执行了该 iret 指令后,新指令位置和栈位置分别是多少?
第3关 任务过程
3.1 在第二个终端输入
cd ~/os/linux-0.11-lab
./rungdb
3.2 在第一个终端输入
cd ~/os/linux-0.11-lab
./mygdb
3.3 gdb调试输入
b task1
c
x/5i $eip
si
x/5i $eip
info registers
si
bt
disas
b *0x795e
c
x/5i $eip
info registers
x/5wx $esp
si
info registers
3.4 退出gdb调试
kill
y
quit