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

📄 trap.c

📁 类unix x86平台的简单操作系统
💻 C
字号:
#include "types.h"#include "param.h"#include "mmu.h"#include "proc.h"#include "defs.h"#include "x86.h"#include "traps.h"#include "syscall.h"// Interrupt descriptor table (shared by all CPUs).struct gatedesc idt[256];extern uint vectors[];  // in vectors.S: array of 256 entry pointersvoidtvinit(void){  int i;  for(i = 0; i < 256; i++)    SETGATE(idt[i], 0, SEG_KCODE << 3, vectors[i], 0);  SETGATE(idt[T_SYSCALL], 0, SEG_KCODE << 3, vectors[T_SYSCALL], 3);}voididtinit(void){  lidt(idt, sizeof idt);}voidtrap(struct trapframe *tf){  int v = tf->trapno;  struct proc *cp = curproc[cpu()];  if(v == T_SYSCALL){    if(cp->killed)      proc_exit();    cp->tf = tf;    syscall();    if(cp->killed)      proc_exit();    return;  }  // Increment nlock to make sure interrupts stay off  // during interrupt handler.  Decrement before returning.  cpus[cpu()].nlock++;  switch(v){  case IRQ_OFFSET + IRQ_TIMER:    lapic_timerintr();    cpus[cpu()].nlock--;    if(cp){      // 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((tf->cs&3) == 3 && cp->killed)        proc_exit();      // Force process to give up CPU and let others run.      if(cp->state == RUNNING)        yield();    }    return;  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("spurious interrupt from cpu %d eip %x\n", cpu(), tf->eip);    break;      default:    if(curproc[cpu()]) {      // Assume process divided by zero or dereferenced null, etc.      cprintf("pid %d: unhandled trap %d on cpu %d eip %x -- kill proc\n",              curproc[cpu()]->pid, v, cpu(), tf->eip);      proc_exit();    }        // Otherwise it's our mistake.    cprintf("unexpected trap %d from cpu %d eip %x\n", v, cpu(), tf->eip);    panic("trap");  }    cpus[cpu()].nlock--;}

⌨️ 快捷键说明

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