OS161: TLB отсутствует при загрузке
У меня ошибка при загрузке TLB при запуске теста форка, я понимаю, что это связано с передачей неправильного stackptr в mips_usermode, моя реализация, кажется, вращается вокруг нескольких предложений здесь, была бы признательна, если бы я ее исправил. Мой код ниже предоставляется как функция точки входа в thread_fork. Я скучаю по чему-нибудь?
void
enter_forked_process(void *junk,unsigned long num)
{
kprintf("\n entered enter_fork_process");
struct trapframe tf = (*((struct trapframe *) junk));
(void) num;
kprintf("\n copied tf from from parent to child");
tf.tf_v0 = 0;
tf.tf_a3 = 0;
tf.tf_epc += 4;
kprintf("abt to enter mips_ usermode");
mips_usermode(&tf);
}
1 ответ
Вы должны скопировать адресное пространство родительского потока перед вызовом thread_fork
и передайте указатель адресного пространства в качестве второго параметра enter_forked_process
, И в enter_forked_process
, вы должны заполнить адресное пространство в curthread->t_addrspace
, В противном случае вы получите TLB miss on load
ошибка, поскольку адресное пространство текущего потока (дочернего) не инициализировано.
Для получения более подробной информации о системном вызове OS161, пожалуйста, обратитесь к этому блогу. А также child_forkentry
там более или менее так же, как ваш enter_forked_process
, http://jhshi.wordpress.com/2012/03/11/os161-fork-system-call/