实验实验记录.docVIP

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验实验记录

实验2 实验记录 作者:卓达城 zhuodc@ 第一步:理解下面这个函数 stab_binsearch(stabs, region_left, region_right, type, addr)函数 This function is a bi*ch!!! 背景: JOS的作者通过kerne.ld把调试信息和内核一起加载到内存中去。并提供了四个相应的宏以记录相关信息。 下图是kernel.ld中的代码片段: 当我们运行完虚拟机之后,调试信息和内核一起加载到0xf0000000(virtual address)中 从以下代码片段中,我们可以找到,调试信息是如何被赋值到stab的: 调试信息的结构是怎么样的呢? 我们可以轻松地在代码中发现下面的结构: 但是它到底放的是什么,这令人满头雾水。 我们可以从init.s中找到我们想要的答案。init.s通过命令: gcc -pipe -nostdinc -O2 -fno-builtin -I. -MD -Wall -Wno-format -DJOS_KERNEL -gstabs -c -S kern/init.c 生成。 观察以上代码片段: 我们把它放入stab结构中,我们可以知道: n_strx是函数名,n_type 是36 ,n_other是0,n_desc也是0,n_value是函数的段偏移(eip) 观察以上代码片段: 我们可以猜测: n_str为空, n_type为68, n_other为0, n_desc为行号(对一下源代码就知道了),n_value为函数内偏移量。(I just want to say f*ck!Waste my time for 3 hours!!!) 这就是type的类型,0x24是36,跟上面的代码片段对应。 有了以上背景知识,我们开始研究stab_binsearch函数 先说说这个函数的返回值和参数: 返回值: 函数成功找到代码区域就返回 0 否则返回 -1 region_left和region_right:根据type返回代码区域的起始地址。如果是函数,返回函数的起始地址和终点地址,如果是代码,返回代码的起始地址的终点地址(翻译成汇编之后)。如果是文件或者其它类型,同上。 参数: stabs 调试信息的起始地址 region_left:要搜索的区域的起始地址 region_right: 要搜索的区域的终点 type:要搜索的代码类型 addr :eip 这个函数用了二分搜索法进行搜索,具体实现请看代码,比较难讲清楚,我看也看了很久才明白其中奥妙。但是如果了解了上面的背景再看,就会事半功倍。这里的所有的stab已经跟我们的代码运行顺序是一致的。 看完代码之后我们就开始实现我们的Exercise 1,完成debuginfo_eip函数 首先: 在debuginfo_eip函数中,我看到这句代码 这句代码是判断函数名字有没有超界的。如果没有,就赋值。 这两句代码求出我们所要找的代码在具体函数中的偏移量。记着,我们前面说过,当type是代码的时候,n_value表示的是偏移量。第一行代码中的n_value表示addr所在的函数的代码区域的首地址,addr - info-eip_fn_addr就可以求出偏移量,下面就可以用stab_binsearch函数找到具体的行号。 以下是我们要添加的代码: 按照要求,我们还要找出函数的参数个数: 所再添加如下代码,我们已经知道了stab的结构方式(stab的顺序和我们的代码顺序一样),所以以下代码及可以找出参数的个数。 然后,在monitor.c中加入如下代码就完成了第一个Exercise ^^^^^^^^^^^^^^^^^^^^^^zhuodc@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 写到这里,我确实不想再写了,但是作为一个软件工程的学生,我深深体会到文档的重要性,所以再写。 在开始做下面的实验之前,我们想要了解一下JOS的内存结构。 先从最基本的boot.S开始 在boot.S中,gdt如下 0x00 0x08 0x10 然后系统跳转到main.c,由于段选择符为0x08,所以基地址为0x0000000 JOS把第一个扇区加载到0x10000处(elf),然后根据elf的参数把内核部分加载到0x1000000处,现在观察kernel.ld,里面定义了开始地址为0x所以entry.S里面的代码的eip都是0xF0100000++,然后bootmain的最后一句跳转到0x10000c处,开始执行entry.S的代码. entr

文档评论(0)

panguoxiang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档