Если вы внимательно изучите код 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 ().Возможно ли это?
Нет, это невозможно, поскольку это аппаратное событие, которое не имеет отношения к исходному коду.