问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

rCore技术详解:基于Rust语言的RISC-V操作系统开发

创作时间:
作者:
@小白创作中心

rCore技术详解:基于Rust语言的RISC-V操作系统开发

引用
CSDN
1.
https://m.blog.csdn.net/2301_79725204/article/details/143097003

rCore是一个基于Rust语言开发的类Unix操作系统,主要运行在RISC-V架构上。本文将详细介绍rCore的开发过程,包括裸机打印、分时时间轮转、虚拟页表、进程管理、文件系统和多线程等核心功能的实现。

基础环境

QEMU 是一个开源的虚拟化软件,可以模拟多种架构的硬件,使用户能够在不同的平台上运行操作系统和应用程序。在rCore中用到qemu-system-riscv64

BIOS是计算机的固件,负责在启动时初始化硬件并引导操作系统。在rCore中使用RUSTSBI

编译:cargo+riscv64gc-unknown-none-elf(指定平台)

开发步骤

在开源操作系统青训营的第二阶段,对rCore的学习中,写出一个os是循序渐进的

第一步:先脱离标准库限制去打印字符串,裸机打印"hello world"

用到链接脚本(.ld)内核程序加载脚本(.S)RUSTSBI(bootloader)riscv汇编代码

Riscv下的OS代码三模式:M(machine)S(supervisor)U(user)

  • M模式:RUSTSBI实现
  • S模式:各种操作系统功能的底层实现,涉及访问内存硬件资源
  • U模式:应用程序,地址空间与S模式隔离,受错误处理机制监视

entry.S和linker.ld:加载内核到内存中

Rustsbi提供中断和异常的处理,定时器,内存管理等

第二步:实现分时时间轮转运行应用程序

用到switch.S(切换脚本),trap.S(异常处理脚本),懒加载

批处理系统:

  • 在任务队列中加载应用程序
  • 设置任务的状态:运行(running),挂起(ready),退出(exit)
  • 保存当前任务的上下文
  • 切换到下一个任务,放入switch中运行

在这个基础上加每个任务运行最大时间限制就是分时时间轮转了,用到定时器中断

异常处理

  • enable_timer_interrupt函数实现定时
  • Trap_handler实现监督,
  • 超时则挂起当前任务,运行下一个任务
  • Trap_handler
  • 中断处理
  • 程序异常时退出并报错
  • 系统调用

第三步,实现虚拟页表在内存中存储数据

用到SV39,mmu(硬件,辅助虚拟地址转换为物理地址)

  • SV39划分了39位虚拟地址和56位物理地址
  • 39位=vpn0(2^9)+ vpn1(2^9)+ vpn2(2^9)+page_offset(2^12)
  • vpn0, vpn1, vpn2都是虚拟页号,索引到页表
  • 第一级页表包含了第二级页表的地址,
  • 第二级页表包含了第三级页表的地址,
  • 第三级页表包含了映射的物理页号(44位)和页表项(读写权限),
  • 物理页号+页内偏移量为物理地址
  • (在rCore的mm目录中有相应的转换计算和映射处理)

第四步,实现进程管理

  • 虚拟地址的基础上,
  • 任务+内存栈-->进程
  • 实现fork,exec,spawn等系统调用
  • 调度算法采用优先级调度
  • 优先级值越小,步长越大,进程越靠前,越先执行

第五步,实现文件系统

也就是disinode这个结构体索引到具体的数据块

一个块512个字节,可以存放一定数量的索引,被称为索引块,也可以存放数据,被称为数据块

第六步,实现并发(多线程)

也就是将原本的进程中一个个线程单独拎出来,放到列表中执行

这样也就方便对每个线程操控,进行死锁检测

先潦草记一下rCore的大框架,后面有空在细说

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号