课堂练习2.1:外部中断

【个人闯关过程总结如下,简约版,仅供参考。】

第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 curcur删除,再使用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

完成以上第三关就可以测评啦~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值