MIT 6.S081 Lecture 6: Isolation & system call entry/exit
Reading
- Read Chapter4
- read code
Traps
-
实现用户层和内核层切换的机制
-
发生在如系统调用、Page Fault、/0的过程中
-
Traps register
- 32个通用register 包括sp栈指针
- PC 程序计数器
- MODE 代表当前在用户模式还是内核模式
- SATP 指向pagetable的物理地址
- STVEC 指向trap指令的起始地址 trapoline page
- SEPC 在trap时保存PC
- SSRACTCH 指向trapframe page
-
supervisor mode
- supervisor mode可以读写上述控制寄存器,并且可以读写PTE_U = 0的page
-
Traps process(shell write as example)
- uservec和userret是trampoline.S中的函数
- usertrap()和usertrapret()是trap.c中的函数
- syscall()是syscall.c中的函数,它根据寄存器传入的参数调用不同的系统调用,如sys_write()
- 上述文件均在kernel文件夹中
-
内存映射文件(Memory-mapped file access)机制,将用户空间的虚拟地址空间直接映射到文件内容,可以通过内存地址直接读写文件,这比read write系统调用快上许多,这一功能将在Lab mmap中实现
gdb调试traps
-
.asm
是带有指令地址的汇编代码.S
则没有指令地址 -
ctrl-a c
进入qemu的consolccinfo mem
打印pagetable
-
csrrw a0, sscratch, a0
交换了a0和sscratch的内容 -
在trampoline page中执行traps,trampoline page包含了内核的trap处理代码,这个操作由内核通过stvec小心地映射到用户pagetable,但是由于PTE_U设置为0,所以不受用户影响
-
在RISC-V中,ecall尽量简单,由软件也即OS实现了traps机制,目的是实现软件的灵活性,ecall只干三件事
- ecall从user mode切换到supervisor mode
- ecall将pc的值保存在sepc
- ecall跳转到stvec指向的指令
-
RISC-V在每个用户进程的pagetable中映射了trapframe page,其中最重要的是保存了32个用户通用寄存器,在进入traps之前,这个地址会保存在sscratch中
-
trapframe结构定义在proc.h中
-
之后从user pagetable切换到kernel pagetable,程序之所以没有崩溃的原因是trampoline page在U/K中映射相同
-
OS总是从Kernel启动,设置好一切与Traps有关的register后转移到User
-
sret是从supervisor mode切换到user mode的RISCV-V指令
-
切换kernel pagetable后,我们只是换了个地方执行c程序
-
在usertrap()中scause = 8,代表我们是因为系统调用来到这里
MIT 6.S081 Lecture 6: Isolation & system call entry/exit