我正在做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_dir
时pagedir_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()
。