草庐IT

OS实验2-1 课堂练习2.1 外部中断

蔷薇与赤喵 2023-04-27 原文

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中改为此命令

补充知识:

  1. tar解压命令

    -x 从档案文件中释放文件。
    -v 详细报告tar处理的文件信息。如无此选项,tar不报告文件信息。
    -z 用gzip来压缩/解压缩文件,加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩。
    -f 使用档案文件或设备,这个选项通常是必选的。

  2. make编译命令

    make clean用来清除上次编译后生成文件,这里使用是为了保险;make用来编译

  3. 设置断点

    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

补充知识:

  1. bt命令

    显示程序的调用栈信息

  2. si/ni命令

    si:“单步步入”(step into),遇到函数调用,进入函数内部
    ni:遇到函数调用直接跳过,不进入函数体内部

  3. disas命令

    全名为disassemble命令,有三种用法:
    不带参数:默认的反汇编范围是所选择地址附近的汇编代码
    单个参数:当然也可以是函数名,因为函数名也是一个 地址
    两个参数:就是内存地址范围

  4. finish命令

    执行函数到正常退出该函数

第3关:第六次时钟中断

本关任务:

解题过程:

1.版本1调试内核准备

同第一关

2.调试过程

设置断点后,运行到第六次时钟中断

可使用command命令,便于查看时钟中断次数

此时虚拟机输出字符串为0100

查看恢复点位置,同第二关

恢复点位置为0x7982,且该条指令为loop

查看ecx寄存器,可知仍在循环中,其断点指令仍为loop指令

故断点恢复点地址均为0x7982

有关OS实验2-1 课堂练习2.1 外部中断的更多相关文章

  1. ruby-on-rails - 正确的 Rails 2.1 做事方式 - 2

    question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参

  2. ruby-on-rails - 如何在 mac os snow leopard 中升级 ruby​​ 和 rails - 2

    我想将我的MacSnowLeopardruby​​从1.8.7升级到1.9.1版本,有人知道轻松且最好的升级方法吗?因为我读了一些论坛/帖子/博客/讨论说覆盖苹果发布的ruby不好将Rails从版本2.2.2升级到2.3.8的最佳方法是什么?因为我找到的所有信息都仅适用于豹/老虎,而且很少有关于雪豹的复杂文章。他们还说覆盖apple提供的rails不好吗。谁能帮帮我?谢谢。 最佳答案 DanBenjamin有一些greatinstructionsforcompilingandinstallingRuby,RubyGemsandRai

  3. 牛客网专项练习30天Pytnon篇第02天 - 2

    1.在Python3中,下列关于数学运算结果正确的是:(B)a=10b=3print(a//b)print(a%b)print(a/b)A.3,3,3.3333...B.3,1,3.3333...C.3.3333...,3.3333...,3D.3.3333...,1,3.3333...解析:    在Python中,//表示地板除(向下取整),%表示取余,/表示除(Python2向下取整返回3)2.如下程序Python2会打印多少个数:(D)k=1000whilek>1:    print(k)k=k/2A.1000 B.10C.11D.9解析:    按照题意每次循环K/2,直到K值小于等

  4. ruby - ruby 乘法语句中星号中断语法前的空格 - 2

    在添加一些空格以使代码更具可读性时(与上面的代码对齐),我遇到了这个:classCdefx42endendm=C.new现在这将给出“错误数量的参数”:m.x*m.x这将给出“语法错误,意外的tSTAR,期待$end”:2/m.x*m.x这里的解析器到底发生了什么?我使用Ruby1.9.2和2.1.5进行了测试。 最佳答案 *用于运算符(42*42)和参数解包(myfun*[42,42])。当你这样做时:m.x*m.x2/m.x*m.xRuby将此解释为参数解包,而不是*运算符(即乘法)。如果您不熟悉它,参数解包(有时也称为“spl

  5. ruby - 从外部访问类的实例变量 - 2

    我理解(我认为)Ruby中类变量和类的实例变量之间的区别。我想知道如何从该类外部访问该类的实例变量。从内部(即在类方法中而不是实例方法中),它可以直接访问,但是从外部,有没有办法做MyClass.class.[@$#]variablename?我没有任何具体原因要这样做,只是学习Ruby并想知道是否可行。 最佳答案 classMyClass@my_class_instance_var="foo"class上述yield:>>foo我相信Arkku演示了如何从类外部访问类变量(@@),而不是类实例变量(@)。我从这篇文章中提取了上述内

  6. ruby - 在 ASP 页面上 Mechanize 中断 - 2

    require'mechanize'agent=Mechanize.newlogin=agent.get('http://www.schoolnet.ch/DE/HomeDE.htm')agent.clicklogin.link_withtext:/Login/然后我得到Mechanize::UnsupportedSchemeError。 最佳答案 Mechanize不支持javascript但您可以将搜索字段添加到表单并为其分配搜索词并使用mechanize提交表单form=page.forms.firstform.add_fie

  7. ruby - 可以正常中断的来自 Rake 的长时间运行的 shell 命令? - 2

    在几个项目中,我希望有一个类似rakeserver的rake任务,它将通过任何需要的方式开始为该应用程序提供服务。这是一个示例:task:serverdo%x{bundleexecrackup-p1234}end这行得通,但是当我准备停止它时,按Ctrl+c并没有正常关闭;它中断了Rake任务本身,它说rakeaborted!并给出堆栈跟踪。在某些情况下,我必须执行Ctrl+c两次。我可能可以用Signal.trap写一些东西来更优雅地中断它。有没有更简单的方法? 最佳答案 trap('SIGINT'){puts"Yourmessa

  8. ruby-on-rails - OS X Mavericks 破坏了 rbenv? - 2

    最近,我安装了OSXMavericks,它似乎弄乱了我的开发环境。我在运行“railsnewfirst_app”后收到此消息:Youruseraccountisn'tallowedtoinstalltothesystemRubygems.Youcancancelthisinstallationandrun:bundleinstall--pathvendor/bundletoinstallthegemsinto./vendor/bundle/,oryoucanenteryourpasswordandinstallthebundledgemstoRubygemsusingsudo.Pass

  9. ruby-on-rails - prawnto 显示新页面时不会中断的表格 - 2

    我有可变数量的表格和可变数量的行,我想让它们一个接一个地显示,但如果表格不适合当前页面,请将其放在下一页,然后继续。我已将表格放入事务中,以便我可以回滚然后打印它(如果高度适合当前页面),但我如何获得表格高度?我现在有这段代码pdf.transactiondopdf.table@data,:font_size=>12,:border_style=>:grid,:horizontal_padding=>10,:vertical_padding=>3,:border_width=>2,:position=>:left,:row_colors=>["FFFFFF","DDDDDD"]pdf.

  10. ruby-on-rails - 无法在 OS X Mavericks 中安装 gem 'therubyracer' - 2

    我是mac的新手,尝试bundleinstall一个克隆的railsrepo。我在安装libv8gem时遇到错误,google并找到了解决方案并做了brewinstalllibv8geminstalllibv8----with-system-v8接下来我中了thyreracergem,完整trace如下Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./Users/anand/.rvm/rubies/

随机推荐