Pintos - UserProg все тесты не пройдены is_kernel_vaddr () - PullRequest
0 голосов
/ 24 сентября 2018

Я работаю над проектом Pintos, чтобы узнать больше об операционных системах.Сначала у меня были проблемы с Devops, потому что он не очень хорошо работал с каплей Ubuntu 18.04.Теперь я запускаю его на образе 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.

Затем я попытался запустить make check (все тесты).Все они терпят неудачу по одной и той же причине.

Я что-то упустил?Есть ли что-то, что мне нужно реализовать, чтобы это исправить?Я перечитал инструкцию и ничего не увидел?

Буду признателен за помощь!Спасибо

1 Ответ

0 голосов
/ 26 сентября 2018

У меня была похожая проблема.Мой код для Project 1 работал нормально, но я не смог отформатировать файловую систему для Project 2.

Ошибка для меня произошла из следующей цепочки вызовов:

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

Проблема в том, что init_page_dir по-прежнему равен NULL, когда вызывается pagedir_activate().init_page_dir должен был быть инициализирован в paging_init(), но он вызывается после thread_init().

Основной причиной было то, что мой планировщик вызывался слишком рано, то есть до вызова thread_start().Причиной моей проблемы было то, что я выполнял вызов на thread_yield() после завершения каждого звонка на lock_release(), что имеет смысл с точки зрения приоритетного пожертвования.К сожалению, блокировки используются до того, как планировщик будет готов!Чтобы исправить это, я установил флаг с именем threading_started, который выдает сообщение в первой строке моих функций thread_block() и thread_yield(), если thread_start() еще не был вызван.

Удачи!

...