以下是我的假设:当代码导致陷阱(系统调用或异常)时,xv6将用特定值替换寄存器以将控件转移到alltraps()
,其中调用trap()
。
但有时候xv6会因我的期望而遇到trap()
,我想知道为什么它会进入这个陷阱。调试时,在trap()
中设置断点并且xv6在此处停止后,我只能在调试器中看到this(我正在使用CLion)。在调用堆栈中,底部堆栈帧为alltraps()
,因此我无法找出导致陷阱的时间和原因。
我想知道在哪个文件中,陷阱是针对trap()
的某个调用引起的。这可能吗?
答案 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()调用引起的。这可能吗?
不可能,因为这是一个硬件事件,它与源代码无关。