Pintos - UserProg 所有测试都失败 is_kernel_vaddr()



我正在做Pintos项目,以了解有关操作系统的更多信息。起初我遇到了大量的DevOps问题,因为它在18.04 Ubuntu droplet上运行不佳。我现在在UCCS告诉学生下载pintos的VirtualBox图像上运行它。

我完成了项目 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.

然后我尝试运行 make check(所有测试(。他们都因为同样的原因而失败了。

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

将不胜感激! 谢谢

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

我的失败来自以下调用链:

thread_init()-> ... ->thread_schedule_tail()->process_activate()->pagedir_activate()->vtop()

问题是调用init_page_dirpagedir_activate()仍然是 NULL。init_page_dir应该在paging_init()中初始化,但这是在thread_init()之后调用的。

根本原因是我的调度程序被调用得太早,即在调用thread_start()之前。我问题的原因是,我在完成每次lock_release()电话后都建立了对thread_yield()的呼吁,从优先捐赠的角度来看,这是有意义的。不幸的是,锁是在调度程序准备好之前使用的!为了解决这个问题,我安装了一个名为threading_started的标志,该标志在我的thread_block()的第一行中保释,如果尚未调用thread_start()thread_yield()函数。

祝你好运!

除了Charles Celerier的回答之外,这对我有用。

定义thread_try_yield例如

void thread_try_yield(void) {
if (!list_empty(&ready_list) && thread_current() != idle_thread)
thread_yield();
}

并调用它,而不是直接呼叫thread_yield()

相关内容

  • 没有找到相关文章

最新更新