У меня была похожая проблема.Мой код для 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()
еще не был вызван.
Удачи!