- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
- 存在和唯性定理.doc
- 存取Oracle当中扫描数据的方法.doc
- 存在性和任意性在函数中的解题策略.doc
- 婚纱设计课件.doc
- 孙鹏-上数学教材解读.doc
- 孙雅秋田忌赛马教学设计.doc
- 存储-企业Hyper-v群集部署实验方案.doc
- 孙少府调查报告市场营销班.doc
- 孙端邵天洪纵观近我市学业考试数学试卷谈初复习对策.doc
- 学上学期期末考试高语文科试卷.doc
- 2025年网络文学平台版权运营模式创新与版权保护体系构建.docx
- 数字藏品市场运营策略洞察:2025年市场风险与应对策略分析.docx
- 全球新能源汽车产业政策法规与市场前景白皮书.docx
- 工业互联网平台安全标准制定:安全防护与合规性监管策略.docx
- 剧本杀剧本创作审核标准2025年优化与行业自律.docx
- 2025年新能源电动巡逻车在城市安防中的应用对城市环境的影响分析.docx
- 全渠道零售案例精选:2025年行业创新实践报告.docx
- 2025年网约车司乘纠纷处理机制优化与行业可持续发展报告.docx
- 2025年宠物烘焙食品市场法规政策解读:合规经营与风险规避.docx
- 2025年宠物行业数据安全监管政策影响分析报告.docx
文档评论(0)