网站大量收购独家精品文档,联系QQ:2885784924

《pintosproject2无法加载正确运行用户程序.docxVIP

《pintosproject2无法加载正确运行用户程序.docx

  1. 1、本文档共12页,可阅读全部内容。
  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文档。上传文档
查看更多
《pintosproject2无法加载正确运行用户程序

我的系统版本Ubuntu 12.04 AMD64的gcc 4.6.3的。装了pintos 和bochs pintos project1 已经通过。27个test已经通过现在的问题:进入project2 后出现了用户文件加载失败。照网上的一个改法,改了后又出现page fault at c0000008.下面先看一下是怎么遇到问题的。我是照那个英文的官方文档做的:编译example里的文件,这是我们用的用户文件。wyg@wyg-pc:~$ cd OSstep/pintos8/src/examples/wyg@wyg-pc:~/OSstep/pintos8/src/examples$ make完成后如下:我们要用的是里的echo可执行文件进入src/userprog 文件夹然后make 编译好后在当前目录下出现了build 文件夹进入build文件夹: cd build制作大小为2M的虚拟硬盘:pintos-mkdisk filesys.dsk --filesys-size=2 此时多了一个filesys.dsk,这就是虚拟硬盘了。格式化虚拟硬盘 pintos -f -q出现上图说明成功。。复制echo文件到 pintos 的虚拟硬盘filesys.dskpintos -p ../../example/echo -a echo -- -q执行后出现:说明成功。接下来运行用户文件 pintos run echo为什么不是pintos run ‘echo x’呢?因为我们还未实现参数分离功能,这样会把”echo x”当成一个文件名,显然不存在”echo x”这个文件,加载,必然失败。看似成功了,其实不然,当然也有可能成功了,如果你已经成功,那就不必做任何修改。如何验证成功与否,后面会提到。我就在这种失败的情况下写了好久,最后发现,根本没有加载echo文件。打开src/userprog/process.c找到start_process (void *file_name_)函数如下图修改:选中的是要新加的然后make再pintos run echo我是很不幸,出现 load user program failed-_-!唉,program 打错了。。只是个输出提示而已。。但已经证明的是用户程序echo根本没有加载。。。10.于是我百度了下,原来是elf文件有问题。这个echo 是个elf文件,但是其中的入口地址是0x0000000. 而pintos 去不映射0x1000以下的内存,所以失败了。11.找到load函数,经过调试发现是下图中的 if(validate_segment(phdr, file))失败了,12.所以进入validate_segment(phdr, file)这个函数,找到问题所在了。原来是if(phdr-p_vaddrPGSIZE)失败了于是我照网上据说,把if(phdr-p_vaddrPGSIZE)改为if(phdr-p_offsetPGSIZE)还要改load 函数中代码,如下图选中部分为新加的。这样做是在pintos 内部改了用户程序的入口地址,以满足pintos 的要求。这是我在网上看到的。.我们在载入elf文件时需要做一系列检查,主要是为了确认elf文件的存储空间占用情况,代码段入口等。这些信息一般都保存在elf文件的executable header和program header里。在这里,我们遇到了一个小问题导致载入elf文件失败,需要载入的elf文件的header中标明,第一个loader部分占用虚存从0x000000开始,然而pintos操作系统默认虚存的低0x1000位置不被映射,即第0页不被映射,但是我们注意到,首个loader段实际用到的地址是从offset开始的,正好是0x1000,那么函数validate_segment()的判别机制要有所修改,将 if(phdrp_vaddr PGSIZE)改为 if (phdrp_offset PGSIZE)。这样做的话可以成功载入elf文件,不过这么做的后果是分配用户内存空间时,仍就会映射到虚存的第0页,这是pintos所不允许的,为了解决这个问题,我们在函数load()里做一下修改,如果我们发现读出的mem_page==0,我们需要手动将其设置为0x1000,这样做实际上是将一个条件判断所作的工作手动实现了,因为我们无法控制由make得到的elf文件,我们只能从load函数中做修改。13.接下来还是makepintos run echo又有问题:出现了page fault at 0xc000000814. rights violation error reading page in user context用户程序访问了内

文档评论(0)

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

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

1亿VIP精品文档

相关文档