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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在调试时如何知道哪些代码在xv6中导致陷阱?相关的知识,希望对你有一定的参考价值。

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

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

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

答案

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

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

以上是关于在调试时如何知道哪些代码在xv6中导致陷阱?的主要内容,如果未能解决你的问题,请参考以下文章

此代码如何在 ghostscript 中导致 -100 错误

XV6锁

为啥 scanf() 在此代码中导致无限循环?

JPA 在 Spring Boot 中导致 java.lang.NullPointerException

为啥 Excel 中的自动调整行 VBA 代码不断在我的公式中导致 #value 错误?

.htaccess RewriteEngine 在 xampp 中导致 Unexpected 403 Forbidden http 响应代码