MIT 6.s081前置xv6教材和课程总结——第二章 操作系统架构
系列文章目录
MIT 6.s081前置xv6教材和课程总结——第一章 操作系统接口
MIT 6.s081前置xv6教材和课程总结——第二章 操作系统架构
概述
操作系统必须满足三个要求:多路复用、隔离和交互。即使进程比硬件处理器多,操作系统也必须确保所有进程都有机会执行。操作系统还必须安排进程之间的隔离。也就是说,如果一个进程有错误和故障,它不应该影响不依赖于有错误的进程的进程。然而,完全隔离又太过头了,进程之间应当可以进行刻意为之的交互;
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)模式。
微内核和宏内核的效率是不一样的,例如一个应用程序要和文件系统交互,在宏内核下,文件系统就在内核空间中,所以只需要一次用户空间和内核空间的交互;但在微内核当中,文件系统以服务的形式存在于用户空间,需要应用程序-内核-文件系统,文件系统-内核-应用程序,共两次交互。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!