首页 > 其他分享 >RTL:trap.s的处理

RTL:trap.s的处理

时间:2024-12-17 17:20:07浏览次数:8  
标签:函数 处理 RTL sp a0 trap OFFSET 上下文

在进行pa4:多道程序的处理时,其中一道题目除了要完成kcontext,还需要对应修改trap.s的__asm_trap函数。使得中断响应机制能正确切换不同进程的上下文,在kocontext已经修改好以后,要修改这里其实也很容易。

__am_asm_trap:
  addi sp, sp, -CONTEXT_SIZE

  MAP(REGS, PUSH)

  csrr t0, mcause
  csrr t1, mstatus
  csrr t2, mepc

  STORE t0, OFFSET_CAUSE(sp)
  STORE t1, OFFSET_STATUS(sp)
  STORE t2, OFFSET_EPC(sp)

  mv a0, sp   #传入当前上下文
  jal __am_irq_handle   #中断处理函数会返回新上下文指针

  LOAD t1, OFFSET_STATUS(sp)
  LOAD t2, OFFSET_EPC(sp)
  csrw mstatus, t1
  csrw mepc, t2

  MAP(REGS, POP)

  addi sp, sp, CONTEXT_SIZE
  mret

这个函数的入口会被存在mtvec这个csr寄存器里,在执行ecall指令时就会跳转执行。函数里,首先是处理了三个csr寄存器,然后传入当前上下文,并进入cte.c的am_irq_handle函数,这个函数又会调用cte_init里注册的回调函数,调用结束后,恢复现场,继续执行。但是要实现多道程序,就要做到多个程序的上下文切换,要处理其实也很简单。不管是riscv32还是32e,都可以通过a0寄存器传递参数。在kcontext里,我们设置a0储存参数。按照原本的asm_trap函数,我们将sp赋值给a0寄存器,然后进入服务和回调函数,但是离开后,却没有继续处理a0,想要实现多道程序,只需要增加一句mv sp,a0即可。

标签:函数,处理,RTL,sp,a0,trap,OFFSET,上下文
From: https://www.cnblogs.com/namezhyp/p/18613018

相关文章

  • 实验6 模板类、文件I/O和异常处理
    实验内容4Vector.hpp1#pragmaonce2#include<iostream>3#include<stdexcept>45usingnamespacestd;67template<typenameT>89classVector{10private:11intsize;12T*ptr;1314publi......
  • 实验6 模板类、文件I/O和异常处理
    任务4Vector.hpp1#pragmaonce23#include<iostream>4#include<stdexcept>56usingnamespacestd;78template<typenameT>9classVector{10public:11Vector(intn,Tvalue=0);12~Vector();13......
  • 实验6 模板类、文件I/O和异常处理
    实验任务4:代码:Vector.hpp查看代码#pragmaonce#include<iostream>#include<stdexcept>usingnamespacestd;template<typenameT>classVector{public:Vector(intsize);Vector(intsize,Tvalue);Vector(constVector<T>&......
  • 实验6 模板类、文件I\O和异常处理
    任务4源码:1#pragmaonce23#include<iostream>4#include<stdexcept>56usingnamespacestd;78//模板类声明9template<typenameT>10classVector{11public:12Vector(intn):size{n}{13if(n<0)14......
  • LiteGBS国标GB28181视频平台服务器添加存储池失败,如何处理?
    从技术发展趋势来看,人工智能与视频监控的结合将更加紧密。在未来,LiteGBS国标GB28181设备管理软件将进一步整合人工智能技术,实现智能识别、行为分析等功能。例如,在智能安防领域,通过对监控画面的实时分析,能够自动识别异常行为并及时发出告警,提高安防效率。那么当用户遇到服务器添......
  • 实验6 模板类、文件I/O和异常处理
    实验任务4代码Vector.hpp1#pragmaonce2#include<iostream>3#include<stdexcept>45template<typenameT>6classVector{7public:8//构造函数9Vector(intsize);10Vector(intsize,Tvalue);11Vector(constV......
  • 五种处理找不到vcruntime140.dll的方法,分析vcruntime140.dll错误原因
    当您在运行某个应用程序或游戏时遇到提示“找不到vcruntime140.dll”,这通常意味着系统中缺少了VisualC++RedistributableforVisualStudio2015或更高版本的一个重要组件。这个错误通常发生在运行某些程序时,系统无法找到所需的动态链接库文件。小编将介绍五种处理找不到vcr......
  • uniapp中引入组件无法触发组件中生命周期函数处理
    uniapp中引入组件无法触发组件中生命周期函数处理&AI能帮上忙吗?前言一.为何无法触发组件生命周期二.uniapp的生命周期1.页面生命周期函数示例:页面生命周期函数2.组件生命周期函数组件生命周期函数:示例:组件生命周期函数3.App生命周期函数App生命周期函数:示例:Ap......
  • 流处理引擎Flink
    Flink概述ApacheFlink是一个开源的流处理框架,它具有高吞吐、低延迟、容错性强等诸多优秀的特性。Flink的核心是一个提供数据分发、通信以及自动容错的流计算引擎。它可以处理有界(批处理)和无界(流处理)的数据,并且在流处理方面表现得尤为出色。Flink的设计理念是将批处理看作是一......
  • PHP中处理html相关函数集锦
    1、html_entity_decode() 函数把 HTML 实体转换为字符。Html_entity_decode() 是 htmlentities() 的反函数。例子:<?Php$star=”& ‘”;echo $str=html_entity_decode($star);?>(浏览器其实可以自动识别这样的代码,只要你输出的是html实体,浏览器会自动识别的)2、htmls......