2012-03-26 8 views
1

Ich habe einen TLB-Fehler bei Ladefehler, wenn ich den Gabel-Test ausführen, ich verstehe, dies liegt daran, falsche stackptr zu mips_usermode übergeben, scheint meine Implementierung um einige Vorschläge hier kreisen würde dankbar sein wenn ich sie korrigiere. Mein Code unten wird als Einstiegspunktfunktion in thread_fork bereitgestellt. Vermisse ich etwas?OS161: TLB Miss auf Last

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); 
} 

Antwort

1

Sie haben Muttergewinde Adressraum zu kopieren, bevor Sie thread_fork rufen, und den Adressraum Zeiger als zweiten Parameter von enter_forked_process passieren. Und in enter_forked_process, müssen Sie den Adressraum in curthread->t_addrspace füllen. Andernfalls erhalten Sie den Fehler TLB miss on load, da der Adressraum des aktuellen Threads (untergeordneten) nicht initialisiert ist.

Weitere Informationen zum OS161 Fork-Systemaufruf finden Sie in diesem Blog. Und child_forkentry gibt es mehr oder weniger das gleiche wie Ihre enter_forked_process. http://jhshi.wordpress.com/2012/03/11/os161-fork-system-call/

+0

auch die Synchronisation muss erledigt werden ... hier – gsb