MIT6.1810: xv6 book Chapter4: Traps and system calls 笔记

三种使CPU暂停指令转而执行内核代码的事件:

1.系统调用 ecall

2.exception指令异常

3.设备interrupt

统称为trap

xv6的trap处理分为四个阶段:RISC-V CPU硬件行为,C代码前的汇编指令,处理trap的C函数,系统调用或设备驱动服务路线

处理陷入的内核代码被称为handler ,其中的首批指令通常用汇编语言编写,有时被称为vector

RISC-V trap machinery

每个RISC-V CPU都有一系列硬件控制寄存器,下面列举其中重要的几个:

  • stvec(Supervisor Trap Vector Base Address Register) 内核将其trap handler写在这里,RISC-V跳转到stvec中的地址处理陷入(从用户态陷入:uservec;从内核态陷入:kernelvec)
  • sepc(Supervisor Exception Program Counter) 陷入发生时,RISC-V将pc存在这里,从陷入返回时将sepc复制给pc
  • scause 描述陷入的原因
  • sscratch(Supervisor Scratch Register) 帮助避免在保存用户寄存器前覆盖它们
  • sstatus :SIE bit 设备中断是否启用;SPP bit trap来自user mode/supervisor mode
  • satp(Supervisor Address Translation and Protection) 包含了指向page table的物理内存地址

Traps from user space

代码流程:

trampoline.S/uservec -> trap.c/usertrap() -> trampoline.S/userret

xv6中,uservec执行时,要存储32个寄存器的值,此时没有空闲的寄存器

RISC-V提供了寄存器sscratch,下面代码表示a0 获得 sscratch 中预先存放的 TRAPFRAME 地址,sscratch 保存了用户态的 a0 值

assembly 复制代码
# save user a0 in sscratch so
# a0 can be used to get at TRAPFRAME.
csrw sscratch, a0

uservec和userret用汇编语言写的原因是很难用C语言保存所有寄存器的值,以及在切换页表时使C代码继续生效

Code: System call arguments

有些系统调用需要指针参数来读写用户内存,为防止用户指令传递恶意地址指针,xv6实现了一系列确保指针安全传递的函数

e.g. syscall.c/fetchstr()调用了vm.c/copyinstr(),后者调用walkaddr()确保传递的虚拟地址在用户页表中可用

Traps from kernel space

代码流程:

kernelvec.S -> trap.c/kerneltrap() -> kernelvec.S

Real world

现实中部分操作系统会将内核内存映射到每个进程的用户页表,这样可以省去用户态到内核态的页表切换;系统调用的实现也可以利用当前进程的用户页表而直接解引用用户指针。

相关推荐
AOI小白新手上路38 分钟前
anomalib 缺陷检测复现笔记:从跑通库到 EfficientAD 落地
人工智能·笔记·机器学习
xxwl5851 小时前
RabbitMQ 学习笔记
笔记·学习·rabbitmq
加油努力有饭吃2 小时前
DLMS/COSEM 蓝皮书解读(二十六):Auto connect(class_id = 29)—— 自动拨号与主动连接(出站管理)
笔记
CarIise2 小时前
Java实训阶段查漏补缺复习笔记1
java·开发语言·笔记
陈卫军老师2 小时前
陈卫军谈商业底线:营销是术,产品是道
经验分享·笔记·流量运营
智者知已应修善业3 小时前
【51单片机只有一个8*8点阵数据如何滚动起来一片595+一组IO+花样】2022-1-15
c++·经验分享·笔记·单片机·蓝桥杯·硬件架构
Space655364 小时前
常见组学技术笔记:从 DNA 基因组学到 Multi-omics
笔记
lcj25116 小时前
【Linux】 Makefile 详解
linux·笔记·面试
常州晟凯电子科技6 小时前
sigmaStar SSC305DE/SSC308开发笔记之开发环境搭建和SDK编译
人工智能·笔记·嵌入式硬件·物联网·性能优化·视频编解码
wdfk_prog7 小时前
LWIP教程 00:从网线上的电信号到 lwIP——PHY、MAC、DMA 与 `netif` 的完整边界
运维·网络·笔记·学习·ip