OS实验2-1 课堂练习2.1 外部中断
第1关:时钟中断的发生
本关任务:
解题过程:
1.版本1调试内核准备
打开1.tgz内核文件所在位置,复制到os/linux-0.11-lab文件夹中(也可以在命令行中使用cp命令复制,不过这样比较方便)
cd os/linux-0.11-lab
tar xvzf 1.tgz
打开命令行输入以上命令。第一句命令是打开1.tgz文件所在位置,第二句命令是对1.tgz进行解压。
调整linux内核cur指向
进入1/linux文件夹对其进行编译
cd ../..
回到主文件夹准备进行调试
2.调试过程
./rungdb
输入命令启动bochs虚拟机
打开另一个命令行窗口,cd进入主文件夹
./mygdb
输入命令开始gdb调试
函数do_timer是时钟中断的处理函数,故在函数do_timer处设置断点。
全局变量jiffies存放程序运行至此时钟中断次数,可通过p jiffies命令查看。
在刚刚设置的断点处输入command命令,实现自动查看。
不断键入c(或者回车),直到虚拟机首行被字符填满
此时jiffies为36
补充:此关通过检测条件是查看
display jiffies
无此命令结果不能通过,故可在jiffies出现36后输入以上命令再查看一边,或者直接讲command中改为此命令
补充知识:
- tar解压命令-x 从档案文件中释放文件。 -v 详细报告tar处理的文件信息。如无此选项,tar不报告文件信息。 -z 用gzip来压缩/解压缩文件,加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩。 -f 使用档案文件或设备,这个选项通常是必选的。
- make编译命令make clean用来清除上次编译后生成文件,这里使用是为了保险;make用来编译
- 设置断点b设置断点 info b 查看断点 command 1 在1号断点处设置命令
第2关:第一次时钟中断
本关任务:
解题过程:
1.版本1调试内核准备
同第一关
2.调试过程
./rungdb
输入命令启动bochs虚拟机
打开另一个命令行窗口,cd进入主文件夹
./mygdb
输入命令开始gdb调试
要查看第一次时钟中断恢复点,首先要跟随第一次时钟中断执行完毕
函数do_timer是时钟中断的处理函数,故在函数do_timer处设置断点。
输入bt命令查看栈帧信息,了解到timer_interrupt函数调用了do_timer,故do_timer函数执行完毕后将返回timer_interrupt函数继续执行,timer_interrupt即为时钟中断处理函数。
finish命令执行完毕do_timer,进入timer_interrupt
使用disas命令查看汇编指令,输入si继续执行下一条,直到进入<ret_from_sys_call>
再次使用disas查看,可知函数末尾返回指令iret地址,设置新断点执行至此
可知恢复点地址为0x796c
补充知识:
- bt命令显示程序的调用栈信息
- si/ni命令si:“单步步入”(
step into
),遇到函数调用,进入函数内部 ni:遇到函数调用直接跳过,不进入函数体内部 - disas命令全名为disassemble命令,有三种用法: 不带参数:默认的反汇编范围是所选择地址附近的汇编代码 单个参数:当然也可以是函数名,因为函数名也是一个 地址 两个参数:就是内存地址范围
- finish命令执行函数到正常退出该函数
第3关:第六次时钟中断
本关任务:
解题过程:
1.版本1调试内核准备
同第一关
2.调试过程
设置断点后,运行到第六次时钟中断
可使用command命令,便于查看时钟中断次数
此时虚拟机输出字符串为0100
查看恢复点位置,同第二关
恢复点位置为0x7982,且该条指令为loop
查看ecx寄存器,可知仍在循环中,其断点指令仍为loop指令
故断点恢复点地址均为0x7982
版权归原作者 蔷薇与赤喵 所有, 如有侵权,请联系我们删除。