【个人闯关过程总结如下,简约版,仅供参考。】
第1关:时钟中断的发生
任务描述
本关任务:通过实际操作回答在输出第一行 0/1 字符的过程中(如下图所示),共发生了几次时钟中断?
相关知识
为了完成本关任务,你需要掌握:
1.设置版本 1 内核为分析对象;
2.开始用 gdb 调试内核;
3.跟踪分析时钟中断。
设置版本1内核为分析对象
首先解压版本1内核源码。使用cp
命令将/data/workspace/myshixun/exp1
中的1.tgz
复制到~/os/
目录下;
切换到~/os/linux-0.11-lab
目录下,将1.tgz
解压到当前目录下;
然后调整cur的指向。先使用rm -rf cur
将cur
删除,再使用ln
命令创建符号链接。
现在可以编译和测试版本 1 内核。首先进入1/linux
目录下编译内核;
然后回到目录~/os/linux-0.11-lab
,并使用./run
启动虚拟机检测内核是否正常;
如果正常虚拟机在加载完毕之后将会出现全是0的画面(需要等待一会才显示)。
开始使用 gdb 调试内核
先关闭bochs虚拟机,然后打开两个终端,其中一个终端在linux-0.11-lab
目录下运行rungdb
脚本,以启动 bochs 虚拟机并等待 gdb 连接;
在另一个终端里切换到目录~/os/linux-0.11-lab/
,然后启动脚本./mygdb
,这个命令会启动 gdb 并读入内核符号信息,同时会通过执行0.gdb
中的调试命令来连接到 bochs 虚拟机,并进而跟踪到 main 函数入口。
跟踪分析时钟中断
等待 gdb 完全启动之后可以在函数 do_timer(由时钟中断的处理函数 timer_interrupt 调用)处设置断点;
让程序继续运行(使用命令 c ),分析在输出第一行 0/1 字符的过程中断点 do_timer 出现的次数,此即为时钟中断的次数。
通过全局变量jiffies
可以直接查看已发生的时钟中断的次数。
例如,当第 2 个时钟中断发生时系统状态如下所示:
作答要求
根据相关知识进行实际操作,一直输入 c 直到 0/1 将第一行完全填满。
回答问题:当第一行 0/1 字符全部输出完毕的时候一共发生了几次时钟中断,即第一行完全填满时 jiffies 记录的已发生次数为多少?
全过程:
ls /data/workspace/myshixun/exp1/
cp /data/workspace/myshixun/exp1/1.tgz ~/os/
ls os/
cd ~/os/linux-0.11-lab
pwd
tar -zxvf ../1.tgz 1
rm -rf cur
ln -s 1 cur
ls
ll
cd 1/linux
make
ls
cd ../..
./run
可继续在以上的命令行窗口输入:
./rungdb
启动gdb之后再打开新的命令行窗口:
cd ~/os/linux-0.11-lab
./mygdb
b do_timer
c
display jiffies
c
c
c
c
c
c
c
c
c
... #输入很多个c,使第一行完全被填满
quit
y
以上就可以测评了~
第2关:第一次时钟中断
编程要求
根据相关知识分析第一次时钟中断的恢复点的地址是多少,并将答案填写在/data/workspace/myshixun/恢复点指令地址.txt
中。
答案:第一次时钟中断的恢复点的地址是 0x796c
直接打开桌面的workspace,下一步打开myshixun,打开恢复点指令地址.txt填入即可。
过程和第一关差不多,只是中断不一致,可能须打开工具栏->重置实训。
全过程:
ls /data/workspace/myshixun/exp1/
cp /data/workspace/myshixun/exp1/1.tgz ~/os/
ls os/
cd ~/os/linux-0.11-lab
pwd
tar -zxvf ../1.tgz 1
rm -rf cur
ln -s 1 cur
ls
ll
cd 1/linux
make
ls
cd ../..
./run
./rungdb
打开另一个命令行窗口:
cd ~/os/linux-0.11-lab
./mygdb #启动gdb
b do_timer
c
p jiffies
bt
finish
disas
si
si
disas
b * 0x77dd
c
disas
si
disas
kill
y
quit
y
完成以上即可测评~
第3关:第六次时钟中断
编程要求
根据相关知识,完成断点指令和恢复点指令的分析,回答问题:
1.断点指令和恢复点指令的地址是多少?
2.此时 bochs 虚拟机输出的 0/1 字符串是什么?(只填写数字,不填写空格!!!)
将答案填写在/data/workspace/myshixun/第三关.txt
中。
答案:1. 0x7982 2. 0100
过程和第一、二关差不多,只是中断不一致,可能须打开工具栏->重置实训。
全过程:
ls /data/workspace/myshixun/exp1/
cp /data/workspace/myshixun/exp1/1.tgz ~/os/
ls os/
cd ~/os/linux-0.11-lab
pwd
tar -zxvf ../1.tgz 1
rm -rf cur
ln -s 1 cur
ls
ll
cd 1/linux
make
ls
cd ../..
./run
./rungdb
打开另一个命令行窗口:
cd ~/os/linux-0.11-lab
./mygdb #启动gdb
b do_timer
c
p jiffies
c
c
c
c
c #包括第一个c,总共是6个c噢!
bt
finish
disas
si
si
disas
b * 0x77dd
c
disas
si
disas
info reg
quit
y
完成以上第三关就可以测评啦~