UcoreOS实验 lab5 实验存在的bug

lab5_result存在bug:

首先lab5_result的结果有问题,我们利用make qemu和make grade来查看这个bug。
首先是make qemu的结果:
在这里插入述

接着是make grade的结果:
在这里插入图片描述
我们发现均不能得到最终得正确结果。


自己完成lab5的练习后,发现仍然存在一个bug

首先我们不对proc.c文件中的init_main()函数修改,我们发现即使我们完成了所有lab5中的练习,我们经过make grade仍然不得到满分的结果。
不知道大家有没有遇到这样的情况,如下图所示是我通过make grade的结果:
在这里插入图片描述

通过结果,我们可以观察到,assertion failed:nr_free_page_store=nr_free_pages(),而这一函数的位置就是在init_main函数之中,因此我们找到proc.c文件中的这个函数。

原因分析:

首先我们找到,proc.c文件中的init_main函数,他的主要内容如图所示:
在这里插入图片描述
通过进一步的查看,我们发现forktest原本有空闲页数目为31776页,而最后实有空闲页数目为31774页出现了两页的缺页。原本我们猜测这个问题出现的原因是forktest中fork()的调用次数过多:
1.经过测试11次调用以内的fork不会出现漏页,从fork和wait函数看不出问题。
2.后来尝试修改进程数目,发现内存泄漏大小与进程数目成正比:12个进程,则泄漏1页;26个进程,则泄漏2页;64个进程,则泄漏4页。
于是我们进入kernel_thread函数中去,我们可以看到这里有调用一次fork,相当于是权限的切换,将需要内核支持的用户态文件交给内核执行。下图是kernel_thread函数的具体形式在这里插入图片描述


解决方案:

只需要通过注释,即可完成验证

而出现问题的原因就是因为这些缺页实际上是进程的堆栈空间,可以简单的理解为fork次数多了,用的堆栈空间过大,所以会出现缺页现象,因此我们认为主函数中进行的空闲页数目的assert断言检验是不必要的,所以最后的解决方案非常简单就是,把这句话注释掉。

在这里插入图片描述
最后利用make grade验证答案。
在这里插入图片描述
虽然处理略显草率,但是道理应该差不多没问题,水平有限仅供参考。

如果需要ucore的lab实验报告可以评论区私信我O。o?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值