课堂练习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 os/linux-0.11-lab
./run
如果正常虚拟机在加载完毕之后将会出现如下画面:
1.2 关闭bochs虚拟机,输入以下命令
cd os/linux-0.11-lab
./rungdb
1.3 打开另一个终端,输入以下命令
cd os/linux-0.11-lab/
./mygdb
设置断点
b do_timer
一直按到第一行被0覆盖
display jiffies
c
1.4 最终运行结果如上图所示,此时jiffies为36
1.5 退出gdb调试,保证下一关环境正常运行
kill
y
quit
第2关:第一次时钟中断
第2关 任务描述
分析版本1内核,找到第一次时钟中断的恢复点地址。
第2关 任务过程
2.1 在终端中输入以下命令
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
./rungdb
【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
c
c
c
c
c
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 字符串
此时虚拟机输出字符串为