⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trap.c

📁 美国mit操作系统课程所用的一个教学操作系统xv6
💻 C
字号:
#include "types.h"#include "defs.h"#include "param.h"#include "mmu.h"#include "proc.h"#include "x86.h"#include "traps.h"#include "spinlock.h"// Interrupt descriptor table (shared by all CPUs).struct gatedesc idt[256];extern uint vectors[];  // in vectors.S: array of 256 entry pointersstruct spinlock tickslock;int ticks;voidtvinit(void){  int i;  for(i = 0; i < 256; i++)    SETGATE(idt[i], 0, SEG_KCODE<<3, vectors[i], 0);  SETGATE(idt[T_SYSCALL], 1, SEG_KCODE<<3, vectors[T_SYSCALL], DPL_USER);    initlock(&tickslock, "time");}voididtinit(void){  lidt(idt, sizeof(idt));}voidtrap(struct trapframe *tf){  if(tf->trapno == T_SYSCALL){    if(cp->killed)      exit();    cp->tf = tf;    syscall();    if(cp->killed)      exit();    return;  }  switch(tf->trapno){  case IRQ_OFFSET + IRQ_TIMER:    if(cpu() == 0){      acquire(&tickslock);      ticks++;      wakeup(&ticks);      release(&tickslock);    }    lapic_eoi();    break;  case IRQ_OFFSET + IRQ_IDE:    ide_intr();    lapic_eoi();    break;  case IRQ_OFFSET + IRQ_KBD:    kbd_intr();    lapic_eoi();    break;  case IRQ_OFFSET + IRQ_SPURIOUS:    cprintf("cpu%d: spurious interrupt at %x:%x\n",            cpu(), tf->cs, tf->eip);    lapic_eoi();    break;      default:    if(cp == 0 || (tf->cs&3) == 0){      // In kernel, it must be our mistake.      cprintf("unexpected trap %d from cpu %d eip %x\n",              tf->trapno, cpu(), tf->eip);      panic("trap");    }    // In user space, assume process misbehaved.    cprintf("pid %d %s: trap %d err %d on cpu %d eip %x -- kill proc\n",            cp->pid, cp->name, tf->trapno, tf->err, cpu(), tf->eip);    cp->killed = 1;  }  // Force process exit if it has been killed and is in user space.  // (If it is still executing in the kernel, let it keep running   // until it gets to the regular system call return.)  if(cp && cp->killed && (tf->cs&3) == DPL_USER)    exit();  // Force process to give up CPU on clock tick.  // If interrupts were on while locks held, would need to check nlock.  if(cp && cp->state == RUNNING && tf->trapno == IRQ_OFFSET+IRQ_TIMER)    yield();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -