当前位置: 首页 > news >正文

MIT 6.s081前置xv6教材和课程总结——第二章 操作系统架构

系列文章目录

MIT 6.s081前置xv6教材和课程总结——第一章 操作系统接口
MIT 6.s081前置xv6教材和课程总结——第二章 操作系统架构


文章目录

  • 系列文章目录
  • 概述
  • 1. 抽象系统资源
  • 2. 用户态,核心态,以及系统调用
  • 3. 内核组织


概述

操作系统必须满足三个要求:多路复用、隔离和交互。即使进程比硬件处理器多,操作系统也必须确保所有进程都有机会执行。操作系统还必须安排进程之间的隔离。也就是说,如果一个进程有错误和故障,它不应该影响不依赖于有错误的进程的进程。然而,完全隔离又太过头了,进程之间应当可以进行刻意为之的交互;

1. 抽象系统资源

为什么要抽象系统资源?如果没有操作系统去抽象系统资源,那么应用程序就会直接与硬件交互,最重要的一点就是无法实现多路复用和内存隔离。

多路复用的意思就是同一时间CPU只能运行一个应用程序,为了不变成一个恶意程序,程序在发现自己运行了一段时间之后,需要让别的程序也有机会能运行。这种机制有时候称为协同调度(Cooperative Scheduling)。但是程序中的某个函数有一个死循环,那么程序永远也不会释放CPU,进而其他的应用程序也不能够运行,甚至都不能运行一个第三方的程序来停止或者杀死Shell程序。所以这种场景下,我们基本上得不到真正的multiplexing(CPU在多进程同分时复用)。

内存隔离则是如果应用程序直接读写内存,没有界限,会导致相互影响彼此的数据。

为了实现强隔离, 最好禁止应用程序直接访问敏感的硬件资源,而是将资源抽象为服务。例如fork将抽象了cpu资源,exec抽象了内存资源,file抽象了磁盘资源。

2. 用户态,核心态,以及系统调用

为什么要有不同模式的区分?因为操作系统需要考虑防御性(Defensive)。即应用程序有可能是恶意的,会去打破强隔离从而进入内核,控制所有的系统资源。主要的硬件支持包括两个:第一部分是user/kernel mode,kernel mode在RISC-V中被称为Supervisor mode但是其实是同一个东西;第二部分是page table或者虚拟内存(Virtual Memory)。

RISC-V有三种CPU可以执行指令的模式:机器模式(Machine Mode)、用户模式(User Mode)和管理模式(Supervisor Mode)。
机器模式:执行的指令具有完全特权,主要用于配置计算机
管理模式:CPU被允许执行特权指令
用户模式:应用程序只能执行用户模式的指令
如果在应用程序用户模式下执行特权指令,cpu会切换至管理模式,并且中止应用程序

               用户态=用户模式=目态

               核心态=管理模式=管态

此外,当一个用户空间的应用程序想要调用一个系统调用,例如read/write,并不是直接进入内核调用,在RISC-V中,有一个专门的指令用来实现这个功能,叫做ECALL。ECALL接收一个数字参数,当一个用户程序想要将程序执行的控制权转移到内核,它只需要执行ECALL指令,并传入一个数字。这里的数字参数代表了应用程序想要调用的System Call。
而在内核中,有一个syscall函数专门检查ECALL的参数,去找到对应的系统调用。

3. 内核组织

宏内核(monolithic kernel):整个操作系统都驻留在内核中,这样所有系统调用的实现都以管理模式运行,整个操作系统以完全的硬件特权运行。

优点:操作系统的不同部分更容易合作。

缺点:是操作系统不同部分之间的接口通常很复杂,在宏内核中,一个错误就可能是致命的,因为管理模式中的错误经常会导致内核失败。如果内核失败,计算机停止工作,因此所有应用程序也会失败。计算机必须重启才能再次使用。

微内核:最大限度地减少在管理模式下运行的操作系统代码量,并在用户模式下执行大部分操作系统。作为进程运行的操作系统服务被称为服务器,这就是客户/服务器(Client/Server)模式。

微内核和宏内核的效率是不一样的,例如一个应用程序要和文件系统交互,在宏内核下,文件系统就在内核空间中,所以只需要一次用户空间和内核空间的交互;但在微内核当中,文件系统以服务的形式存在于用户空间,需要应用程序-内核-文件系统,文件系统-内核-应用程序,共两次交互。

相关文章:

  • golang学习-匿名函数和闭包
  • c#调试程序一次启动两个工程(多个工程)
  • 服务器GPU温度过高挂掉排查记录
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • 避免重复扣款:分布式支付系统的幂等性原理与实践
  • astadmin安装querylist插件Puppeteer
  • 图像分类任务的可视化脚本,生成类别json字典文件
  • Hotspot源码解析-第十七章-虚拟机万物创建(三)
  • 如何使用PHP开发缓存优化图片加载速度
  • Python pip 常用指令
  • 安达发|APS智能排产软件有哪些条件约束功能
  • 2024年AIGC趋势展望:视频生成的“百模大战”
  • 每日一篇英语文章分享-----主目录-----持续更新
  • 蓝凌EIS智慧协同平台 ShowUserInfo.aspx SQL注入漏洞复现
  • vue中常用的指令修饰符
  • Angular 4.x 动态创建组件
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • go append函数以及写入
  • MaxCompute访问TableStore(OTS) 数据
  • node学习系列之简单文件上传
  • October CMS - 快速入门 9 Images And Galleries
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • ubuntu 下nginx安装 并支持https协议
  • Vim Clutch | 面向脚踏板编程……
  • vue.js框架原理浅析
  • 从0到1:PostCSS 插件开发最佳实践
  • 订阅Forge Viewer所有的事件
  • 面试总结JavaScript篇
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 追踪解析 FutureTask 源码
  • ​VRRP 虚拟路由冗余协议(华为)
  • # 透过事物看本质的能力怎么培养?
  • #控制台大学课堂点名问题_课堂随机点名
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (二十四)Flask之flask-session组件
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (算法设计与分析)第一章算法概述-习题
  • (原)本想说脏话,奈何已放下
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • *上位机的定义
  • .form文件_一篇文章学会文件上传
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .Net Memory Profiler的使用举例
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • [ JavaScript ] JSON方法
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • [30期] 我的学习方法
  • [ACTF2020 新生赛]Upload 1
  • [android] 练习PopupWindow实现对话框