MIT 6.S081 Lecture 6: Isolation & system call entry/exit

Reading

Traps

  • 实现用户层和内核层切换的机制

  • 发生在如系统调用、Page Fault、/0的过程中

  • Traps register
    Trapsregister

    • 32个通用register 包括sp栈指针
    • PC 程序计数器
    • MODE 代表当前在用户模式还是内核模式
    • SATP 指向pagetable的物理地址
    • STVEC 指向trap指令的起始地址 trapoline page
    • SEPC 在trap时保存PC
    • SSRACTCH 指向trapframe page
  • supervisor mode
    supervisor

    • supervisor mode可以读写上述控制寄存器,并且可以读写PTE_U = 0的page
  • Traps process(shell write as example)
    Traps

    • 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的consolcc

    • info 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

http://huaeryi.com/2023/04/01/6-S081-Lecture-6/

作者

huayi

发布于

2023-04-01

更新于

2023-04-15

许可协议