自学内容网 自学内容网

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

时间

  • 日期:
    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 是用于请求系统服务的机制。


原文地址:https://blog.csdn.net/weixin_45061010/article/details/142216226

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!