Как узнать, какой код вызвал ловушку в xv6 при отладке? - PullRequest
0 голосов
/ 15 мая 2018

Вот то, что я предполагаю: когда код вызывает ловушку (системный вызов или исключения), xv6 заменит регистры с определенными значениями, чтобы передать управление в alltraps(), в котором вызывается trap().

Но иногда xv6 выходит за trap() из моих ожиданий, и я хочу знать, почему он попал в эту ловушку.При отладке, после того как я установил точку останова в trap() и xv6 остановился здесь, я вижу только this в отладчике (я использую CLion).В стеке вызовов нижний кадр стека равен alltraps(), поэтому я не могу выяснить, когда и почему возникла ловушка.

Я хочу выяснить, в каком файле и на какой строке вызывается ловушкадля определенного звонка trap().Это возможно?

1 Ответ

0 голосов
/ 15 мая 2018

Если вы внимательно изучите код trap(), вы увидите, что он также обрабатывает аппаратные прерывания (таймер, ide и т. Д.).

     36 void                                                                            
     37 trap(struct trapframe *tf)                                                      
     38 {                                                                               
     39   if(tf->trapno == T_SYSCALL){                                                  
              ...                                                
     47   }                                                                             
     48                                                                                 
     49   switch(tf->trapno){                                                           
     50   case T_IRQ0 + IRQ_TIMER:                                                      
     51     if(cpuid() == 0){                                                           
     52       acquire(&tickslock);                                                      
     53       ticks++;                                                                  
     54       wakeup(&ticks);                                                           
     55       release(&tickslock);                                                      
     56     }                                                                           
     57     lapiceoi();                                                                 
     58     break;                                                                      
     59   case T_IRQ0 + IRQ_IDE:                                                        
             ...

Итак, что вы видите, это аппаратное прерываниеи процессор передает управление одному из векторов IDT, затем на alltraps, затем на trap().Скорее всего, вы сталкиваетесь с прерыванием по таймеру, которое используется для переключения контекста.

Я хочу выяснить, в каком файле, на какой строке прерывание вызывается для определенного вызова trap ().Возможно ли это?

Нет, это невозможно, поскольку это аппаратное событие, которое не имеет отношения к исходному коду.

...