在调试时如何知道哪些代码在xv6中导致陷阱?

时间:2018-05-15 06:15:30

标签: operating-system xv6

以下是我的假设:当代码导致陷阱(系统调用或异常)时,xv6将用特定值替换寄存器以将控件转移到alltraps(),其中调用trap()

但有时候xv6会因我的期望而遇到trap(),我想知道为什么它会进入这个陷阱。调试时,在trap()中设置断点并且xv6在此处停止后,我只能在调试器中看到this(我正在使用CLion)。在调用堆栈中,底部堆栈帧为alltraps(),因此我无法找出导致陷阱的时间和原因。

我想知道在哪个文件中,陷阱是针对trap()的某个调用引起的。这可能吗?

1 个答案:

答案 0 :(得分:2)

如果你要仔细检查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()调用引起的。这可能吗?

不可能,因为这是一个硬件事件,它与源代码无关。