自学内容网 自学内容网

xv6讲解(2) Operating system organization

这一章 讲操作系统是如何实现进程并发、进程隔离和进程交互(multiplexing isolation and interaction)

进程并发: 操作系统需要同时支持多个进程。如一个进程可以使用fork来启动新的进程。对计算机的资源进行时间共享,确保所有进程都有机会执行。

进程隔离: 操作系统需要为进程之间提供隔离,如果一个进程有错误并且出现故障,它不应影响不依赖于有错误进程的其他进程。

进程通信: 进程之间应可以进行交互(通信):如管道....。

操作系统对隔离的实现

隔离是进程和进程之间的隔离,也是进程和内核之间的隔离,操作系统通过对物理资源抽象,通过实现用户态、进程态和系统调用实现隔离。

物理资源的抽象

一些嵌入式操作系统,应用程序可以直接与硬件资源交互,然后使用这些资源,如果有多个应用程序在运行,则这些应用程序必须表现良好。比如每个应用程序必须定期放弃 CPU,以便其他应用程序可以运行。但是应用程序可能存在错误,这需要操作系统提供更强的隔离能力(不会相互影响)。

为了实现应用之间的隔离,就要禁止应用程序直接访问敏感硬件资源,并抽象物理资源然后使用。

文件系统的抽象:

例:Unix 应用程序只通过文件系统的 open、read、write 和 close 系统调用与存储进行交互,而不是直接读写磁盘。(文件系统相关知识:文件描述符、inode节点,file对象,目录项...)

CPU的抽象:

例:Unix 在进程之间切换硬件 CPU的操作是透明的,根据需要保存和恢复寄存器状态,这样应用程序就无需关注其他应用程序的问题。透明性使得操作系统即使某些应用程序处于无限循环中,也可以共享CPU。

物理地址的抽象:

例:Unix 进程使用 exec 后会创建一个虚拟内存,进程不会直接与物理内存交互。操作系统可以决定虚拟地址进程放置在内存的位置。 (内存管理相关的知识:虚拟地址空间,页表,快表,堆的管理,物理块的管理.....)

User mode(用户态),supervisor mode(内核态),system calls(系统调用)

进程隔离要求应用程序和操作系统之间存在严格的边界。如果应用程序出现错误,不影响操作系统或其他应用程序。操作系统应该能够清理失败的应用程序并继续运行其他应用程序。

用户态进程运行在用户空间:应用程序只能执行用户模式指令,无法读取和修改内核的数据结构和指令,并且程序无法访问其他进程的内存

处于内核态的进程可以执行特权指令。操作系统的内核就是运行在内核空间的软件称为内核

应用程序不能直接调用内核函数,调用内核函数的应用程序必须切换到内核;

CPU 提供了一个特殊的指令如syscall,可以将 CPU 从用户态切换到内核态,并进入由内核指定的入口点。

(这个需要根据实验补充)

Kernel organization

操作系统的内核组织可以是单内核或微内核。

单内核

单内核(monolithic kernel)整个操作系统都放在内核中,所有系统调用的实现都在内核态运行。

单内核的组织结构很方便,此外,操作系统的不同部分之间更容易合作。例如操作系统的一个缓冲区高速缓存,可以被文件系统和虚拟内存共享。

单内核的缺点是操作系统中不同部分之间的接口通常非常复杂。在单内核中,一个错误是致命的,因为监管者模式下的错误通常会导致内核失败。如果内核失败,计算机将停止工作。

微内核

为了减少内核中出错的风险,尽可能减少在内核态下的操作系统代码,并在用户模式下执行大部分操作系统,这种内核组织结构被称为微内核(microkernel)。

在图中,文件系统作为一个用户级进程运行。作为进程运行的操作系统服务称为服务器(servers)。

为了允许应用程序与文件服务器交互,内核提供了一个进程间通信机制,用于将消息从一个用户模式进程发送到另一个。

例如: shell 应用程序想要读取或写入文件,它会向文件服务器发送一条消息,并等待响应。

在微内核中,内核接口由一些低级函数组成,用于启动应用程序、发送消息、访问设备硬件等。这种组织结构允许内核相对简单,因为大部分操作系统都驻留在用户级别的服务器中。

Linux 具有单内核。如QNX 等操作系统为微内核,用于嵌入式环境。

关于使用哪一个内核

关于哪种组织方式更好,没有一个定论。此外,这在很大程度上取决于“更好”的含义:更快的性能、更小的代码大小、内核的可靠性、完整操作系统的可靠性(包括用户级别服务)等等。微内核和单内核操作系统共享许多关键思想。它们实现系统调用,使用页表,处理中断,支持进程,使用锁来进行并发控制,实现文件系统等。

Xv6 被实现为一个单内核、因此,xv6 在内核态实现了系统调用并提供系统调用接口。

xv6内核源代码位于kernel/子目录中。源代码按照模块化的大致概念划分为多个文件。模块间的接口定义在defs.h文件中。

xv6提供进程的切换,页表,进程的虚拟地址空间,进程的状态(kernel/proc.h)

The xv6 kernel maintains many pieces of state for each process, which it gathers into a struct proc.

xv6启动过程: 以后补充

练习:以后做。


原文地址:https://blog.csdn.net/m0_52043808/article/details/134484577

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!