计算机操作系统实验_解析ELF文件

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

-1-西北工业大学操作系统实验实验报告一、实验目的熟悉可执行链接文件(ELF)的结构,了解GeekOS将ELF格式的可执行程序加载到内存,建立内核线程并运行的实现技术。二、实验要求1.修改Project1项目中的/GeekOS/elf.c文件:在函数Parse_ELF_Executable()中添加代码,分析ELF格式的可执行文件(包括分析得出ELF文件头、程序头),获取可执行文件长度、代码段、数据段等信息,并打印输出。并且,填充Exe_Format数据结构中的值域。2.掌握GeekOS在核心态运行可执行程序的原理,绘制出可执行程序在内核中加载、运行的流程图(需反映关键函数的调用关系)。3.回答实验讲义P125页的思考题。三、实验过程及结果1、修改Project1项目中的/GeekOS/elf.c文件:在函数Parse_ELF_Executable()中添加代码,分析ELF格式的可执行文件(包括分析得出ELF文件头、程序头),获取可执行文件长度、代码段、数据段等信息,并打印输出。并且,填充Exe_Format数据结构中的值域。答:修改Project1项目中的/GeekOS/elf.c文件:在函数Parse_ELF_Executable()中添加代码,如下:==============elf.c===================intParse_ELF_Executable(char*exeFileData,ulong_texeFileLength,structExe_Format*exeFormat){inti;elfHeader*head=(elfHeader*)exeFileData;programHeader*proHeader=(programHeader*)(exeFileData+head-phoff);KASSERT(exeFileData!=NULL);KASSERT(exeFileLengthhead-ehsize+head-phentsize*head-phnum);KASSERT(head-entry%4==0);exeFormat-numSegments=head-phnum;-2-exeFormat-entryAddr=head-entry;for(i=0;ihead-phnum;i++){exeFormat-segmentList[i].offsetInFile=proHeader-offset;exeFormat-segmentList[i].lengthInFile=proHeader-fileSize;exeFormat-segmentList[i].startAddress=proHeader-vaddr;exeFormat-segmentList[i].sizeInMemory=proHeader-memSize;exeFormat-segmentList[i].protFlags=proHeader-flags;proHeader++;}return0;}==============elf.c===================运行结果如图:2、掌握GeekOS在核心态运行可执行程序的原理,绘制出可执行程序在内核中加载、运行的流程图(需反映关键函数的调用关系)。答:ELF(Executableandlinkingformat)文件是UNIX系统实验室作为应用程序二进制接口而开发的可执行文件,是x86Linux系统下的一种常用目标文件(objectfile)格式。ELF文件格式如下表:ELF文件在磁盘中的映象和在内存中的执行程序镜像的对应关系如下图:表1ELF目标文件格式-3-连接程序视图执行程序视图ELF头部ELF头部程序头部表(可选)程序头部表节区1段1...节区n段2.........节区头部表节区头部表(可选)ELF文件在磁盘中的映象和在内存中的执行程序镜像的对应关系如下图:ELFheaderCodeDatasectionheaderCodesectionheaderDataCodeoffsetDataoffsetDatasizeCodesizeCodeDataStack(4096)ELF文件镜像内存中执行镜像图1ELF文件和内存中的可执行文件镜像流程图如下:-4-四、实验分析思考题:输出个字符串为什么要如此大费周章?在a.exe中直接调用Print函数是否可行?答:不可行,直接打印Print(s1)则找不到字符串s1的正确位置,字符串变量名即代表地址信息,程序被加载进入内存时有了基址,需要通过基址加偏移量来找到字符串在内存中的正确位置,所以要调用ELF_Print函数。五、所遇问题及解决方法答:实验中遇到的问题首先就是代码难以阅读理解,对汇编陌生是一个主要的问题,其次就是代码之间的关联较多,层次较多,代码量也比较大,导致在阅读源码的过程中造成了很大的困难。最后在老师和同学们的帮助下,勉强理解了代码的基本结构以及实现的功能。通过此次实验,我由原来对操作系统只有一个粗浅的概念的认识的水平上升到对操作系统有比较深刻印象和理解的程度。不仅概念得到了进一步的理解,更对geekos在核心态下运行用户程序的原理有了更进一步的理解。

1 / 4
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功