xv6 risc-v trap 笔记

MIT6.S081 - Lab4(Trap)实验笔记 本篇是 MIT6.S081 操作系统课程 Lab4 的实验笔记,Lab4 的两道题难度并不高,更重要的是 Lec5 和 Lec6 课程中,对 xv6 在 RISC-V 上的 Trap 流程进行学习。 阅读详情

xv6中trap(即让cpu暂停执行当前代码,去执行相应的处理代码的情况)有三种:

  • 系统调用
  • 异常,如除以零
  • 设备中断,例如完成了一次读写事件,当然也包括定时中断

发生trap时,一般的处理是:

  • 控制转移到kernel
  • kernel保存当前进程的相关状态(具体就是trampoline.s中,将寄存器保存到进程的trapframe,将栈顶指针设为内核栈的,恢复tp寄存器,让其保存当前cpu的id,从trapframe中取出内核页表页的地址,设置为satp的值,并刷新tlb,从tf中取出usertrap的地址,并跳转到它)
  • 执行trap handler代码(usetrap)
  • (可选的)执行usertrapret(TODO),
  • 执行trampoline.s中的userret
  • 返回用户态,继续执行用户程序

上面usertrap和usertrapret有一些细节需要注意,TODO

riscv trap machinery

riscv有一些控制寄存器,xv6里用到的有这些:这些寄存器只能在supervisor 模式(即内核态)被读写

  • stvec:保存trap handler的地址,当发生trap时,将他的值设为pc
  • sepc:当trap发生时,将pc保存到sepc,trap返回用户态时(trampoline.s中的useret),执行sret将sepc设置为pc
  • scause:发生trap时,这里保存的值指示trap的种类/原因
  • sscratch:发生trap时,他的值是当前进程tf的地址
  • sstatus:其中SPP bit标识之前的模式是supervisor(1)还是用户态(0),SIE bit标识当前中断是否开启,如果为0,那么中断会被推迟到SIE bit为1

当发生trap时,riscv的硬件会:

  • 如果是设备中断,并且SIE为0,那么什么也不做
  • 禁用中断(SIE置零
  • 将pc复制到sepc
  • 设置SPP bit,表明当前模式
  • 设置scause,表明trap原因
  • 将模式设为supervisor
  • 设置pc为sepc
  • 从新pc开始执行

cpu必须一次完成上述步骤,例如,如果没有更换pc,那么可能现在是内核态,但是仍然执行用户指令

注意,cpu并没有切换页表,没有切换栈,没有保存除了pc之外的寄存器,这些任务留给内核来执行,这样设计可以给软件提供最大的灵活性

trap from kernel space

内核态可能发生的trap有两种:异常和中断(内核态的系统调用应该不算trap

内核态中,stvec被设为kernelvec(内容为保存寄存器,并调用kerneltrap),因为已经是内核态了,所以此时的页表是内核页表,也是运行在内核栈上

上述的保存寄存器是保存在该进程的内核栈上(这一点很重要,因为如果在kerneltrap中切换到其他进程,如kerneltrap中调用yield,这样做就能保证重新切换回来时,能够从该进程的内核栈上恢复寄存器)

处理完trap后,恢复sepc和sstatus(因为如果yield了,他们的值可能被改动过了),然后继续运行kernelvec,从内核栈上恢复寄存器

如果kerneltrap中调用了yield,该怎么返回?其实没区别?yield切换到其他进程,然后重新调度回来后,依然kernelvec,返回到之前内核态发生trap的位置继续执行?

注意,之前提到过,stvec在用户态下指向的是trampoline.s中的uervec,但是发生trap之后,stvec并没有被马上设置为kernelvec的地址,但是这不会有问题,因为发生trap之后,cpu马上关闭了中断,所以即使内核中有一段时间stvec没有指向kernelvec,也没关系

trap from user space

用户空间的trap,比内核态要多一种:系统调用

处理user trap基本是这样一条路线:uservec,usertrap,usertrapret,userret(头尾两个是trampoline.s),中间是trap.c

在本os中,用户进程的页表里没有映射内核,因为riscv的硬件不会在发生trap时切换页表,所以我们需要将用户内核转换的代码映射在用户地址空间(页表)里,并且用户内核转换的代码trampoline.s必须切换到内核页表,并且为了避免崩溃,trampoline必须在内核页表和用户页表中的地址必须相同(WHY?TODO 当然确实是这么做的

(中间讲了一堆 乱七八糟的 uservec怎么把寄存器保存到trapframe里)

进入usertrap后,首先设置stvec为kernelvec(因为现在是内核态了),保存sepc,因为可能如果切换到其他进程,sepc可能会被覆盖。

如果是系统调用,那么运行syscall函数,注意此时会将sepc+4,因为之前sepc指向的是系统调用那一行汇编代码(ecall),但是我们返回时,要从系统调用之后继续运行

如果是异常,那么,kill该进程

返回地址空间,首先调用usertrapret,他首先修改stvec,重新指向uservec,并设置uservec所依赖的trapframe字段,设置sepc为之前保存的pc(之前trap时将pc保存到了sepc),最后,调用userret:切换到用户页表,恢复寄存器

MAKESATP 没看懂  

#define MAKE_SATP(pagetable) (SATP_SV39 | (((uint64)pagetable) >> 12))

因为trampoline在内核和用户地址空间中的地址相同,所以上面即使切换了页表,也能正常运行

timer interrupt

定时中断是riscv时钟硬件定时发出的,它被用来维护xv6的时钟,以及用来驱动切换进程

riscv要求定时中断在machine mode中处理,而不是supervisor mode。而machine mode没有启用分页,并且有一套自己的控制寄存器,因此,一般不把内核代码运行在machine mode中。因此,xv6处理定时中断的方式和上面提到的trap是不同的。

在machine mode下执行的代码在start.c里,在main之前执行,设置接受定时中断:一方面是对CLINT(core-local interrupt)进行编程,使其在固定事件后发出中断信号,另一方面是设置scratch区,类似trapframe,以便timer interrupt handler能够保存寄存器,并且找到CLINT寄存器的地址。最后,start设置mtvec为timervec,启用定时中断

定时中断可能发生在用户态和内核态,内核不能再关键操作时禁用中断,因此定时中断处理程序在完成自己任务时必须保证不能打乱被中断的内核代码。基本策略是让定时中断请riscv发出一个software interrupt,然后马上返回。riscv使用普通的trap机制将software interrupt传给内核,允许内核禁用他们。处理定时中断产生的软中断的代码在devintr里

machine mode定时中断向量是timervec,保存一些寄存器到scratch里,告诉CLINT何时产生下一个中断,让riscv发出一个软中断,然后恢复寄存器,返回

code:调用系统调用

initcode.s调用了exec系统调用:首先设置参数,这里是设置a0(要执行的程序的名称,init),设置a1(argv:init,0),然后将系统调用号存到a7,再执行ecall:uservec->usertrap->syscall->userret(如之前所说)

syscall首先从a7(保存在tf里)里取出系统调用号,然后从函数指针的数组里取出对应系统调用的地址,并执行,将返回值保存在tf->a0,

返回用户态时,userret会将tf中寄存器的值恢复到cpu寄存器,然后继续执行用户代码

code:系统调用参数

riscv的c调用约定使用寄存器传递参数,在系统调用里(内核态),寄存器的值可以通过tf获取(argraw)

一些系统调用传递的是指针,这样,内核态就必须读取用户内存。例如,exec的argv就是一个指针数组。其中指针指向的就是用户内存,这带来了两个挑战:

  • 用户程序可能是恶意的,从而可能传给内核一个非法的指针,或是让内核去读内核而不是用户内存
  • 内核页表和用户页表的映射不同,所以内核不能直接读写用户提供的地址

这里的方式是,使用walkaddr,使用该用户页表,找到给出的虚拟地址对应的物理地址,然后从物理地址(为什么?因为在内核页表中,大部分的物理地址和虚拟地址都是值相同的)获取内容

walkaddr也检查了传入的用户虚拟地址,如果其超出了该用户的地址空间就报错,这样,就不会让内核读其他的内存

设备驱动

驱动是os中管理特定设备的代码,他告诉设备硬件:执行操作,配置设备,使其在完成操作后产生中断,处理得到的中断,以及和等待设备io的进程interact

驱动的代码可能很棘手,因为驱动和管理的设备并发运行。而且,驱动必须理解设备的硬件接口,这可能很复杂,文档很少

需要os操作的设备一般可以配置成产生中断(trap的一种)。发出中断时,内核trap处理程序必须能够辨认出来,并且调用设备的中断处理程序;在xv6中,这种分配发生在devintr中

很多设备驱动分为两部分:一部分是作为进程的一部分运行,另一部分是在中断时运行。前者被系统调用如read/write驱动,从而让设备执行一个操作,然后等待操作完成。完成后发出一个中断,驱动的中断处理程序知道什么操作完成了之后,唤醒等待的进程,(可能)告诉硬件继续执行其余在排队等待的操作

code:console driver

console driver是对驱动结构的一个简单阐述

console驱动通过UART串口硬件接受人们输入的字符。驱动每次积累一行的输入,处理诸如删除(backspace),control-u

用户进程,如shell,通过read系统调用来从console获取一行的输入,当你在qemu中输入到xv6,你按下的键通过qemu模拟的uart传递到xv6

驱动打交道的uart硬件是qemu模拟的16550芯片。在真是的计算机上,16550会管理连接到终端或者其他计算机的一个rs232串行链路

当运行qemu时,连接到键盘和显示器

uart硬件在软件看来就是一组内存映射的控制寄存器。即,有一些物理地址,riscv硬件将其连接到uart设备,这样加载保存是和设备而不是内存打交道。uart被映射到的内存地址是uart0.有一些uart控制寄存器,每个一个字节,他们到uart0的offset定义在uart.c。例如,lsr寄存器包含的bit指示输入的字符是否在等待软件读取,这些字符可以从rhr寄存器读取。每次读了一个字符后,uart硬件就将其从内部的保存等待字符的fifo中删除,如果fifo为空,那么lsr为0

main调用consoleinit来初始化uart硬件,并且配置使其产生输入中断

init.c中打开了console,shell从其对应的fd读取console收到的字符,调用read会最终调用consoleread,然后consoleread等待输入(通过中断),输入缓存在cons.buf中,将输入复制到用户空间,一行到达后,返回到用户进程。如果用户没有输入一整行,那么reading process会在sleep中等待。

当用户输入一个字符,uart让riscv发出一个中断,riscv和xv6以如上所述的方式处理中断,xv6的trap处理程序调用devintr,devintr通过scause发现中断来自外部设备,再从PLIC知道是哪个设备中断了,如果是uart,那么调用uartintr

uartintr从硬件寄存器rhr中读出字符,传递给consoleintr,他不等待字符,因为以后的输入会产生新的中断。consoleintr的工作是处理特殊字符(如control u,删除一行,control h 回退一格,control p打印当前运行的进程),在cons.buf中保存字符直到输入一行或者缓冲区满,那么此时唤醒consoleread

一旦consoleread被唤醒,就能观察到cons.buf中的一整行,复制到用户空间,并且返回到用户态

在多核机器上,中断可能传给任一个cpu。PLIC管理这个选择。中断可能传给在运行read的cpu,也可能是其他的cpu

因此中断处理程序不应该关心被中断的程序(?TODO

 

 

【xv6 RISC-V】xv6操作系统原理解析与源代码阅读报告 本文具体分析了基于RISC-V多核处理器的xv6操作系统的基本理论与具体实现,通过阅读对应源代码,研究了包括系统调用、陷阱、内存管理、多线程、锁与文件系统等操作系统的重要组成部分,结合mit的lab对其中某些具体实现进行了部分改进。... 阅读详情

相关推荐

XV6 lab3:Trap

xv6 测验

weixin_53215555的博客 1407

【RISC-V】Trap和Exception

RISC-V之Trap与Exception

佳大先生的博客 5470

Haclon案例-找出图中面积最大的圆

自带的函数,求得圆的面积和圆心点坐标,然后,用本章所学习的选择算子和循环算子找出面积最大的圆。的图片,试着给它加上不同种类的噪声,然后找出其中面积最大的圆,并将圆的面积标注在其圆心位置。可知,除了六个圆形之外,还有一些微小的噪声点,采用了开运算和特征选择的方法去除噪声。1. 该图片为一灰度图,对其进行二值化,二值化后如图。4. 在面积最大圆的圆心坐标位置写上该圆的面积。

qq_20660115的博客 904

RISC-V 32架构实践专题九(从零开始写操作系统-trap机制)

在riscv体系架构中,异常和中断的过程被统称为trap。广义的来说,中断也属于异常的一部分;不管发生异常或是中断,微处理器的硬件行为是一致的,微处理器暂停当前程序,转向异常或中断处理程序,处理完成后返回之前暂停的程序。

weixin_53479532的博客 2214

5分钟搞定单细胞marker基因气泡图:scDotPlot保姆级教程(含Seurat适配)

本文提供了一份详细的scDotPlot R包使用教程,帮助用户在5分钟内完成单细胞marker基因气泡图的绘制。教程涵盖环境准备、Seurat和SingleCellExperiment对象的适配处理、进阶可视化技巧及自动化报告生成,特别适合生物信息学新手和临床研究者快速掌握这一高效的可视化工具。

weixin_29047545的博客 261

滚动轴承振动信号特征解析与故障诊断模型构建

本文深入解析了滚动轴承振动信号的三大来源与特征,并详细阐述了从时域、频域到时频域的特征提取方法。通过构建基于机器学习(如随机森林、SVM)或深度学习的故障诊断模型,结合实战代码示例,为设备维护工程师提供了一套从信号分析到智能诊断的完整解决方案,旨在实现精准的故障识别与预测性维护。

qsc901234567的博客 368

开发一个RISC-V上的操作系统(六)—— 中断(interrupt)和异常(exception)

一般来说,异常为当前执行的指令发生了“不正常的情况”,如除法指令的除数为0、缺页异常等等,异常发生后会跳转执行异常处理程序,视情况决定是否跳回发生异常的指令继续执行,如缺页异常在执行完缺页处理程序后会跳转到原指令继续执行,而非法指令引起的异常则不会跳回原指令继续执行。 而中断则是在当前执行流中发生了某个外部事件,需要暂停当前执行流去处理这个外部事件,和异常一样,处理完后也要视情况决定是否返回原执行流继续执行,但是中断一般是跳回发生中断的下一条指令继续执行,除了某些多周期指令被中断后需要重新执行,如除法指令

欢迎一起交流问题! 4279

Fat-Tree Topo Architecture(胖树拓扑结构)

背景 最近在搜索关于Fat-Tree的相关资料时,发现网上内容比较少,很多博客是相互转载的,拓扑结构图也加载不出来,使得对Fat-Tree的理解过于抽象。 实践 传统数据中心采用多层级的树形结构,这种结构针对客户端/服务器(C/S)模式能有较好的效果。树形结构包括单根树和多根树。多根数的根节点往往作为备份节点存在(我们以方格代表交换机)。 传统单根/多根拓扑结构有以下缺点:成本高,根部交换机必须要有足够大的带宽来满足下层服务器之间的通信;性能瓶颈,无法满足数据中心内部大规模的MapReduce和数据拷贝。

金色牛神的专栏 3万+

制作一个RISC-V的操作系统十-Trap和Exception(流 mtvec mepc mcause mtval mstatus trap完整流程)

陷入到S之前的权限可以是 U S 所以用一个比特位表示,陷入到U只能是U,那没有必要保存,因为执行完trap后恢复到的和执行trap时一样。在RISC-V架构的特权模式下,不同的异常等级(如Machine、Supervisor、User等)会有对应的陷阱值寄存器,例如在Supervisor模式下,类似的寄存器可能是。WPRI:读这个寄存器的时候忽略该部分的值,写这个寄存器的时候要保留该部分原来的值(不要变)base:存储trap入口函数的基地址右移两位的即四字节对齐的地址。寄存器会被设置为相关的错误值。

llovewuzhengzi的博客 1744

别再只画版图了!用ADS RFPro的Circuit模型,快速评估滤波器加电容后的性能变化

本文详细介绍了如何利用ADS RFPro的Circuit模型功能,实现射频滤波器设计中版图与集总元器件的高效协同仿真。通过混合仿真技术,工程师可以快速评估滤波器加电容后的性能变化,大幅缩短设计迭代周期,提升工作效率。文章还提供了实战案例和高级技巧,帮助读者掌握这一创新设计方法。

weixin_28559803的博客 258

Kali Linux渗透测试:蚁剑(AntSword)三种安装方法与避坑指南

WebShell管理是渗透测试与网络安全攻防演练中的关键技术环节,它允许安全人员在获得初步访问权限后,对目标系统进行文件管理、命令执行和数据库操作等深度控制。其核心原理是通过在Web服务器上植入特定脚本,建立一条隐蔽的远程管理通道。在实战中,一个高效、稳定的WebShell管理工具能极大提升后渗透阶段的工作效率与成功率。蚁剑(AntSword)作为一款功能强大的国产开源工具,凭借其插件化架构和图形化界面,成为众多安全研究人员的首选。本文将聚焦于如何在渗透测试专用操作系统Kali Linux上部署蚁剑,详细对

weixin_34413103的博客 414

循序渐进,学习开发一个RISC-V 上的操作系统

第 10 章 Trap

Lbrooon的博客 2595

汽车底盘技术解析:从悬架调校到智能化,如何评价国产车底盘实力

汽车底盘作为决定车辆驾驶质感、安全性和耐久性的核心系统,其技术内涵远不止于悬架结构。从行驶系、转向系到制动系的协同工作,底盘调校是一门融合机械原理与工程实践的艺术。在电动化与智能化浪潮下,底盘技术正经历从被动适应到主动响应的变革,CDC可变阻尼减震器和空气悬架等技术的应用,让底盘具备了通过OTA升级实现性能优化的可能。国产汽车品牌如奇瑞、吉利等,通过平台化架构研发与调校经验积累,正推动底盘技术从“能用”向“好用”乃至“塑造独特驾驶风格”迈进。理解底盘技术,需超越简单的结构对比,关注其在实际路况中的滤震性、支

weixin_34413103的博客 387

操作系统理解(xv6)

XV6操作系统理解

Hello_Hamburger的博客 1620

C#与数据采集卡集成开发全指南:从硬件连接到实时数据处理(附工业传感器监测实战)

C#数据采集卡集成开发指南 本文系统介绍了不同类型数据采集卡(DAQ卡)与C#的集成方法。主要内容包括: 数据采集卡分类:按接口分为PCIe/PCI(高带宽低延迟)、USB(便携即插即用)和以太网(远距离组网);按信号类型分为模拟量输入、数字量输入/输出等。 C#集成核心方法: 优先使用厂商SDK(如NI DAQmx),提供完整功能封装 无SDK时采用通用协议(如USB HID、Modbus TCP) 具体实现示例: NI DAQmx采集热电偶温度代码 USB HID协议读取模拟量电压值 工业应用要点:实时

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1972

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

xv6:trap与系统调用

有三种事件会让CPU先把普通的指令执行中止,强行切进事件处理程序:书中使用术语trap描述被打断的代码后续需要恢复,所以会存下那瞬间的各类寄存器数据,以便后续恢复执行 它们不应该知道trap的发生,即让trap是透明的 切进内核后控制权转交给内核代码,然后执行相应的handler 恢复后被打断的程序从它被打断的地方继续执行,一切一如往常就好像时间暂停对于被暂停的人来说好像没有发生一般隔离性要求只准许内核使用设备是有意义的,因为内核是个便利的机制,对于多处理器之间共享设备来说Xv6 陷阱处理分四个阶段进行:第

汤圆的博客 1336

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

xv6 lab4 trap

lab4 trap实验思路及解析

qq_62270640的博客 1228

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

6.S081——补充材料——RISC-V架构中的异常与中断详解

在RISC-V标准中,将异常(exception)定义为当前CPU运行时遇到的与指令有关的不寻常情况,而使用中断(interrupt)定义为因为外部异步信号而引起的让控制流脱离当前CPU的事件。而陷阱(trap)表示的则是,由异常或者中断引起的控制权转移到陷阱处理程序的过程。其实Xv6的定义和RISC-V的定义是相互兼容的,我们说在Xv6中有三种方式会触发陷阱:系统调用、中断和程序异常,其实系统调用中的ecall指令和程序执行中的异常都属于RISC-V标准中定义的异常情况,而。

zheyuan的博客 1万+

riscv xv6学习笔记

记录做实验时对xv6 2020操作系统的观察和理解,环境搭建Ubuntu20.04,交叉编译工具链直接apt安装就行,自己编译反而会因为选择的qemu和编译工具版本不匹配导致无法启动xv6。 代码仓库网址:https://github.com/cmyhhhh/xv6-labs-2020/在Makefile的UPROGS里加入$U/_sleep\,用于后续清理编译后的文件。 系统调用接口xv6实验里已经申明好,user/user.h文件定义了系统调用和工具接口,usys.pl用于生成usys.S文件,usy

qq_45806499的博客 1488

操作系统MIT6.S081:[xv6参考手册第4章]->Trap与系统调用

本系列文章为MIT6.S081的学习笔记,包含了参考手册、课程、实验三部分的内容,前面的系列文章链接如下 操作系统MIT6.S081:[xv6参考手册第1章]->操作系统接口 操作系统MIT6.S081:P1->Introduction and examples 操作系统MIT6.S081:Lab1->Unix utilities 操作系统MIT6.S081:[xv6参考手册第2章]->操作系统组织结构 操作系统MIT6.S081:P2->OS organization and system calls 操

InnerPeaceHQ的博客 3261

xv6学习——Chapter 4

Xv6学习——Chapter 4 Traps and system calls

m0_55746209的博客 861

XV6操作系统trap机制详解与RISC-V实践

操作系统中的trap机制是实现用户态与内核态安全切换的核心技术,它通过硬件与软件的协同处理系统调用、异常和中断。RISC-V架构通过特权级设计和CSR寄存器提供标准化的trap处理框架,XV6教学操作系统以精简的500行代码完整实现了该机制。在工程实践中,trap性能直接影响系统调用和中断响应延迟,XV6采用trampoline页和统一的trapframe结构优化上下文切换。通过分析XV6的uservec汇编跳板和usertrap分发逻辑,可以深入理解现代操作系统如Linux的系统调用实现原理,并为RISC

weixin_33491377的博客 274

xv6中断与陷阱处理:RISC-V特权模式下的异常处理机制完全指南

在RISC-V架构操作系统中,**xv6中断与陷阱处理**是系统安全稳定运行的核心机制。xv6作为教学操作系统,其**RISC-V特权模式下的异常处理机制**设计精巧而实用,为理解现代操作系统中断处理提供了绝佳范例。本文将深入解析xv6如何通过RISC-V硬件支持实现高效可靠的**陷阱处理机制**,帮助初学者掌握操作系统异常处理的核心原理。 ## 📊 RISC-V特权模式架构概览 RISC-

gitblog_01160的博客 1076

xv6-lab4-trap

Lab:traps 前置知识 xv6 book 第四章 kernel/trampolines.S 涉及从用户态到内核态以及返回的代码 kernel/trap.c 处理中断的代码 RISC-V assembly 实验目标 该实验旨在让你熟悉一些汇编代码 Backtrace 实验目标 在kernel/printf.c 中实现一个函数 backtrace(), 并在 sys_sleep 中调用它。 backtrace() 会打印当前栈上所有函数调用返回地址 backtrace: 0x0000000080

qq_25698501的博客 1593

XV6操作系统trap机制详解与RISC-V实现

操作系统的trap机制是用户态与内核态交互的核心桥梁,通过硬件中断和异常处理实现特权级切换。RISC-V架构通过stvec、sepc等控制寄存器提供硬件支持,XV6教学系统则用精简代码展示了完整的trap处理流程。该机制支撑着系统调用、页错误处理等关键功能,在进程调度、内存管理等场景发挥重要作用。以RISC-V的ecall指令触发系统调用为例,从用户态陷入内核态需经历寄存器保存、原因判断、处理分发等阶段,而时钟中断则驱动着进程调度器的运转。通过分析XV6的kernelvec.S汇编入口和trap.c分发逻辑

weixin_32075843的博客 340

xv6 lab4 traps实验全解析:从RISC-V trap到backtrace与alarm

操作系统内核需要处理用户态与内核态之间的频繁切换,这一过程在RISC-V架构中由统一的trap机制承载。当进程执行系统调用、触发异常或接收时钟中断时,CPU会通过trampoline进入内核,利用trapframe保存完整现场,处理完毕后再精确恢复。理解这一底层路径,是掌握xv6等教学内核的关键。基于trap机制,backtrace技术利用栈帧布局回溯函数调用链,成为调试内核崩溃的重要工具;而alarm实验则通过劫持时钟中断,实现用户态定时回调与现场恢复,堪称轻量级信号机制。这些能力广泛应用于调试器、性能分

weixin_33857230的博客 286
上一篇: xv6 risc-v file system 笔记
下一篇: LeetCode 52. N-Queens II
RedemptionC
博客等级 码龄11年 103粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值