当前位置: 首页 > news >正文

Xv6异常处理(二):内核异常

kernelvec汇编函数

与用户异常不同,当内核发生异常(中断/异常),将首先跳转到kernelve汇编函数(用户异常是uservec)。该汇编函数执行如下操作:

  1. 保存内核context到内核栈上(用户是保存到trapframe页)
  2. 调用kerneltrap内核异常处理程序
  3. 恢复内核context,注意因为操作系统调度原因,此时内核可能运行在与发生异常前不同的CPU上,因此不用恢复tp寄存器
  4. 执行sret指令返回内核发生异常前的地方
.globl kerneltrap
.globl kernelvec
.align 4
kernelvec:# make room to save registers.addi sp, sp, -256# save caller-saved registers.sd ra, 0(sp)sd sp, 8(sp)sd gp, 16(sp)sd tp, 24(sp)sd t0, 32(sp)sd t1, 40(sp)sd t2, 48(sp)sd a0, 72(sp)sd a1, 80(sp)sd a2, 88(sp)sd a3, 96(sp)sd a4, 104(sp)sd a5, 112(sp)sd a6, 120(sp)sd a7, 128(sp)sd t3, 216(sp)sd t4, 224(sp)sd t5, 232(sp)sd t6, 240(sp)# call the C trap handler in trap.ccall kerneltrap# restore registers.ld ra, 0(sp)ld sp, 8(sp)ld gp, 16(sp)# not tp (contains hartid), in case we moved CPUsld t0, 32(sp)ld t1, 40(sp)ld t2, 48(sp)ld a0, 72(sp)ld a1, 80(sp)ld a2, 88(sp)ld a3, 96(sp)ld a4, 104(sp)ld a5, 112(sp)ld a6, 120(sp)ld a7, 128(sp)ld t3, 216(sp)ld t4, 224(sp)ld t5, 232(sp)ld t6, 240(sp)addi sp, sp, 256# return to whatever we were doing in the kernel.sret


http://www.mrgr.cn/news/32833.html

相关文章:

  • [Python数据可视化]探讨数据可视化的实际应用:三个案例分析
  • C语言中if else组合
  • MyBatis-config.xml核心配置
  • ★pwn 更改pwn题libc保姆级教程★
  • 老程序员的数字游戏开发笔记(二) —— 直接开始一个Godot项目
  • vite 使用飞行器仪表示例
  • 1. stm32创建工程并下载
  • 初识模版!!
  • python - 子类为什么调用父类的方法
  • 【JavaEE】——线程的安全问题和解决方式
  • 如何使用IIC外设(硬件IIC)
  • Clip studio paint百度云下载:附安装包+教程
  • 最好的教育是言传身教,爸爸的一句话改变孩子的一生
  • 简单多状态dp第一弹 leetcode -面试题17.16.按摩师 -213.打家劫舍II
  • C++——初步认识C++和namespace的用法
  • 文本预处理_by《李沐:动手学深度学习v2》pytorch版
  • 技术周总结 09.16~09.22 周日
  • linux 基础(一)mkdir、ls、vi、ifconfig
  • OpenGL编程思想第九版环境搭建(Glfw+gl3w)-静态库方式
  • frp内网穿透部署