- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
嵌入式系统程序调用关系分析设计方法
嵌入式系统程序调用关系分析设计方法
庄克良(青岛 266109)
本文主要对嵌入式系统中单线程应用程序的动态执行情况进行研究探讨,以EFI Shell下为例提出了程序动态执行过程中对函数调用深度和执行时间提取的具体实现方法, 为开发人直观清晰地了解整个程序的结构和动态执行情况提供了便利。
关键词:函数调用深度 执行时间 动态执行
The function calling relationship analysis in embedded system
This paper mainly discusses the dynamic calling relationship about single thread applications in embedded systems. We take EFI shell as an example to implement function calling depth and the execution time extraction work, which will help developer to learn the program structure and the running performance more clearly.
Keywords: Function calling relationship, executing time, dynamic executing
在嵌入式系统开发中,硬件资源通常由于功耗、体积、环境等原因的限制,在这个时候程序的性能分析就显得非常的重要,清晰的函数调用关系以及各函数的具体执行时间,对于开发者是十分有帮助的。
该设计方案在不改变待分析程序源代码的情况下,充分利用了编译器的编译选项,简化了插入代码的操作复杂度;然后,根据函数传参的规律进行函数入口地址的逆向追踪,同时结合编译中间文件,成功完成了动态执行数据的函数名称分析工作;最后,在开源工具Graphviz的帮助下完成了树状图的生成工作。
一、性能分析功能设计和实现原理
通过对程序的动态执行情况进行分析,获取整个程序的函数调用层次关系以及执行时间情况。传统的方法是通过手动在函数的进入处和退出处插入唯一的标记符号来实现的。这样不仅过程繁琐,而且非常容易出错。
本设计充分利用Microsoft Visual C++ Complier的编译选项/Gh和/GH,通过这两个附加钩子函数的编译选项可以方便的把自定义的_penter和_pexit函数插入到每个函数的头部和尾部。在UEFI的开发框架EDKII中,通过修改编译工具链的局部配置文件,成功地解决编译选项的问题。
为了捕获并显示函数动态执行的调用关系图,利用了四个主要的元素:MS Visual C++ 编译工具链、编译中间文件、自行设计的中间处理转化代码和一款开源工具Graphviz。Microsoft Visual C++ Complier编译工具链主要是在程序预处理阶段在函数首尾处插入自定义的钩子函数;然后,对编译中间文件进行分析,由程序的相对地址得到对应的函数名称;接着,通过自行设计的中间转化程序将获得的动态执行情况和函数名称进行映射,对临时数据进行精简处理,输出符合DOT语法规范的输入文件;最后Graphviz软件做的就是将输入文件,转化为直观的树状结构图。具体如图1所示:
图1 性能分析模块处理流程图
二、性能分析功能详细设计
1. 添加编译选项
基于Microsoft Visual C++ Complier支持钩子函数编译选项的先决条件。通过/Gh和/GH这两个编译选项能够把自定义的_penter和_pexit函数插入到每个函数的头部和尾部。
2. 获取父函数地址
针对IA-32架构函数调用过程中通过堆栈传参的特点,对切换时堆栈的内容变化情况进行分析。在父函数按照cdecl约定调用子函数的时候,参数首先由右向左压入堆栈,函数本身不清理堆栈,调用者负责清理堆栈。由于参数按照从右向左顺序压栈,最开始的参数在最接近栈顶的位置。当采用不定数个数参数时,第一个参数在栈中的位置肯定能知道,只要不定的参数个数能够根据第一个明确的参数确定下来,就可以使用不定参数。对应关系情况如图2所示。
图2 IA-32处理器架构堆栈切换对应关系图
3.获取动态执行数据。
保存动态数据的思想是,在插入函数的入口处将获取的父函数地址记录到文件中,同时压入堆栈;在函数退出时,对堆栈执行出栈操作,并将函数出栈地址记录到文件中。对于第一次插入和最后一次退出的特殊情况进行单独处理,避免程序出现异常情况。
根据这个设计思想,插入函数伪代码为:
_cdecl
_penter (VOID)
{
通过分析当前堆栈信息,获取父函数的入口地址,并将该地址存在stat
您可能关注的文档
最近下载
- L1基础自动化系统的铁区MES的实现.docx VIP
- 2025年山东普通高中学业水平等级考试生物真题及答案 - 副本 .pdf VIP
- PEMS相关模板(PEMS软件开发计划或开发生命周期&可编程医用电气系统(PEMS)检查文件清单).pdf VIP
- 旅游接待业 课件全套 第1--10章 旅游接待业导论---旅游接待业高质量发展.pptx
- 运维服务项目实施组织及管理措施.docx VIP
- 柔性器件材料与结构失效分析.pptx VIP
- IPC-9850中文版.doc
- 2025年四川自贡市中考英语试卷含答案.docx VIP
- 2019年国庆70周年阅兵装备解读报告.pptx
- 2024人教版PEP英语三年级上册全册教学设计教案含反思.pdf
文档评论(0)