riscv操作系统记录(一)

发布于:2025-06-10 ⋅ 阅读:(24) ⋅ 点赞:(0)

本文宗旨是为riscv开发一个简易的操作系统内核做好准备的总结文档,水平大概是入门一个月的初学者的记录,大部分内容是对照实例和书籍,我会尽力保证正确性,有任何问题,请您指出,谢谢。

riscv指令集

指令集就是这种计算机架构下能够读懂的机器指令的集合。

riscv指令集是可选可拓展的一种指令集。模块化,开源都是它的优点。RV32I是最小的指令集(针对32位处理器)。这里的I代表的是基础整型指令集。

较为特殊的是C指令集和G。riscv指令集无论是RV32I还是RV64I,指令都为32位,而C代表的为压缩的指令集,适配16位系统,使用的指令为16位,也就是半个字。G则代表IMAFD即五个指令集。

【RISC-V操作系统】从零开始写一个操作系统(二)RISC-V ISA介绍与学习_riscv操作系统_IOT.FIVE.NO.1的博客-CSDN博客

riscv系统架构

riscv给在该架构上的系统或者程序提供的几种模式:机器模式,特权模式,用户模式,每个模式有各自的能操作的寄存器和各自的作用。具有虚拟化拓展时会将特权模式拓展为HS,VS,VU模式,也就是分别用来运行虚拟化管理程序,运行虚拟机操作系统内核,运行虚拟机应用程序。M模式必须提供,所有硬件都必须提供M模式。

SBI:管理员二进制接口。

ABI:应用程序二进制接口

EEI:执行环境接口

三者的关系是eei指的就是一个程序运行所在的一切环境相关的,由硬件或者操作系统直接或间接提供的接口。ABI和SBI都是EEI。

SBI就是作为机器模式下运行的程序提供给操作系统访问硬件资源的接口也就是是管理员的二进制接口,ABI则是操作系统上提供给应用程序的二进制接口。包括一些调用的约定比如函数返回,栈的清理,具体的内容可以自行百科。

SBI是riscv独有的概念,这个需要注意。非常类似于操作系统中的系统调用层,它为运行在s模式的操作系统提供服务。操作系统则为应用程序提供系统调用服务。

HART:类似与对cpu的抽象,相当于一个能够接受指令流的核心。

通用寄存器:riscv体系结构内有的一组通用寄存器,据我所知,数量可能是32个或者64个。每个寄存器有自己的作用,但注意这些寄存器要区别于其他的特殊寄存器,也就是下面的说的系统控制和状态寄存器。

M模式下,S模式下,U模式下的系统寄存器。CSR指令可以访问这些寄存器,前提是目前的指令流运行在对应模式下。该命令找到对应寄存器的方法其实就是对寄存器进行了编码。

如图中的CSR部分就是对某一个系统寄存器的编码。 

riscv程序及操作系统编写之源

现在我要在riscv体系的一个设备上写程序,我该怎么办呢?

答案很清晰,去学习它的指令集,然后知道怎么控制各个寄存器,完成运算,读写内存。把它们按照一定规则排列,写在一个文件里,这就是第一个程序:汇编程序。

如果有些操作是需要反复去做,却只有一部分值或者参数发生改变,而且随着代码量增大,想要利用旧代码的成本变高,如果是一个人开发倒是还可以自己一点点磨,但是对于一个大型的工程来说就会显得效率太低,这时我们就需要使用一种抽象的方式来控制我们的硬件,虽然会多一层抽象就会损耗一部分转换的性能,但是这一层抽象的好处绝对大于坏处。这里我肯定是说不明白留给大家自己理解。

抽象的一个好处就是应用程序一定程度上不用关心底层的硬件的分配和调用了。

riscv的汇编语言如何编写其实还取决于你使用的汇编器也就是将汇编语言转化为机器指令的工具,在我所学的版本(gnu工具链):

label:
    operation #comment


举个例子
.section .text  #注释在此处

_start:
    li x5, 10

 也就是说学习了汇编语言之后就可以编写程序了,但是这段程序怎么运行,在哪里运行,何时运行还需要其他知识的辅助。

我们要调试自己的程序,首先让它运行起来,要做的就是知道硬件的工作方式,硬件启动时会在哪里开始执行第一条指令,硬件有几个hart。对于实验来说我们一般是在模拟程序qemu中使用一个编号为0的hart来执行我们的程序(指令流)。

riscv程序实验环境

sudo apt install build-essential gcc make perl dkms git gcc-riscv64-unknown-elf gdb-multiarch qemu-system-misc

在前人的基础上,要搭建一个实验环境是相当简单的,但是想要这个环境是适合你的,或者你想做一些自己的独特工作,这就需要付出一些努力。qemu模拟的一块通用RISCv开发板是适合我们初学者的一个平台。该模拟开发板的信息也可以轻松查到。

所需要安装的是上面语句里的:qemu-system-misc

build-essential则是针对c/c++的程序编写来的依赖,因为我们很难完全使用汇编完成一个大型程序的编写,那太复杂也太过于迟缓。有时候开发效率要比运行效率重要的多。

gcc就比较常见了,就是gnu工具链中的编译器。C语言通过它变成汇编。

make是一个自动化执行的工具,具体的用处就是根据makefile文件来对你的文件执行一组操作,像它的名字make一样,避免了每一次都要自己重新组装自己的工程。

gdb则是一个调试器,具体使用看文档或者自行百度即可。

我的建议是学习什么课程就去配置和老师一样的环境,否则如果因为环境影响了自己的学习效率实在是浪费生命。

记录时间:2024年。。。先发出来