制作一个RISC-V的操作系统十六-系统调用

文章目录

  • 用户态和内核态
  • mstatus设置
  • 模式切换
  • 核心流程
  • 封装
  • 代码
    • 背景解释
    • 代码示例解析
    • 解释
    • 目的

用户态和内核态

在这里插入图片描述

mstatus设置

此时UIE设置为1和MPIE为1,MPP设置为0
代表当前权限允许UIE中断发生,并且在第一个mret后将权限恢复为用户态,同时MIE也保持开启
在这里插入图片描述

模式切换

ecall相当于一次触发异常,然后在对应的异常中去处理对应的系统调用
在这里插入图片描述

核心流程

  • 首先在进程中使用到gethartid函数
  • gethartid函数保存a7寄存器为调用号,然后ecall进行系统调用,ret再回到调用gethartid函数的下一条地址
  • ecall会触发中断进入trap_vector,此时的mepc是ecall地址,mecause是8
  • trap_vector会保存当前上下文,然后增加一个指向保存了的上下文的地址作为trap_hander的第三个参数,trap_hander结束后会将返回值写到mepc中,然后mret到mepc对应的位置,此时是ecall+4的地址
  • trap_hander中会执行syscall函数,参数是传入的之前刚开始保存了的上下文,然后syscall函数中的会对该上下文的a0寄存器赋值为hart的id
  • 此时,回到最后恢复保存的上下文的地方,也就是trap_vector那里,恢复上下文后,此时返回值正好是hart的id,然后mepc也被选择到了ecall+4,那么返回到上一级为gethartid的ret函数,此时返回值也是hart的id,即得到hartid
    在这里插入图片描述
    原则a6其实也可以作为参数
    在这里插入图片描述

封装

就是用户态使用的函数用到的头文件和内核态使用的函数用到的头文件建议分别封装到各个文件中,在用户态中的作为C库,内核态中的内核维护,如果头文件相关定义不一致可能会出现问题
在这里插入图片描述

代码

https://github.com/FULLK/risllkos/tree/main/Fullkenerl11

#ifdef CONFIG_SYSCALL
    li      t0, 0xffffffff          # Load the value 0xffffffff into register t0
    csrw    pmpaddr0, t0           # Write this value to the PMP address register 0
    li      t0, 0xf                 # Load the value 0xf (binary 1111) into register t0
    csrw    pmpcfg0, t0             # Write this value to the PMP configuration register 0
#endif

背景解释

在RISC-V架构中,PMP(Physical Memory Protection)是用于控制不同特权级别访问内存的能力的一个特性。它通过一系列配置寄存器(PMP配置寄存器如pmpcfg0)和地址寄存器(PMP地址寄存器如pmpaddr0)来定义内存区域的访问权限(读、写、执行)以及哪些特权模式可以访问这些区域。

代码示例解析

假设你正在开发一个RISC-V的操作系统,并且使用QEMU作为模拟器来测试你的代码。当你升级到QEMU 6.0及以上版本时,遇到了一个与PMP配置相关的问题:如果没有设置任何PMP条目,从Supervisor (S) 或 User (U) 模式进行的内存访问会导致异常。

解释

  • li t0, 0xffffffff: 这行代码将寄存器t0赋值为0xffffffff,这个值在32位地址空间中代表一个非常大的地址(几乎接近地址空间的最大值)。按照标准,这个值本意是用来设置PMP条目的上界地址,但由于一些QEMU实现细节,将其设置为全1时可能被解释为覆盖整个地址空间的特殊情况。

  • csrw pmpaddr0, t0: 此指令将寄存器t0的值写入到PMP地址寄存器0(pmpaddr0),试图设置PMP的第一个条目覆盖整个地址空间的访问权限。

  • li t0, 0xf: 这行代码设置寄存器t0为0xf,二进制形式为1111。在PMP配置中,每个位对应一个PMP条目的访问权限(读、写、执行),因此0xf意味着开启所有权限。

  • csrw pmpcfg0, t0: 最后,这行代码将寄存器t0的值写入到PMP配置寄存器0(pmpcfg0),激活了第一个PMP条目并设置了读、写、执行的权限。

目的

这段代码的主要目的是作为临时解决方案,确保即使在没有详细配置PMP条目的情况下,用户和监督模式下的程序也能正常访问内存,以避免在使用QEMU 6.0及以上版本时遇到的异常问题。它通过配置一个PMP条目来覆盖整个地址空间,并赋予所有访问权限,从而绕过了新版本QEMU对未配置PMP条目的严格检查。

在RISC-V架构中,PMP(Physical Memory Protection,物理内存保护)机制通过一系列配置寄存器来控制对物理内存的访问权限,以此增强系统的安全性。PMP寄存器分为地址寄存器(如pmpaddrN)和配置寄存器(如pmpcfgN),共同定义了多个内存访问控制区域。

当说“试图设置PMP的第一个条目覆盖整个地址空间的访问权限”时,这指的是通过编程PMP的地址和配置寄存器来创建一个PMP规则,这个规则旨在允许对整个物理地址空间执行读、写和执行操作,而不受任何访问限制。具体到代码示例:

  • li t0, 0xffffffff:这一行是装载指令,将立即数0xffffffff(即32位地址空间中的最大值减一)送入寄存器t0。在TOR(Top of Range)匹配模式下,PMP地址寄存器中的值通常表示区间的上界地址。理论上,全1的上界地址可能被解释为企图涵盖整个地址空间的意图,尽管实际上因为地址对齐和边界处理,它可能无法精确覆盖到地址空间的最后一个字节。

  • csrw pmpaddr0, t0:这条指令将t0寄存器中的值写入到PMP地址寄存器0(pmpaddr0),试图设置PMP的第一个条目的上界地址。

  • li t0, 0xfcsrw pmpcfg0, t0:这两行是配置PMP条目的权限。0xf(十六进制)等于二进制的1111,分别代表了读®、写(W)、执行(X)和开启(L)权限位。通过写入到pmpcfg0,为PMP条目0设置了全权限。

然而,根据RISC-V的PMP规范,单个PMP条目通常不能直接覆盖整个地址空间,特别是在TOR模式下,pmpaddr0寄存器存储的是第一个区间的上界物理地址的高32位,即使设置为全1,也无法完美覆盖到地址空间的最末尾。而且,如之前讨论中提及的,QEMU的特定实现方式可能使得pmpaddr0 = 0xffffffff在某些情境下被特殊处理,看似覆盖了整个地址空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/581056.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

易错知识点(学习过程中不断记录)

快捷键专区: 注释:ctrl/ ctrlshift/ 保存:ctrls 调试: 知识点专区: 1基本数据类型 基本数据类型有四类:整型、浮点型、字符型、布尔型(Boolean), 分为八种&#xff…

UE5 GAS开发P40 周期性效果,持续治疗

Periodic Gameplay Effects周期性的游戏效果 它们在一段时间内以固定的间隔重复应用到目标上。这种效果通常用于表示持续性伤害、治疗或其他影响,例如中毒、灼烧或回复效果。 修改GE_CrystalHeal,在Period改为每0.1秒执行一次 假如同时有三个持续时间在进行,那么这…

STM32与OLED显示屏通信(四针脚和七阵脚)

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. 单片机调试 2. OLED简介 3. 接线 4. OLED驱动函数 4.1 四针脚版本 OLED.c OLED.h OLED_Font.h 4.2 七针脚版本 引脚连接 OLED.c OLED.h OLED_Font.h 5. 主函数 工程文件模板 1. 单片机…

linux下安装deepspeed

安装步骤 一开始安装deepspeed不可以使用pip直接进行安装。 这时我们需要利用git进行clone下载到本地: git clone https://github.com/microsoft/DeepSpeed.git 进入到deepspeed的安装目录下 cd /home/bingxing2/ailab/group/ai4agr/wzf/Tools/DeepSpeed 激活…

verilog 从入门到看得懂---matlab 自动生成verilog

matlab 的强大不用多说,以前经常用simulink 生成c,最近尝试用simulink进行了verilog的生成,方法也很简单。 一个简单的示例如下。 1,新建一个模型文件,并且根据需要进行模型搭建 2.配置HDL生成模块 3.点击 generation…

纯血鸿蒙APP实战开发——全局状态保留能力弹窗

全局状态保留能力弹窗 介绍 全局状态保留能力弹窗一种很常见的能力,能够保持状态,且支持全局控制显隐状态以及自定义布局。使用效果参考评论组件 效果图预览 使用说明 使用案例参考短视频案例 首先程序入口页对全局弹窗初始化,使用Globa…

Linux学习之路 -- 进程篇 -- 自定义shell的编写

前面介绍了进程程序替换的相关知识&#xff0c;接下来&#xff0c;我将介绍如何基于前面的知识&#xff0c;编写一个简单的shell&#xff0c;另外本文的所展示的shell可能仅供参考。 目录 <1>获取用户的输入和打印命令行提示符 <2>切割字符串 <3>执行这个…

qt-C++笔记之滑动条QSlider和QProgressBar进度条

qt-C笔记之滑动条QSlider和QProgressBar进度条 —— 2024-04-28 杭州 本例来自《Qt6 C开发指南》 文章目录 qt-C笔记之滑动条QSlider和QProgressBar进度条1.运行2.阅读笔记3.文件结构4.samp4_06.pro5.main.cpp6.widget.h7.widget.cpp8.widget.ui 1.运行 2.阅读笔记 3.文件结构…

智慧供热一站式热网平衡多功能集成系统

供热管理地域分散的现实&#xff0c;决定必须采用先进技术手段开发软件系统&#xff0c;使各管理单位互联互通。在多年技术积累的基础上&#xff0c;公司采用目前成熟而且领先的技术架构&#xff0c;研发了适用于多个组织机构集中式管理的供热管理软件。使管理在技术上不再受地…

经典的目标检测算法有哪些?

一、经典的目标检测算法有哪些&#xff1f; 目标检测算法根据其处理流程可以分为两大类&#xff1a;One-Stage&#xff08;单阶段&#xff09;算法和Two-Stage&#xff08;两阶段&#xff09;算法。以下是一些经典的目标检测算法&#xff1a; 单阶段算法: YOLO (You Only Loo…

Java集合框架-Collection-queue

目录 一、Deque二、ArrayDequeArrayDeque层次结构图ArrayDeque概述ArrayDeque底层数据结构ArrayDeque常用方法(简略) 三、PriorityQueuePriorityQueue层次结构图PriorityQueue概述PriorityQueue 底层数据结构PriorityQueue常用方法(详细) Java里有一个叫做Stack的类&#xff0c…

[tkinter实现]汉字笔顺小软件

软件简介 本软件旨在帮助小学生通过互动式学习掌握汉字的基本笔画和笔顺。软件采用Tkinter库构建&#xff0c;提供了一个用户友好的图形界面&#xff0c;适合小学生使用。 主要功能&#xff1a; 汉字展示&#xff1a;软件能够展示单个汉字&#xff0c;并以动画形式演示其标准…

SAP SALV研究

1.SALV SALV用的是类cl_salv_table下的相关方法,一般用于对话框或者功能要求比较简单的数据显示,比如明细数据显示,不能单元格编辑或者某行某列编辑,可以实现全部数据编辑(实用性不强),如要实现编辑可参考这篇博文 https://mp.weixin.qq.com/s?__biz=MzU1MDAzMDY3MQ==…

车载系统的 加减串器应用示意

overview 车载系统上使用加减串器来实现camera&#xff0c; led液晶显示屏等 图像数据的远距离传输&#xff0c;将原先在短距离传输视频信号的mipi csi&#xff0c;dsi 等的TX&#xff0c;RX中间&#xff0c;插入加减串器&#xff0c;实现长距离的可靠传输。 示意图如下 往往…

开发 Chrome 浏览器插件入门

前言 简介 Chrome 插件是扩展 Chrome 浏览器的功能的软件程序。它们可以执行各种任务&#xff0c;例如阻止广告、增强隐私、添加新功能等等。 要开始编写 Chrome 插件&#xff0c;你需要掌握以下&#xff1a; 1.JavaScript语言 2.html 3.css 4.会使用chrome扩展开发手册…

C#设计树形程序界面的方法:创建特殊窗体

目录 1.TreeView控件 2.实例 &#xff08;1&#xff09;Resources.Designer.cs &#xff08;2&#xff09;Form1.Designer.cs &#xff08;3&#xff09;Form1.cs &#xff08;4&#xff09;生成效果 以树形来显示程序的菜单&#xff0c;可以更直观、更快捷地对窗体进行…

PostgreSQL大版本如何升级?

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

算法训练营day25

零、回溯算法理论 参考链接13.1 回溯算法 - Hello 算法 (hello-algo.com) 1.尝试与回退 之所以称之为回溯算法&#xff0c;是因为该算法在搜索解空间时会采用“尝试”与“回退”的策略。当算法在搜索过程中遇到某个状态无法继续前进或无法得到满足条件的解时&#xff0c;它会…

vue使用海康控件开发包——浏览器直接查看海康监控画面

1、下载控件开发包 2、安装插件&#xff08;双击/demo/codebase/HCWebSDKPlugin.exe进行安装&#xff09; 3、打开/demo/index.html文件 4、在页面上输入你的海康监控的登录信息进行预览 如果有监控画面则可以进行下面的操作 注意&#xff1a;以下操作都在Vue项目进行 5、复…

【Unity】shader中参数传递

1、前言 unity shader这个对于我来说是真的有点难&#xff0c;今天这篇文章主要还是总结下最近学习到的一些东西&#xff0c;避免过段时间忘记了&#xff0c;可能有不对&#xff0c;欢迎留言纠正。 2、参数传递的两种方式 2.1 语义传递 语义传递这个相对来说是简单的 shad…
最新文章