目录
这一关可以在第1关的环境基础上进行,如果重置了环境那么只需要重新将1内核文件解压到linux-0.11-lab文件夹即可,详见第1关文章。
任务描述
分析版本1内核,找到第一次时钟中断的恢复点地址。
相关知识
为了完成本关任务,你需要掌握: 1.用 gdb 调试内核; 2.跟踪分析时钟中断; 3.中断/异常的恢复点分析。
准备阶段
本关卡的分析对象是版本1内核,可以基于前一关卡环境进行后续实验,如果重置实验环境则需要重新将版本1内核设置为分析对象,详见第一关的相关知识。
实验开始
操作细节详解
第一步,启动两个终端,均把目录切换到~/os/linux-0.11-lab,第一个终端(无所谓顺序)使用./rungdb命令运行脚本,第二个终端使用./mygdb命令以启动 gdb 并读入符号信息,跟踪到 main 函数入口。如下所示:
随后的操作都是在运行./mygdb命令的终端进行,我之后称其为第二终端。
第二步,先在do_timer函数处设置断点,方法和第一关一样,详细操作如下所示,输入c继续跟踪,再使用p jiffies命令查看断点1是否出现,再使用bt命令从函数 do_timer 跟踪到恢复点,在执行finish命令返回到timer_interrupt 函数。
第三步,使用disas命令进行反汇编,再使用两次si命令,最后再进行一次disas反汇编.
第四步,输入b *0x77dd,再输入c继续,然后进行两次disas命令,理论来说最后一次箭头所指的应该就是第一次时钟中断的恢复点的地址,但这里头歌出bug了还是怎么着并不符合,实际答案是0x796c。
最后将答案0x796c输入到workspace/mushixun/恢复点的地址.txt中的括号里即可,随后使用kill命令防止对第三关的环境造成影响。
测试结果
操作汇总
————在上一关的环境基础上————
————终端1————
cd os/linux-0.11-lab
./rungdb
————终端2————
cd os/linux-0.11-lab
./mygdb
b do_timer
c
bt
finish
disas
si
si
disas
b *0x77dd
c
disas
disas
kill
y
将答案 0x796c 输入到 workspace/mushixun/恢复点的地址.txt 中的括号里即可.