第1关:除零异常分析
任务描述
分析版本 1.1 内核,回答下列问题:
1.在函数 main 的语句jiffies = jiffies/0;所对应的汇编指令片段中,有一个 idiv 指令,此指令的地址是多少?
2.在该 idiv 指令执行之前,当前指令位置(CS:EIP)和栈位置(SS:ESP)分别是多少?
3.使用 si 命令执行了该指令后,新指令位置和栈位置分别是多少?此时栈中保存的恢复点位置和用户栈位置分别是多少?
相关知识
为了完成本关任务,你需要掌握:
1.如何设置某版本的内核为分析对象;
2.如何开始用 gdb 调试内核;
3.查看 C 语句编译之后对应的汇编指令片段;
4.分析响应中断/异常时,CPU 做了哪些工作;
5.查看当前寄存器的状态;
6.查看当前栈顶的状态。
环境准备:
和第二关的环境准备相似,可参考第二关的环境准备,我懒!!!!
gdb调试过程
(gdb) b main.c:147
Breakpoint 2 at 0x6903: file init/main.c, line 147.
(gdb) c
Continuing.
Breakpoint 2, main () at init/main.c:147
147 jiffies = jiffies/0;
1: current->pid = 0
(gdb) x/6i $eip
=> 0x6903 <main+348>: mov 0x227e0,%eax
0x6908 <main+353>: mov $0x0,%ecx
0x690d <main+358>: cltd
0x690e <main+359>: idiv %ecx
0x6910 <main+361>: mov %eax,0x227e0
0x6915 <main+366>: mov $0x2,%eax
(gdb) b *0x690e
Breakpoint 3 at 0x690e: file init/main.c, line 147.
(gdb) c
Contin