制作一个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_SYSCALLli      t0, 0xffffffff          # Load the value 0xffffffff into register t0csrw    pmpaddr0, t0           # Write this value to the PMP address register 0li      t0, 0xf                 # Load the value 0xf (binary 1111) into register t0csrw    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.mzph.cn/news/831111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

保存钉钉群直播回放下载:直播回放下载步骤详解

今天,我们就来拨开云雾,揭开保存钉钉群直播回放的神秘面纱。教会你们如何下载钉钉群直播回放 首先用到的工具我全部打包好了,有需要的自己下载一下 钉钉群直播回放工具下载:https://pan.baidu.com/s/1WVMNGoKcTwR_NDpvFP2O2A?p…

ASP.NET Core日志管理(Serilog)

.net 6 web api项目添加日志(Serilog)管理,将日志输出到控制台、文件、数据库 Nuget安装:Serilog.AspNetCore 1、用于日志输出到控制台Serilog.Formatting.Compact 2、用于日志输出到SQLServer数据库Serilog.Sinks.MSSqlServer 3、用于日志输出到文件Serilog.Sinks.RollingF…

pycharm中文件误删或者误操作,怎么恢复

恢复pycharm中文件误删或者误操作 恢复方法:1.xxxx.py文件误删2.xxxx.py文件内操作 在日常学习或练手时总会有一些迷之操作,一些文件被误删或者一些文件越改越糟,想要恢复操作之前的文件。 恢复方法: 1.选则误删文件的上级目录&…

mysql 数据转excel文件

mysql 数据转excel文件 缘由 为售后拉取数据,用navicat太墨迹了,用python写一个main方法跑一下; 1.抽取共同方法,封装成传入mysql,直接下载成excel; 2.写入所有sql语句,传入参数; 代…

Unity ParticleSystem 入门

概述 在项目的制作过程成,一定少不了粒子系统的使用吧,如果你想在项目粒子效果,那这部分的内容一定不要错过喔!我添加了理解和注释更好理解一点! 这次的内容比较多,右侧有目录,可以帮助快速导…

渗透之sql盲注

sql盲注:sql盲注意思是我们并不能在web页面中看到具体的信息,我们只能通过输入的语句的真假来判断。从而拿到我们想要的信息。 我们通常使用ascii值来进行盲注。 目录 手动注入: 脚本注入: 使用sqlmap工具注入: 手…

【面试经典 150 | 分治】排序链表

文章目录 写在前面Tag题目来源解题思路方法一:链表转数组方法二:自顶向下归并排序方法三:自底向上的归并排序 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内…

利用STM32实现语音识别功能

引言 随着物联网和智能设备的普及,语音识别技术正逐渐成为用户交互的主流方式之一。 STM32微控制器具备处理高效率语音识别算法的能力,使其成为实现低成本、低功耗语音交互系统的理想选择。 本教程将介绍如何在STM32平台上开发和部署一个基础的语音识…

Java进阶-Java Stream API详解与使用

本文全面介绍了 Java Stream API 的概念、功能以及如何在 Java 中有效地使用它进行集合和数据流的处理。通过详细解释和示例,文章展示了 Java Stream API 在简化代码、提高效率以及支持函数式编程方面的优势。文中还比较了 Java Stream API 与其他集合处理库的异同&…

【记录】Springboot项目集成docker实现一键部署

公司管理平台完成后,为了方便其他不懂开发的同事部署和测试,集成docker进行一键部署,也为后面自动化部署做准备。本文做个简单记录。 1、安装docker yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/cont…

Ubuntu GUI使用Root用户登录指南

Ubuntu GUI使用Root用户登录指南 一、前言 默认情况下,Ubuntu 禁用了 root 账户,我们必须使用 sudo 命令来执行任何需要 root 权限的任务,比如像这样删除一个系统配置文件(操作危险,请勿尝试):…

是机遇?是未来?拥抱 AI Agent ,拥抱 AI 2.0时代~

✍️ 作者:哈哥撩编程(视频号同名) 博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 🏆 推荐专栏: 🏅 程序员:职场关键角色通识宝…

Devops部署maven项目

这里讲下应用k8s集群devops持续集成部署maven项目的流程。 failed to verify certificate: x509: certificate signed by unknown authority 今天在执行kubectl get nodes的时候报的证书验证问题,看了一圈首次搭建k8s的都是高频出现的问题。 couldn’t get curren…

代码随想录-二叉树(节点)

目录 104. 二叉树的最大深度 题目描述: 输入输出描述: 思路和想法: 111. 二叉树的最小深度 题目描述: 输入输出描述: 思路和想法: 222. 完全二叉树的节点个数 题目描述: ​输入输出描…

Flutter笔记:Widgets Easier组件库(3)使用按钮组件

Flutter笔记 Widgets Easier组件库(3):使用按钮组件 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddre…

IDEA 开发找到 java-web 发布到 tomcat 的路径

使用 IDEA 开发 java web 应用,有没有遇到需要找到 tomcat 路径的问题 为什么要找 tomcat 路径呢? 拿我的项目来举例,有统一的线上线下 logback.xml 配置,配置时业务、框架日志输出到 file,少量的启动日志输出到 con…

mysql从入门到起飞+面试基础题

mysql基础 MySQL基础 企业面试题1 代码 select m.id,m.num from ( select t.id as id,count(1) num from ( select ra.requester_id as id from RequestAccepted raunion all select ra.accepter_id as id from RequestAccepted ra ) t group by t.id ) m group by id ord…

maven插件:dockerfile-maven-plugin和docker-maven-plugin

Maven插件dockerfile-maven-plugin和docker-maven-plugin都是为Java开发人员提供了一种便捷的方式,通过Maven构建流程来自动化创建、管理和推送Docker镜像。虽然它们有着相似的目标,即集成Docker与Maven项目,但这两个插件在实现细节、功能侧重…

ElasticSearch教程入门到精通——第四部分(基于ELK技术栈elasticsearch 7.x新特性)

ElasticSearch教程入门到精通——第四部分(基于ELK技术栈elasticsearch 7.x新特性) 1. Elasticsearch进阶1.1 核心概念1.1.1 索引Index1.1.1.1 索引创建原则1.1.1.2 Inverted Index 1.1.2 类型Type1.1.3 文档Document1.1.4 字段Field1.1.5 映射Mapping1.…

Agent AI智能体:机器学习与自我优化的奇妙之旅

文章目录 📑前言一、Agent AI智能体的基本概念二、Agent AI智能体的技术进步2.1 机器学习技术2.2 自适应技术2.3 分布式计算与云计算 三、Agent AI智能体的知识积累3.1 知识图谱3.2 迁移学习 四、Agent AI智能体的挑战与机遇4.1 挑战4.2 机遇 小结 📑前言…