014 批处理系统

写在前面

本随笔是非常菜的菜鸡写的。如有问题请及时提出。

可以联系:1160712160@qq.com

GitHhub:https://github.com/WindDevil (目前啥也没有

本章目的

  1. 保障系统安全
  2. 多应用支持

本章需要实现的新功能

  • 构造包含操作系统内核和多个应用程序的单一执行程序
  • 通过批处理支持多个程序的自动加载和运行
  • 操作系统利用硬件特权级机制,实现对操作系统自身的保护
  • 实现特权级的穿越
  • 支持跨特权级的系统调用功能

本章的宗旨和思想

操作系统历史上最伟大的想象力飞跃之一是计算机可能通过软件来安排自己的工作负荷的想法

本章我们的目标让泥盆纪“邓式鱼”操作系统能够感知多个应用程序的存在,并一个接一个地运行这些应用程序,当一个应用程序执行完毕后,会启动下一个应用程序,直到所有的应用程序都执行完毕。

实践体验

同样是运行们在上一章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我们主要关注Loadingkill两个单词,主要体现了:

  1. 操作系统可以自己读取并且运行任务
  2. 如果程序运行失败,操作系统可以杀掉程序并且保住自己

那么我们之后的工作也要聚焦到这两点的实现.

本章代码树

官方给出的代码树:

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

可以看到第二章的系统相对于第一章的系统增加了U-Mode,并且在SBI的基础上实现了不同于第一章仅仅输出字符串,关机,处理panic的功能,而是实现了Trap_Handlersyscall_service.从名字上我们就可以看出来Trap_Handler是程序陷入问题的时候调用的一个服务,保证操作系统不会因为一个任务运行失败就挂掉,而syscall_service则是另一个feature即解决"计算机给自己分配工作"的问题.

这里再提一嘴M,S,U,分别代表Master,Supervise,User.

本章代码导读

这里一定要好好看看官方文档.

这里有个评论很有道理帮我们通过LinuxWindows的行为以及之前学过的Rt-Thread的行为解释当前的系统是怎么运行应用的:
一般来说执行一个用户态应用程序的流程是,读取elf文件,创建新的进程页表,把elf文件里面的可执行文件段分别map到这个地址空间内的不同区域,切换页表然后设置特权等级。但是现在好像还没有文件系统,也没有类似C语言里面map的功能(后面应该会有),所以就靠链接器把用户态应用程序直接写入内核映像里,执行的时候直接跳转到这片内存区域即可.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/741433.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DOM属性

常用 DOM 属性innerHTML:用于获取或设置元素的 HTML 内容。 可以直接插入 HTML 代码,适合处理复杂的 HTML 结构。element.innerHTML = <p>New content</p>; console.log(element.innerHTML);innerText:用于获取或设置元素的文本内容,只包括可见的文本。 会触发重…

【一天一点.NET小知识】运用向量VectorT加速求和计算

随着 .NET 版本的演进,从 .NET Standard 2.0 版本开始,支持 Vector<T> 类型。 Vector<T> 类型:表示指定数值类型(适用于并行算法的低级别优化)的单个向量。 假如我们有一个求和函数接受一个int数组入参,当它的长度大于等于8及其倍数以上时,那么我们就可以考…

实战篇——CSRF漏洞pikachu靶场实战

实战篇——CSRF漏洞pikachu靶场实战 CSRF的原理 攻击者利用用户在某个网站上的已登录状态,诱使用户点击恶意链接,恶意页面会向服务器自动发送预先准备好的恶意请求。由于请求中自动包含了用户的认证凭证,服务器会误以为是合法的用户操作,从而执行恶意请求。 CSRF的分类 (1)…

Bulldog_2 靶机提权

一、目标环境 攻击者(kali)、目标服务器(ubuntu) 二、信息收集 1、探测靶机 使用fscan进行探测 ./fscan -h ip 段发现目标地址,并且还发现对方开启了80端口 三、目标站点的访问以及检测然后发现两个接口,分别是登陆和注册的然后就是在登陆接口这边尝试一下弱口令发现并不…

PySimpleGUI笔记

本博客详细介绍了 PySimpleGUI 的基本用法和高级功能,并通过实际案例演示了如何使用 PySimpleGUI 开发图形用户界面 (GUI) 应用。主要内容包括:基本用法:介绍了 PySimpleGUI 的基本组件和窗口创建方法,通过简单示例展示了如何创建和管理窗口。 事件处理:讲解了如何处理用户…

忆 2015 硅谷之行

2015 硅谷之行 ,是我脑海里一段充满海蓝色的记忆。 有点像刘姥姥进大观园,也有点像进入另外一个我不曾幻想过的世界。 郊区很美 我们住在郊区,人很少,景色很美。每次去吃饭,还得驱车 15 分钟左右去附近最近的餐厅。Google 总部 Google 对于每个程序员来讲,都是一个梦幻的…

py并发编程

并发编程(并发,并行,同步,异步) 通俗理解并发编程中的相关核心概念 核心概念:进程、线程CPU的作用计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。 CPU的核数(多核计算机多个CPU,大部分情况下也只是用了一核CPU)假定工厂的电力有限,一次只…

Android studio导出apk文件

在Android studio中打开项目 选择build——》 build bundle(s)/apk(s)——》build apk(s) 加载完成后点击右下角弹窗的local(或者在  项目地址\app\build\outputs\apk\debug  中找到apk文件) 将apk文件复制到对应设备上就可以啦(最好别用qq)

JDK、JRE、JVM

JDK:Java Development Kit JRE: Java Runtime Environment JVM: Java Virtual Machine

[CINTA] 具体数论与代数阅读笔记——第一章 整数和二进制(含加、乘、除)

这里是王立斌老师的《具体数论与代数》(CINTA)的阅读笔记前言 这本书说自己是计算机专业数学入门之入门,成为读者攻读其他经典著作的垫脚石,但个人以为足矣替换掉本校内不知所云的、抽象的、让学生考完后马上全忘的那些课程。本书的 GitHub 仓库在这里。 该笔记并非单纯的整…

热爱无限

青春不在年华,而在心境;青春不是桃面、丹唇、柔膝,而是深沉的意志、恢弘的想象、炙热的情感,更是生命中无限的热爱。它使你有一台天线,从天上接受着勇气与力量的信号,使你青春永驻。 怀揣着热爱,我投入到无限的学习之中。当我第一次接触信息学竞赛时,就被其中无限的知识…

Franka Robot 错误处理

使用 FCI 时,您会遇到多种错误,这些错误可能是由于用户发送的不合规命令、通信问题或机器人行为而导致的。以下小节详细介绍了最相关的错误。有关完整列表,请查看 API文档。请注意,发生错误后,您可以自动清除错误并继续使用该franka::Robot::automaticErrorRecovery()命令…