Pintos-UserProg所有测试失败是\u kernel\u vaddr()

Pintos-UserProg所有测试失败是\u kernel\u vaddr(),pintos,Pintos,我正在做Pintos项目来学习更多关于操作系统的知识。起初,我在devops上遇到了很多麻烦,因为它在18.04版本的Ubuntu上运行不好。我现在在VirtualBox图像上运行它,UCCS告诉学生下载pintos 我完成了项目1,并开始制定项目2的解决方案。按照说明创建一个文件,我运行了 pintos-mkdisk filesys.dsk --filesys-size=2 pintos -- -f -q 但是我犯了错误 Kernel PANIC at ../../threads/vaddr

我正在做Pintos项目来学习更多关于操作系统的知识。起初,我在devops上遇到了很多麻烦,因为它在18.04版本的Ubuntu上运行不好。我现在在VirtualBox图像上运行它,UCCS告诉学生下载pintos

我完成了项目1,并开始制定项目2的解决方案。按照说明创建一个文件,我运行了

pintos-mkdisk filesys.dsk --filesys-size=2
pintos -- -f -q
但是我犯了错误

Kernel PANIC at ../../threads/vaddr.h:87 in vtop(): assertion 
`is_kernel_vaddr (vaddr)' failed.
然后我尝试运行makecheck(所有测试)。他们都因为同样的原因失败了

我错过什么了吗?我是否需要实施一些措施来解决此问题?我重读了说明书,什么也没看到

非常感谢您的帮助!
谢谢

我也有类似的问题。我的项目1代码运行良好,但我无法格式化项目2的文件系统

我的失败来自以下呼叫链:

thread\u init()<代码>线程调度尾部()
->
进程激活()
->
pagedir\u激活()
->
vtop()

问题是调用
pagedir\u activate()
时,
init\u page\u dir
仍然为空
init\u page\u dir
应该在
paging\u init()
中初始化,但这是在
thread\u init()之后调用的

根本原因是调用我的计划程序太早,即在调用
thread\u start()
之前。我出现问题的原因是,在完成对
lock\u release()
的每次调用后,我都内置了一个对
thread\u yield()
的调用,这从优先级的角度来看是有意义的。不幸的是,锁是在调度程序准备就绪之前使用的!为了解决这个问题,我安装了一个名为
threading\u start
的标志,如果尚未调用
thread\u start()
函数,该标志将保留在
thread\u block()和
thread\u yield()
函数的第一行


祝你好运

这帮我找到了答案!我每次在sema_down()中调用thread_yield(),早期的抢占就把事情搞砸了。谢谢祝你下一个项目好运!我昨天刚开始支持用户程序。完成项目了吗?:)我现在正在处理文件系统,我为可扩展文件添加了逻辑,只是在调试。伟大的工程。谢谢你早些时候的帮助。我给了你两张选票,但没有显示,因为我的帐户是新的。干杯,鹅。我不喜欢针对新成员的StackOverflow政策,尤其是对于这些有点模糊的问题。为了回答你的问题,我已经完成了对用户程序的支持,现在我正在研究虚拟内存。我花了一点时间才弄明白如何开始,但我可能会在接下来的几个周末把它搞定。