首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MIT 6.S081 教材第五章内容 -- 中断与设备驱动--下

浙大操作系统 Lab 1: RV64 内核引导 RISC-V指令集中有一类特殊寄存器CSRs(Control and Status Registers),这类寄存器存储了CPU的相关信息,只有特定的控制状态寄存器指令...OpenSBI:运行在m模式下的一套软件,提供接口给操作系统内核调用,以操作硬件,实现字符输出及时钟设定等工作。 OpenSBI就是一个开源的RISC-V虚拟化二进制接口的通用的规范。...OpenSBI:运行在m模式下的一套软件,提供接口给操作系统内核调用,以操作硬件,实现字符输出及时钟设定等工作。OpenSBI就是一个开源的RISC-V虚拟化二进制接口的通用的规范。...环境调用同步异常ecall:主要在低权限的mode需要高权限的mode的相关操作时使用的,比如系统调用时U-mode call S-mode ,S-mode需要操作某些硬件时S-mode call M-mode...发生异常时的权限模式保存在sstatus[spp],然后设置当前模式为 S模式。 我们处理完中断或异常,并将寄存器现场恢复为之前的状态后,我们需要用sret指令回到之前的任务中。

35940

RISC-V 学习篇之特权架构下的中断异常处理

M 模式运行期间可能发生的同步例外有五种: 访问错误异常: 当物理内存的地址不支持访问类型时发生(例如: 尝试写入 ROM)。...断点异常: 执行 ebreak 指令,或者地址或数据与调试触发器匹配时发生。 环境调用异常: 执行 ecall 指令时发生。 非法指令异常: 译码阶段发现无效操作码时发生。...自定义用途:某些情况下,mtval 寄存器可以由操作系统或处理器实现者自定义,并用于特定目的。这取决于具体的 RISC-V 实现和特权级别。... RISC-V 架构中,mtimecmp 是一个 64 位的计时器比较寄存器,用于与 mtime 寄存器进行比较。mtime 是一个 64 位的计时器寄存器,用于存储系统的时钟计数值。...---- 默认情况下,发生所有异常(不论什么权限模式下)的时候,控制权都会被移交到 M 模式的异常处理程序。但是 Unix 系统中的大多数异常都应该进行 S 模式下的系统调用

2.2K100
您找到你想要的搜索结果了吗?
是的
没有找到

RISC-V 函数调用约定和Stack使用

RISC-V 函数调用约定和Stack使用 引言 MIT 6.S081 2020 操作系统 本文为MIT 6.S081课程第五节重点笔记整理。...我发现最简单的记住它们的方法是: Caller Saved寄存器函数调用的时候不会保存 Callee Saved寄存器函数调用的时候会保存 这里的意思是,一个Caller Saved寄存器可能其他函数重写...假设我们函数a中调用函数b,任何函数a使用的并且是Caller Saved寄存器调用函数b可能重写这些寄存器。...所以基本上来说,任何一个Caller Saved寄存器,作为调用方的函数要小心可能的数据可能的变化; 任何一个Callee Saved寄存器,作为调用方的函数要小心寄存器的值不会相应的变化。...---- 补充 函数调用约定 寄存器约定 ---- 函数跳转和返回指令的编程约定 ---- 调用函数的编程约定 ---- RISC-V 汇编与 C 混合编程 RISC-V 汇编调用 C 函数

65840

MIT 6.S081 (BOOK-RISCV-REV1)教材第四章内容 --Trap -- 上

CPU陷阱期间执行尽可能少量工作的一个原因是为软件提供灵活性; 例如,一些操作系统某些情况下不需要页表切换,这可以提高性能。...为了避免这个问题,xv6中,文件系统初始化推迟到第一个进程创建并开始执行之后。这样,文件系统初始化就在正常的进程上下文中进行,并且可以安全地进行可能会导致进程阻塞或休眠的操作。...由于RISC-V硬件陷阱期间不会切换页表,所以用户页表必须包括uservec(stvec指向的陷阱向量指令)的映射。...系统调用路径保存的用户程序计数器pc上加4,因为系统调用的情况下,RISC-V会留下指向ecall指令的程序指针(返回后需要执行ecall之后的下一条指令)。...因为用户代码调用系统调用封装函数,所以参数最初放置RISC-V C调用所约定的地方:寄存器。 内核陷阱代码将用户寄存器保存到当前进程的陷阱框架中,内核代码可以在那里找到它们。

37620

RISC-V指令集讲解(1)通用寄存器和汇编指令分类

RISC-V通用寄存器和程序计数器 之前的RISC-V简介中主要有 RISC-V 简介(1)RISC-V的由来 RISC-V 简介(2)RISC-V指令集的特点及分类 RISC-V 简介(3)RISC-V...CPU中包含32个通用寄存器,有时候也会被称为通用寄存器文件,如图1所示。通用寄存器的命名方式为X0-X31。其中第一个寄存器X0的值,硬连线到0,因此值永远是0。...其他寄存器X1-X31都是可读可写的。0-31也叫做索引号,索引号也可以理解为寄存器的地址,当指令需要调用通用寄存器时可以通过索引号查找。之后将会在介绍FPGA程序时讲解如何设计读写寄存器文件。...对于32位系统,所有通用寄存器的宽度都是32bit,寄存器总个数也是32个。 PC(program counter)是程序计数器,也是一个寄存器。...CPU中PC寄存器并不和上述32个通用寄存器在一起,寄存器文件中不包含PC。PC的宽度和通用寄存器的宽度一样。XLEN的值一般跟RISC-V CPU架构有关系。

2.9K60

RISC-V 学习笔记:由来、基础整数指令集、汇编语言、特权架构

,例如系统调用。...大量的寄存器减少了寄存器保存和恢复的次数,加速函数调用和返回。... M 模式下运行的 hart 对内存, I/O 和一些对于启动和配置系统来说必要的底层功能有着完全的使用权。 简单的 RISC-V 微控制器仅支持 M 模式。...嵌入式系统中的用户模式和进程隔离 RISC-V 提供了保护系统免受不可信的代码危害的机制,并且为不受信任的进程提供隔离保护。这样的限制很容易实现,只要加入一种额外的权限模式: 用户模式(U 模式)。...每个吉页进一步划分为 29 个巨页。Sv39 中这些巨页大小为 2 MiB,比 Sv32 中略小。每个巨页再进一步分为 29个 4 KiB 大小的基页。

92140

MIT 6.S081 (BOOK-RISCV-REV1)教材第二章内容 -- 操作系统架构

系统调用接口是精心设计的,既为程序员提供了便利,又提供了强隔离的可能性。Unix接口不是抽象资源的唯一方法,但它已经证明是一个非常好的方法。...管理模式下,CPU允许执行特权指令: 例如,启用和禁用中断、读取和写入保存页表地址的寄存器等。...一个进程可以通过执行RISC-V的ecall指令进行系统调用,该指令提升硬件特权级别,并将程序计数器(PC)更改为内核定义的入口点,入口点的代码切换到内核栈,执行实现系统调用的内核指令,当系统调用完成时...而start并非从这样的调用返回,而是执行以下操作:它在寄存器mstatus中将先前的运行模式改为管理模式,它通过将main函数的地址写入寄存器mepc将返回地址设为main,它通过向页表寄存器satp...S (user/initcode.S:1),它通过调用exec系统调用重新进入内核。 正如我们第1章中看到的,exec用一个新程序(本例中为 /init)替换当前进程的内存和寄存器

31420

RISC-V架构系列之1:指令集和特权模式

于是原本x86上完整的KVM拆成了high-visor和low-visor(需要EL2特权能力的部分)两部分。...备注:RISC-V虚拟化规范目前处于0.6草稿状态,未来可能还会有些小的变化。 SBI 了解了RISC-V的特权模式,不同层次的软件调用遵循什么样的规范呢?...(RISC-V中称为hart)等,以及SBI的二进制调用规范。...首先,假设,我们以及有了c语言的运行环境,那我们需要根据SBI定义的二进制调用规范,使用寄存器a7传递指定的extension ID。 ?...根据RISC-V ELF psABI specification的整数寄存器调用约定( 参考链接6 ),我们可以看到寄存器a0用于传递第一个参数。发送一个字符的对应的代码是这个样子 ?

2.6K20

从零手写操作系统之RVOS硬件定时器-05

CLINT位于RISC-V系统中的物理内存地址空间,它是一个全局共享的设备,所有的处理器核心共享和访问。CLINT的作用是为每个处理器核心提供计时器中断和软件中断的控制。...软件中断是由软件代码触发的一种中断请求,用于实现系统调用、任务切换和异常处理等功能。...RISC-V中,mtime寄存器是一个64位的寄存器,可用于测量长时间间隔,通常以时钟周期或计时器滴答数的形式表示。它的精度和计时精度取决于硬件实现和操作系统的支持。...需要注意的是,访问mtime寄存器通常需要特权级别的权限。特权级别较低的用户态,可能无法直接读取或写入mtime寄存器,需要通过系统调用或特权级别切换来访问。...一个基于时钟的系统中,系统时钟会以固定的频率进行振荡,产生一个稳定的时钟信号。这个时钟信号会被用作各种硬件模块和功能的时序控制。 mtime寄存器会根据系统时钟信号的脉冲进行递增。

35530

riscv32 qemu rt-thread的最小移植实现(1)

该工作主要整理底层汇编代码,对芯片的状态进行设置,让其正常执行C代码 3.串口输出rt-thread logo 输出目标:可以看到rt-thread logo正常输出 该工作适配opensbi的服务函数,通过ecall系统调用使用...6.栈帧布局设计 rt-thread中,栈的出和入的顺序十分重要,这里需要非常的清楚。 与操作系统来说,调度器还没开始工作时,线程首先会被压入栈空间中。 ?...每个线程创建的时候,都会将寄存器压入到栈顶,因为目前是S-Mode,所以需要将寄存器进行修改。 将将入栈寄存器还是按照这种方式进行,主要改动的地方如下: ? 另外就是压入: ?...libcpu/risc-v/common/context_gcc.S 也就是将该文件下所有的M-Mode下的寄存器替换成S-Mode下的寄存器即可。 ?...替换完成后,入栈出栈顺序就可以对应上了,然后开始测试代码。 ? OK!此时已经可以看到任务正常的切换了。

1.4K30

MIT 6.S081 (BOOK-RISCV-REV1)教材第四章内容 --Trap -- 中

实际上,有的机器执行系统调用时,会在硬件中完成所有这些工作。但是RISC-V并不会,RISC-V秉持了这样一个观点: ecall只完成尽量少必须要完成的工作,其他的工作都交给软件完成。...根据触发trap的原因,RISC-V的SCAUSE寄存器会有不同的数字。数字8表明,我们现在在trap代码中是因为系统调用。...XV6会在处理系统调用的时候使能中断,这样中断可以更快的服务,有些系统调用需要许多时间处理。中断总是会被RISC-V的trap硬件关闭,所以在这个时间点,我们需要显式的打开中断。...我们希望用户程序Shella0寄存器中看到系统调用的返回值。所以,trapframe中的a0寄存器现在是系统调用的返回值2。...或者更严格的说,是从触发了系统调用的write库函数中返回到Shell中。 小结 最后总结一下,系统调用刻意设计的看起来像是函数调用,但是背后的user/kernel转换比函数调用要复杂的多。

28140

CPU自制入门

这就像是你开发应用程序的时候就不用直接去写驱动物理硬件的代码,而是直接调用Windows提供的API就行了。...目前,IP 核已经变成系统设计的基本单元,并作为独立设计成果交换、转让和销售。 从IP核的提供方式上,通常将其分为软核、固核和硬核这3类。...OpenRISC更多的时候认为是一个开源的Core,而非一种优美的指令集架构。此外,OpenRISC的许可证为GPL,这意味着所有的指令集改动都必须开源(而RISC-V则无此约束)。...这种寄存器窗口的架构,由于可以切换不同的寄存器组快速地响应函数调用与返回,因此,能够产生非常高的性能,但是这种架构由于功耗面积代价太大,而并不适用于PC与嵌入式领域处理器。...感兴趣的读者请在网络上自行搜索文章《再见SPARC处理器,再见Sun》 0.3 名校优生——RISC-V 关于RISC-V伯克利大学诞生的经历,在此不做重复赘述。

99430

MIT_6.s081_Information2:Trap&Syscall

MIT_6.s081_Information2:Trap&Syscall 于2022年3月10日2022年3月10日由Sukuna发布 中断和系统调用 RISC-V中有三种事件会使得CPU放弃对当前执行的程序的运行转而去处理这些事件...对于RISC-V的处理中,主要是内核态空间和用户态空间都维持了页表,但是RISC-V的硬件并没有中断发生的时候硬件的层面上更换页表,所以说xv6操作系统需要在处理中断的时候把页表替换成内核的页表,并且这个内核的页表可以与...其实内核可以修改trapframe中的寄存器值,中断结束后再把栈帧的值加载到真实的寄存器中. 调用系统函数....syscall()函数中,我们可以知道这个函数根据a7寄存器表示的系统调用号来找到函数指针然后进行调用,这里构思很巧妙,就是构建系统调用函数指针来进行跳转....系统调用会传递参数进入,对于RISC-V来说,朴素的思想就是把参数传递到寄存器中,然后系统调用函数读取存储寄存器中的数据,比如说argint和atgaddr,argfd等.

42230

拓展 | Rust语言嵌入式领域的应用

RISC-V上,“SBI”就是这样的运行环境。它除了引导启动内核,还将常驻后台,提供操作系统需要的实用功能。...RISC-V标准中,“SBI”意味着“操作系统二进制接口”,运行在其上的操作系统会通过环境调用“ecall”指令,陷入到二进制接口的实现中,由其调用具体硬件的实现功能。...开发Rust语言的操作系统内核,可以统一编译工具链。另外,RustSBI已经RISC-V组织收录入RISC-V SBI标准,它的实现编号为4。...如果RISC-V芯片实现提供特定的兼容性外设,比如这个外设能拦截特定CSR寄存器的访问指令,就可以功能修改的寄存器访问时,产生一个可供软件捕获的中断。...或许,我们未来升级RISC-V上的操作系统,只需要更换硬件中的RustSBI固件,就能完美兼容最新标准的操作系统了。升级原有系统的硬件也非常容易,替换RustSBI固件就能达到升级效果。

1.8K30

MIT 6.S081 Lab Four -- Trap

MIT 6.S081课程前置基础参考: 基于RISC-V搭建操作系统系列 ---- traps 本实验探索如何使用陷阱实现系统调用。您将首先使用栈做一个热身练习,然后实现一个用户级陷阱处理的示例。...RISC-V的使用手册参考页上。以下是您应该回答的一些问题(将答案存储answers-traps.txt文件中): 哪些寄存器保存函数的参数?...例如,main对printf的调用中,哪个寄存器保存13? a0-a7中存放参数,13存放在a2中 ---- main的汇编代码中对函数f的调用在哪里?...调用。...要解决此问题,必须确保完成报警处理程序后返回到用户程序最初计时器中断的指令执行。必须确保寄存器内容恢复到中断时的值,以便用户程序报警后可以不受干扰地继续运行。

22330

从零手写操作系统之RVOS抢占式多任务实现-06

从零手写操作系统之RVOS抢占式多任务实现-06 本系列参考: 学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春 整理而来,主要作为xv6操作系统学习的一个前置基础。...RVOS是本课程基于RISC-V搭建的简易操作系统名称。...先前特权架构下的中断异常处理篇中介绍过,RISC-V系统启动时,默认是处于machine态下的,并且发生trap时,RISC-V会使用mstatus.MPP位来保存进入trap前的特权级别,并更改当前特别级别为...,也就是本节开始,改为通过start.s汇编文件中设置MPIE位为1,然后操作系统初始化工作结束后,调用schedule函数,让其调度1号任务执行,schedule函数内部会调用switch_to...,也就是swtich_to函数进行任务切换的时候,如果切换的任务是第一次进行调用,我们必须在任务创建的时候设置好他的mepc寄存器,否则switch_to函数将无法通过任务上下文空间中保存的mepc

29440

从零手写操作系统之RVOS系统调用实现-09

从零手写操作系统之RVOS系统调用实现-09 本系列参考: 学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春 整理而来,主要作为xv6操作系统学习的一个前置基础。...RVOS是本课程基于RISC-V搭建的简易操作系统名称。...由于mstatus的MPP位默认为0,所以我们只需要在start.s汇编文件中,去掉对MPP位的设置即可: 当switch_to第一次手动调用时,执行mret指令,该指令将MPP保存的特权级恢复为当前特权级别...,称为系统调用号,系统调用系统中存放于a7寄存器中。...虽然系统调用传参规则由不同的系统自己决定,但是也要遵循RISC-V函数传参规范 系统调用本质也是一个函数,也需要有参数,但是不同的系统调用需要的参数个数未必一样,所以我们这里规定系统调用参数使用寄存器范围在

24730

听GPT 讲Rust源代码--compiler(25)

返回值处理:针对不同类型的返回值,定义了对应的处理方式,例如通过寄存器返回,或者通过栈传递返回值。 寄存器的使用约定:定义了函数调用期间哪些寄存器是可变的、可使用的,并且规定了对寄存器使用的约束。...该文件实现了rustc_target::abi::call::FnAbi trait,该trait定义了函数的参数和返回值函数调用期间如何传递、如何编码和解码等细节。...该结构体包含了一些字段和方法,用于定义函数调用期间如何操作参数和返回值的。...这些结构体和枚举类型的定义Rust编译器的RISC-V函数调用实现中起到了非常重要的作用。...传递给函数的参数已经栈上存储为指定大小的内存块,此函数的目标是将这些参数从栈上加载到寄存器,以便在函数中进行访问和操作。

12510
领券