课堂练习2.1:外部中断
第1关:时钟中断的发生
第1关 任务描述
本关任务:通过实际操作回答在输出第一行 0/1 字符的过程中(如下图所示),共发生了几次时钟中断?
第1关 任务过程
1.1 打开终端,输入以下命令
cp /data/workspace/myshixun/exp1/1.tgz ~/os/
cd os/linux-0.11-lab
tar -zxvf ../1.tgz
rm -rf cur
ln -s 1 cur
cd 1/linux/
make
cd ../..
./run
如果正常虚拟机在加载完毕之后将会出现如下画面:
1.2 关闭bochs虚拟机,输入以下命令
./rungdb
1.3 打开另一个终端,输入以下命令
cd os/linux-0.11-lab/
./mygdb
b do_timer
//设置断点
display jiffies
c+回车
//一直按到第一行被0覆盖
1.4 最终运行结果如上图所示,此时jiffies为36
最后在gdb终端输入以下命令,保证下一关环境
kill
y
第2关:第一次时钟中断
第2关 任务描述
分析版本1内核,找到第一次时钟中断的恢复点地址。
第2关 任务过程
2.1 在终端中输入以下命令
quit
//退出gdb,保留第一关的环境
./rungdb
( !!!若提示错误!!!
请确保已经切换到目录~/os/linux-0.11-lab //cd os/linux-0.11-lab
再重复上述第二条命令 //./rungdb)
2.2 打开另一个终端,输入以下命令
cd os/linux-0.11-lab
./mygdb
b do_timer
c
p jiffies
bt
finish
disas
si
si
disas
b *0x77dd
c
si
disas
找到箭头对应的地址:
0x0000769c(0x796c)
2.3 打开桌面文件夹workspace,找到目标文件【恢复指令地址.txt】并打开,将地址输入括号,保存即可完成
最后在gdb终端输入以下命令,保证下一关环境
kill
y
第3关:第六次时钟中断
第3关 任务描述
本关任务:通过相关知识以及实验回答:版本 1 内核的第 6 次时钟中断发生时,断点和恢复点(指令地址)分别是多少?此时 bochs 虚拟机输出的 0/1 字符串是什么?(忽略空格)
第3关 任务过程
3.1 在终端中输入以下命令
quit
//退出gdb,保留第二关的环境
./rungdb
( !!!若提示错误!!!
请确保已经切换到目录~/os/linux-0.11-lab //cd os/linux-0.11-lab
再重复上述第二条命令 //./rungdb)
3.2 打开另一个终端,输入以下命令
cd os/linux-0.11-lab
./mygdb
b do_timer
c+回车(总共6次)
p jiffies
bt
finish
disas
si
si
disas
b *0x77dd
c
si
disas
找到箭头对应的地址:
恢复点位置为 0x00007982(0x7982)
,且该条指令为loop。
查看ecx寄存器,可知仍在循环中,其断点指令仍为loop指令,故断点地址和恢复点地址均为
0x7982
说明
对于外部中断而言,恢复点指令是断点指令的后一条。需要说明的是,loop 指令的功能是先将 ecx 寄存器减一,然后检查其值,如果其值非 0 ,则继续循环,否则中止循环,执行下一条指令。其功能是:在地址0x796c处循环,每次 ecx 寄存器都减一,直到其值为 0 。因此,loop 指令的上一条有可能是它自己。
3.3 bochs 虚拟机输出的 0/1 字符串
此时虚拟机输出字符串为