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

arm和riscv系统调用对比(笔记)

arm和riscv系统调用对比

  • 时间
  • 背景
  • 环境
  • 一、基础认知
    • ARM
    • RISC-V
  • 二、对比总结

时间

  • 日期:
    2024年9月13日

背景

将riscv芯片移植rt-thread系统,在处理异常时有所感悟,进行整理。

环境

无要求

关键字:SVC, pendSV, ecall, 系统调用对比

一、基础认知

ARM

  • SVC(Supervisor Call)

主要用途: SVC 指令用于从用户模式(非特权模式)切换到内核模式(特权模式),以便执行操作系统提供的系统调用。它触发一个 SVC 异常,处理器跳转到 SVC 异常处理程序。
.
功能: 执行系统调用,处理从用户模式发出的请求。主要用于执行内核服务,通常包括文件操作、进程管理等。

  • PendSV(Pendable Service Exception)

《Cortex-M3权威指南》对PendSV的介绍
PendSV(可悬起的系统调用),它是一种CPU系统级别的异常,它可以像普通外设中断一样被悬起,而不会像SVC服务那样,因为没有及时响应处理,而触发Fault。
.
主要用途: PendSV 异常用于执行任务上下文切换和系统调度。它允许操作系统在后台处理任务调度,以便在不干扰实时任务的情况下进行任务切换。
.
功能: 处理任务调度和上下文切换。当任务需要被切换时,操作系统设置 PendSV 异常为挂起状态,然后在当前中断处理完成后执行 PendSV 异常处理程序来进行任务切换。

PendSV 是 ARM Cortex-M 处理器中用于实现上下文切换的关键机制。无论是通过 SysTick 定时器中断还是通过调用 os_yield 主动请求,最后的任务切换操作都是通过 PendSV 来完成的。PendSV 是一种可以被挂起和延迟执行的中断,确保它只在任务切换时触发。

os_yiled设置上下文切换请求,真正执行上下文切换和压栈,出栈操作的是pendsv

systick和SVC都是通过os_yiled来触发 PendSV,从而进行上下文切换。

任务切换的两种方式

  • 基于 SysTick 的任务切换(时间片轮转):每个任务运行固定的时间片,当 SysTick 中断触发时,系统决定是否要切换任务,如果需要,PendSV 执行任务切换。

  • 基于 os_yield 的任务切换(主动让出):当任务主动调用 os_yield 时,立即触发 PendSV 执行上下文切换,调度器选择下一个任务运行。

如果只依靠 SysTick,任务切换是基于时间片的,任务之间是时间片轮转的调度,没有实时抢占的能力。

如果结合 os_yield,任务可以主动让出 CPU,这样可以在任务完成某些工作后主动切换任务,但这仍然不是真正的抢占。

所以,SysTick 主要用于固定时间片切换,os_yield 则用于任务主动请求的上下文切换。而真正的抢占任务切换,是由任务的优先级和调度机制控制的,PendSV 则是实际执行任务切换的中断。

RISC-V

  • ecall

功能: ECALL 是 RISC-V 架构中的一种指令,用于触发系统调用。当用户态程序需要操作系统提供服务(例如文件操作、设备控制等)时,会执行 ECALL 指令。这会导致控制权转移到操作系统内核,通过异常处理机制处理系统调用。
.
系统调用: ECALL 类似于其他架构中的 syscall 指令,主要用于用户态和内核态的切换,以及在内核中处理系统服务请求。

二、对比总结

相似之处: ecall 和 SVC 都是用于从用户模式切换到内核模式,执行系统调用。它们的作用和使用方式非常相似,都是触发内核级别的处理,以处理用户请求的特权操作。

不同之处: PendSV 是一个用于任务切换的中断机制,与 ecall 和 SVC 的作用不同。PendSV 主要用于上下文切换,而 ecall 和 SVC 是用于请求系统服务的机制。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 线程调优——调整线程池参数提升程序执行效率
  • git-fork操作指南
  • Linux6-vi/vim
  • Snowflake的“AI + 数据” 模式,如何颠覆传统数据处理!
  • 掌握 Flutter 中的 `Overlay` 和 `OverlayEntry`:弹窗管理的艺术
  • 大数据Flink(一百二十二):阿里云Flink MySQL连接器介绍
  • 前端在网络安全攻击问题上能做什么?
  • 计算机四级-计算机网络
  • JIT(即时编译)技术
  • mac新手入门(快捷键)
  • Java原生HttpURLConnection实现Get、Post、Put和Delete请求完整工具类分享
  • 《C++中的资源管理利器:RAII 技术深度剖析》
  • C++ 文件操作
  • 牛客小白月赛101(栈、差分、调和级数、滑动窗口)
  • NFT Insider #148:The Sandbox 推出 SHIBUYA Y3K 时尚系列,Azuki 进军动漫 NFT 领域
  • create-react-app做的留言板
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • java第三方包学习之lombok
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Sass 快速入门教程
  • spring + angular 实现导出excel
  • ucore操作系统实验笔记 - 重新理解中断
  • uva 10370 Above Average
  • VUE es6技巧写法(持续更新中~~~)
  • vue数据传递--我有特殊的实现技巧
  • 测试如何在敏捷团队中工作?
  • 基于HAProxy的高性能缓存服务器nuster
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 浏览器缓存机制分析
  • 使用common-codec进行md5加密
  • 写代码的正确姿势
  • 异常机制详解
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • Java总结 - String - 这篇请使劲喷我
  • Nginx实现动静分离
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​Java基础复习笔记 第16章:网络编程
  • ​补​充​经​纬​恒​润​一​面​
  • #70结构体案例1(导师,学生,成绩)
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (2.2w字)前端单元测试之Jest详解篇
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (C语言)逆序输出字符串
  • (Git) gitignore基础使用
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (二)linux使用docker容器运行mysql
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (附源码)springboot美食分享系统 毕业设计 612231
  • ***详解账号泄露:全球约1亿用户已泄露
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .net core webapi 大文件上传到wwwroot文件夹
  • .net 调用海康SDK以及常见的坑解释
  • .NET 给NuGet包添加Readme