[rCore学习笔记 014]批处理系统
写在前面
本随笔是非常菜的菜鸡写的。如有问题请及时提出。
可以联系:1160712160@qq.com
GitHhub:https://github.com/WindDevil (目前啥也没有
本章目的
- 保障系统安全
- 多应用支持
本章需要实现的新功能
- 构造包含操作系统内核和多个应用程序的单一执行程序
- 通过批处理支持多个程序的自动加载和运行
- 操作系统利用硬件特权级机制,实现对操作系统自身的保护
- 实现特权级的穿越
- 支持跨特权级的系统调用功能
本章的宗旨和思想
操作系统历史上最伟大的想象力飞跃之一是计算机可能通过软件来安排自己的工作负荷的想法
本章我们的目标让泥盆纪“邓式鱼”操作系统能够感知多个应用程序的存在,并一个接一个地运行这些应用程序,当一个应用程序执行完毕后,会启动下一个应用程序,直到所有的应用程序都执行完毕。

实践体验
同样是运行们在上一章clone到的代码,之前是储存在了/home/winddevil/App/rCore-Tutorial-v3,这里的winddevil是我的用户名,要更改成你的用户名,使用指令转到这个文件夹:
cd /home/winddevil/App/rCore-Tutorial-v3
使用git指令切换分支,切换到第二章的源码
git checkout ch2
运行源码,实际上这段指令的意思是进入os文件夹,编译并且运行:
cd os
make run
运行结果:
[rustsbi] RustSBI version 0.3.1, adapting to RISC-V SBI v1.0.0
.______ __ __ _______.___________. _______..______ __
| _ \ | | | | / | | / || _ \ | |
| |_) | | | | | | (----`---| |----`| (----`| |_) || |
| / | | | | \ \ | | \ \ | _ < | |
| |\ \----.| `--' |.----) | | | .----) | | |_) || |
| _| `._____| \______/ |_______/ |__| |_______/ |______/ |__|
[rustsbi] Implementation : RustSBI-QEMU Version 0.2.0-alpha.2
[rustsbi] Platform Name : riscv-virtio,qemu
[rustsbi] Platform SMP : 1
[rustsbi] Platform Memory : 0x80000000..0x88000000
[rustsbi] Boot HART : 0
[rustsbi] Device Tree Region : 0x87000000..0x87000f02
[rustsbi] Firmware Address : 0x80000000
[rustsbi] Supervisor Address : 0x80200000
[rustsbi] pmp01: 0x00000000..0x80000000 (-wr)
[rustsbi] pmp02: 0x80000000..0x80200000 (---)
[rustsbi] pmp03: 0x80200000..0x88000000 (xwr)
[rustsbi] pmp04: 0x88000000..0x00000000 (-wr)
[kernel] Hello, world!
[kernel] num_app = 5
[kernel] app_0 [0x8020b038, 0x8020c330)
[kernel] app_1 [0x8020c330, 0x8020d6d0)
[kernel] app_2 [0x8020d6d0, 0x8020ec48)
[kernel] app_3 [0x8020ec48, 0x8020ffd0)
[kernel] app_4 [0x8020ffd0, 0x80211350)
[kernel] Loading app_0
Hello, world!
[kernel] Application exited with code 0
[kernel] Loading app_1
Into Test store_fault, we will insert an invalid store operation...
Kernel should kill this application!
[kernel] PageFault in application, kernel killed it.
[kernel] Loading app_2
3^10000=5079(MOD 10007)
3^20000=8202(MOD 10007)
3^30000=8824(MOD 10007)
3^40000=5750(MOD 10007)
3^50000=3824(MOD 10007)
3^60000=8516(MOD 10007)
3^70000=2510(MOD 10007)
3^80000=9379(MOD 10007)
3^90000=2621(MOD 10007)
3^100000=2749(MOD 10007)
Test power OK!
[kernel] Application exited with code 0
[kernel] Loading app_3
Try to execute privileged instruction in U Mode
Kernel should kill this application!
[kernel] IllegalInstruction in application, kernel killed it.
[kernel] Loading app_4
Try to access privileged CSR in U Mode
Kernel should kill this application!
[kernel] IllegalInstruction in application, kernel killed it.
All applications completed!
这个运行log我们主要关注Loading和kill两个单词,主要体现了:
- 操作系统可以自己读取并且运行任务
- 如果程序运行失败,操作系统可以杀掉程序并且保住自己
那么我们之后的工作也要聚焦到这两点的实现.
本章代码树
官方给出的代码树:

看了之后有一种似懂非懂的状态,这是很正常的,应该及时去看之前实现的Lib-OS的架构是什么样的,进行横向对比才能有收获:

可以看到第二章的系统相对于第一章的系统增加了U-Mode,并且在SBI的基础上实现了不同于第一章仅仅输出字符串,关机,处理panic的功能,而是实现了Trap_Handler和syscall_service.从名字上我们就可以看出来Trap_Handler是程序陷入问题的时候调用的一个服务,保证操作系统不会因为一个任务运行失败就挂掉,而syscall_service则是另一个feature即解决"计算机给自己分配工作"的问题.
这里再提一嘴M,S,U,分别代表Master,Supervise,User.
本章代码导读
这里一定要好好看看官方文档.
这里有个评论很有道理帮我们通过Linux和Windows的行为以及之前学过的Rt-Thread的行为解释当前的系统是怎么运行应用的:
一般来说执行一个用户态应用程序的流程是,读取elf文件,创建新的进程页表,把elf文件里面的可执行文件段分别map到这个地址空间内的不同区域,切换页表然后设置特权等级。但是现在好像还没有文件系统,也没有类似C语言里面map的功能(后面应该会有),所以就靠链接器把用户态应用程序直接写入内核映像里,执行的时候直接跳转到这片内存区域即可.
[rCore学习笔记 014]批处理系统的更多相关文章
- Python学习笔记014——迭代工具函数 内置函数enumerate()
1 描述 enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中. 2 语法 enumerate(sequ ...
- 网上图书商城项目学习笔记-014购物车模块页面javascrip
一.流程分析 二.代码 1.view层 (1)list.jsp <%@ page language="java" import="java.util.*" ...
- 【原】Java学习笔记014 - 面向对象
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 面向对象思想 // ...
- Python学习笔记014——迭代工具函数 内置函数zip()
1 描述 zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表. 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操 ...
- Python学习笔记014——生成器Generator
1 生成器定义 在Python中,一边循环一边计算的机制,称之为生成器(generator). 生成器是一个迭代器. 含有yield语句的函数是生成器函数,该函数被调用时返回一个生成器对象(yield ...
- Python学习笔记014——迭代器 Iterator
1 迭代器的定义 凡是能被next()函数调用并不断返回一个值的对象均称之为迭代器(Iterator) 2 迭代器的说明 Python中的Iterator对象表示的是一个数据流,被函数next()函数 ...
- python学习笔记014——错误和异常
Python有两种错误很容易辨认:语法错误和异常. 1 什么是语法错误 Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例 if i>4 print("if语句输出 ...
- 学习笔记:The Log(我所读过的最好的一篇分布式技术文章)
前言 这是一篇学习笔记. 学习的材料来自Jay Kreps的一篇讲Log的博文. 原文很长,但是我坚持看完了,收获颇多,也深深为Jay哥的技术能力.架构能力和对于分布式系统的理解之深刻所折服.同时也因 ...
- Python学习笔记九
Python学习笔记之九 为什么要有操作系统 管理硬件,提供接口. 管理调度进程,并且将多个进程对硬件的竞争变得有序. 操作系统发展史 第一代计算机:真空管和穿孔卡片 没有操作系统,所有的程序设计直接 ...
- 学习笔记:The Log(我所读过的最好的一篇分布式技术文章)
前言 这是一篇学习笔记. 学习的材料来自Jay Kreps的一篇讲Log的博文. 原文非常长.可是我坚持看完了,收获颇多,也深深为Jay哥的技术能力.架构能力和对于分布式系统的理解之深刻所折服.同一时 ...
随机推荐
- 树莓派 ubuntu server 22.x 连接无线网络
前言 树莓派系统安装完成后,需要配置网络,由于家里没有多余的网线(网线多少有点乱),所以决定配置无线上网的方式,现在记录下来操作过程 具体操作 sudo nano /etc/netplan/xxxxx ...
- CCL 2024 Task7 双任务冠军
近期参加NLP领域CCL2024评测,现将赛题背景和实现方法分享,推理文本纠错领域的发展. 1.背景信息 随着教育的发展和网络的普及,作文评价的规模越来越大,人工评改作文的成本和效率成为一大难题.为了 ...
- C# WPF 坦克大战
wpf写的.主要是Canvas做画布 和类似的Rectangle的自定义类 采用了画面帧的思想,子弹 坦克移动 效果 都是 在主界面用一个定时器 循环,每秒60帧,这样做的好处,对比我之前做的炸弹人游 ...
- 二进制安装Kubernetes(k8s)v1.30.1
二进制安装Kubernetes(k8s)v1.30.1 https://github.com/cby-chen/Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes(k ...
- GeneralUpdate .Net5 WPF、Winfrom、控制台应用自动更新组件
https://www.bilibili.com/video/BV1aX4y137dd/?vd_source=43d3e66cc2ad46bac54dfb0c6a3a0a23 GeneralUpdat ...
- 算法学习笔记(45): 快速沃尔什变换 FWT
遗憾的是 math 里面一直没有很好的讲这个东西--所以这次细致说说. FWT 的本质 类似于多项式卷积中,利用 ntt 变换使得卷积 \(\to\) 点乘,fwt 也是类似的应用. 定义某种位运算 ...
- 关于朋友圈出现的小米新店广告骗局(非法获取个人消息)木马通过广东政务服务网(tyrz.gd.gov.cn)的url漏洞显示
前两天在朋友圈突然看到有发 小米新店开业 送千台扫地机器人的 广告,出于天上不会掉馅饼到我身上的原则 我选择忽略了,但是没多久 看到他又晒了个物流订单,于是还是点开看了一下,发现微信打开的网站还蛮正规 ...
- Windows 预览体验计划显示空白
Open PowerShell as Administator.In the elevated PowerShell window, copy and paste the following comm ...
- .NET5 ASP.NET CORE 发布到IIS 文件无法替换
由于默认是:进程内托管.要在IIS里停止网站,才能替换文件. 建议解决方案是:进程外(out-of-process)托管 记事本修改项目的 .csproj 文件(或在VS上,选中web项目,右键-编 ...
- Mysql联合索引生效、失效条件
引言 联合索引又叫复合索引.两个或更多个列上的索引被称作复合索引. 对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key inde ...