文章目录
- [一 重要的函数清单](#一 重要的函数清单)
-
- [1 write(user/usys.s)](#1 write(user/usys.s))
- [一 usertrap函数(C code)](#一 usertrap函数(C code))
Lecture6 Isolation & System Call Entry视频链接
对应XV6 Book Chapter 4 Traps and device drivers
一 重要的函数清单
1 write(user/usys.s)
cpp
.global write
write:
li a7, SYS_write
ecall
ret
一 usertrap函数(C code)
cpp
//
// handle an interrupt, exception, or system call from user space.
// called from trampoline.S
//
void
usertrap(void)
{
int which_dev = 0;
if((r_sstatus() & SSTATUS_SPP) != 0)
panic("usertrap: not from user mode");
// send interrupts and exceptions to kerneltrap(),
// since we're now in the kernel.
w_stvec((uint64)kernelvec);
struct proc *p = myproc();
// save user program counter.
p->trapframe->epc = r_sepc();
if(r_scause() == 8){
// system call
if(p->killed)
exit(-1);
// sepc points to the ecall instruction,
// but we want to return to the next instruction.
p->trapframe->epc += 4;
// an interrupt will change sstatus &c registers,
// so don't enable until done with those registers.
intr_on();
syscall();
} else if((which_dev = devintr()) != 0){
// ok
} else {
printf("usertrap(): unexpected scause %p pid=%d\n", r_scause(), p->pid);
printf(" sepc=%p stval=%p\n", r_sepc(), r_stval());
p->killed = 1;
}
if(p->killed)
exit(-1);
// give up the CPU if this is a timer interrupt.
if(which_dev == 2)
yield();
usertrapret();
}