Xv6 操作系统2025 年 4 月 29 日 | 阅读 23 分钟 引言操作系统 (OS) 是现代计算的核心,负责管理硬件资源、运行应用程序并为用户提供基本服务。对于任何想要在该领域取得进展,甚至追求通常被称为“计算机科学”的工作的人来说,例如系统编程和安全等,以及处理硬件,理解操作系统是一个基本概念。 然而,信息丰富且功能齐全的“优点”可能会使像 Linux 或 Windows 这样的现代操作系统对任何用户来说都变得复杂。欢迎来到 xv6 - 一款 类 Unix 操作系统,它消除了所有非必要的干扰,同时仍然是一个完全可用的操作系统。xv6 由麻省理工学院 (MIT) 的学生创建,用于教授操作系统和 CX,它是 Unix Version 6 (v6) 的一个版本,Unix 操作系统开发于 20 世纪 70 年代。 什么是 Xv6?最小的类 Unix 操作系统,实际上用于教育目的以及操作系统专业学生的研究。该操作系统课程由麻省理工学院 (MIT) 的教授开发,用于“操作系统工程”,本网站的目的是通过一个最初由 MIT 学生于 2003 年作为其 OS 项目一部分创建的“干净、可读”版本的 Unix 来解释操作系统的基本思想和原理;此版本基于 Unix Version 6 (v6),这是 Unix 的早期版本之一。当然,Unix v6 本身作为操作系统是 OS 历史上的一大步,但 xv6 代表了对 Unix v6 的类似重新实现和升级,主要目标是作为教育工具,使用 C 语言和一个简单的 硬件 抽象层。 xv6 被许多学院和大学广泛使用,这可能归因于它是一个简单的操作系统。与 Linux 等现代操作系统包含数千万条命令不同,xv6 仅包含约 9000 条 C 命令和一些汇编指令。由于其紧凑性,整个系统都可以被阅读、理解甚至修改,特别是对于希望获得系统实践经验的学生和好奇的开发人员来说,这是大型系统无法提供的。 为什么选择 Xv6?从基本知识开始学习操作系统可能非常令人生畏。现代配置已发展到包含多个层次的层次结构,以解决多种硬件类型、支持多个用户以及解决网络和安全等高级功能。这种情况虽然有利于在现实世界中进一步发展 OS 问题,但不可避免地会削弱 OS 设计的基本概念。因此,对于学习者来说,xv6 是解决这种复杂性的方法。 名为 xv6 的课程缺少许多复杂性和层次,这些复杂性和层次是你在 OS 中可能发现自己团团转的东西。Xv6 倾向于简化,使得学生更容易理解 OS 如何处理进程、内存和文件系统,同时让学生接触并发、系统调用、中断以及 OS 中的许多其他概念。正如预期的那样,xv6 是一个功能齐全的操作系统,支持基本的类 Unix 进程管理、文件系统和一个简单的 shell。这使其成为一个完美的教学辅助工具,因为它附带了完整的解释,同时又易于应用。 Xv6 中的 Unix 传承为了更好地了解 xv6,本文将首先介绍 Unix v6 是什么以及 xv6 是如何从中诞生的。Unix v6 于 1975 年发布,它是现代操作系统之所以成为今天的样子的重要原因。这些是分层文件系统和用户模式进程以及系统调用,程序能够通过这些调用向内核请求服务。 Unix v6 一直以其简洁优雅而闻名,xv6 也不例外。它重新实现了 Unix v6 的进程、内存、文件系统和 I/O,但以一种对当今学习者来说更熟悉的方式。此外,该作品在 XV6 中进行了一些小的增强,以适应现代技术和程序员的习惯。例如,Unix v6 主要用汇编语言实现,这与 XV6 主要用 C 语言实现的方式截然不同;这种实现方式不仅使当今的学习者更容易,而且还为移植到当今大多数硬件平台提供了机会。 Xv6 架构概述xv6 操作系统的设计使得能够连贯简洁地了解构成任何类 Unix 系统基础的知识。xv6 以教学为目的,提供了一个可理解的结构,包含了操作系统必不可少的组件,包括进程、内存和文件系统。 1. 内核结构xv6 的核心是内核,一个在监管模式下运行的大型单程序,负责系统的大部分设备功能。而在微内核架构中,不同的服务位于不同的进程中,在 xv6 中,它们完全在内核空间实现。与当今的系统相比,这种架构的模块化程度稍低,安全性也低得多,但其优点是更容易在操作层面进行理解和管理。 内核负责:
这些功能中的每一个都可以用少量易读的代码来实现,并且它们都紧密地集成在内核中;也就是说,学生可以很好地了解操作系统如何从系统的角度工作。 2. 进程和进程管理线程是 xv6 中最小的可执行实体,OS 提供了一个简单而高效的线程管理模型。与 Unix 类似,xv6 使用进程来表示正在运行的程序并封装其状态,包括:
xv6 支持用于进程创建或执行的系统调用;fork():克隆父进程 P,创建子进程,而 exec():用要执行的程序替换当前进程映像。当进程完成时,它可以调用 exit(),OS 负责清理资源。 3. 进程调度循环调度是 CPU 调度算法中最简单的之一,并在 xv6 中实现。任务按圆形系统组织,每个进程都有一个预定的执行时间间隔。如果一个进程在其时间片内未完成,它将被中断,并且下一个进程获得 CPU 时间片。 尽管简单,但调度程序用于解释简单的调度功能,例如上下文切换,其中保存进程的状态,并检索另一个进程的状态以允许共享 CPU。这种同步协作式并发对于 xv6 这样的小型系统来说相当不错,因为节俭比效率更重要。 4. 内存管理在 xv6 中,一些内存管理概念比当今操作系统模型更基础,但它们足以说明虚拟内存和分页等关键思想。每个进程都有另一个虚拟地址空间,地址空间通过页表转换为物理地址。
5. 文件系统与教学文本类似,xv6 也有一个文件系统,这是了解类 Unix 系统数据管理的另一个重要功能。xv6 中实现的文件系统是一个简单的基于 inode 的文件系统,这是 Unix 系统的特征。文件的数据存储在称为 inode 的节点中,这些节点包含文件相关的信息,例如其大小、权限和在磁盘上的位置。
6. 进程间通信 (IPC)在 xv6 中,两个进程之间的通信可以通过系统调用完成,例如 pipe()。管道允许数据以单向方式从一个进程传递到另一个进程。在更高级的系统中,IPC 可以通过消息传递、共享内存或信号量来实现,但为了简单演示进程如何通信和协调其任务,xv6 使用管道。 7. 中断处理和设备驱动程序xv6 调度由中断创建的对象,用于异步事件,如 I/O 操作。当发生中断时,例如键盘按键或磁盘读取过程,CPU 会暂停当前进程并将控制权转移到操作系统内核的一部分的中断处理程序;xv6 包含两个非常简单的 I/O 设备驱动程序,用于磁盘和控制台,以说明 OS 如何与硬件通信。
xv6 中的进程是什么?同样,在 xv6 中,进程只是指一个正在运行的程序。每个进程都有自己的
Xv6 中的进程创建在 xv6 中,进程创建通过 fork() 系统调用完成,该调用类似于 Unix 的 fork() 调用。在 fork() 中,新进程的创建涉及复制当前进程。新进程称为子进程,它被映射到父进程的精确副本,连同其点和内存空间。
进程执行:exec()虽然 fork() 创建一个克隆父进程的新进程,但 exec() 系统调用允许进程用另一个程序的内存空间替换其自身的内存空间。这对于处理新工作负载或应用程序至关重要,因为它们需要提供卓越的应用程序性能。
此系统调用展示了操作系统如何管理多个程序:应用程序可以从另一个程序的副本开始,但然后在其地址空间中下载另一个程序。这实际上很常见,例如,shell:shell 会 fork 一个新进程,然后使用 exec() 执行用户命令。 xv6 中的进程状态xv6 中的每个进程可以处于几种状态之一,这些状态描述了进程在任何给定时间正在做什么
在它们的生命周期中,它们会根据诸如资源分配和 CPU 调度程序等因素在这些模式之间转换。例如,一个进程可能会从睡眠状态唤醒到可运行状态,因为它收到了一些输入,然后由于调度程序选择了它而进入运行状态。 进程调度在 xv6 中,多个进程的调度通过循环调度技术有效地完成,该技术基本但高效。在循环调度中 每个进程都被预先测量了允许执行的固定时间量。 即使进程在其时间片内未完成,它也会被中断,并且下一个进程有机会运行。 在所有进程完成此轮之后,调度程序会返回到列表中的初始进程。 这种抢占式多任务处理有助于确保进程永远不会占用 CPU,从而使 xv6 成为一个多任务系统。上下文切换发生在进程时间量结束时,此时 OS 将保存当前进程的状态(寄存器、程序计数器等)并调出下一个进程的状态。 进程终止xv6 中的特定进程使用系统退出调用或 exit 系统调用退出,该调用会退出进程并释放它使用的内存以及任何打开的 FD。但是,这个过程并非一气呵成。它进入僵尸状态,在那里它一直停留,直到其父进程通过 wait() 系统调用收集僵尸进程的终止状态。 exit() 和 wait() 系统调用是进程管理中的基本父级调用,用于同步父子进程。父进程可以查找子进程的状态并清理任何剩余资源,这对于维护系统完整性并确保没有资源泄漏很重要。 xv6 中的内存管理1. xv6 中的虚拟内存xv6 的核心原则之一是虚拟内存。进程不是直接指向物理内存,而是各自在其自己的虚拟地址空间中工作。这种抽象提供了几个好处
与大多数现代操作系统一样,xv6 中的虚拟内存通过分页映射到物理内存。进程的系统地址空间被划分为页面——固定大小的块,其中每个虚拟页面都映射到物理内存中的物理帧。从虚拟地址到物理地址的转换是通过页表完成的。 2. 页表和地址转换页表对于 xv6 内存管理至关重要。它们是 OS 用于将应用程序的虚拟地址复制到物理地址的数据结构。每当进程发出内存指令时,它都必须将其转换为物理地址。这分两步完成 使用最高有效位(称为页号)来索引页表,从而转换虚拟地址。 PTW 中实际包含的信息是物理页号以及该页的权限位(可读或可写)。 xv6 的架构基于 x86 处理器,使用两级页表 第一级是页目录,包含页表的地址。 第二级是页表本身,它保存物理地址或物理标识符的位置。 此外,它建立了两个层次结构,有助于最小化大型系统和虚拟地址空间的页表管理内存开销。它还负责请求内存管理,并允许系统确定当前哪个页面在内存中。 3. 物理内存分配尽管虚拟内存有助于组织进程,但实际数据必须存储在物理内存中,在这方面,xv6 提供了一种最简单但有效的方法。 xv6 使用空闲列表进行物理内存管理,通过它可以获取或释放可用的物理内存。空闲列表本质上是一个包含要分配的空闲内存页或帧的开放列表。如果进程需要从操作系统的空闲内存中为自己请求更多内存,则 OS 将从此空闲列表中选择一个页面。一方面,如果进程不需要内存,例如进程结束时,其页面会返回到空闲列表。 kalloc() 从空闲列表中提取页面,而 kfree() 在不再需要时用于将页面放回。这些函数在整个 OS 中用于根据需要控制内存空间的需求。 4. 内存管理系统调用xv6 提供多个系统调用,允许进程管理其内存
总而言之,这些函数允许动态堆根据进程的执行进行更改,在需要时进行增长和收缩。 5. 内核内存管理除了组织用户进程的内存之外,xv6 还必须组织内核自己的内存空间。操作系统内核在与用于其任务(即进程)的内存不同的特殊内存区域中运行,并且该内存映射到单独的页表。 内核内存的分配方式与用户内存类似,都使用空闲列表。然而,内核内存是长期的,并且以不同的方式管理,以确保内核保持出色的响应能力。例如,某些内存区域(内存映射 I/O 区域)是永久分配的,不能被交换或释放。 6. xv6 内存管理限制
xv6 中的中断和系统调用1. xv6 中的中断中断是由外围设备或其他程序发出的一种电信号或机械信号,请求关注。xv6 中的中断由计时器、磁盘、键盘等设备产生,必须由操作系统有效处理。 2. 中断类型
3. 中断处理过程发生中断时,CPU 会暂停当前任务,并保存所有寄存器的状态,这称为上下文切换,然后转到内核的另一部分,即中断处理程序/中断服务例程。在 xv6 中,内核按以下步骤处理中断
4. xv6 中的系统调用系统调用是用户程序向操作系统请求服务的途径。由于用户模式下的进程可能会出于安全性和可靠性考虑而干扰内核,因此内核通过系统调用选择性地公开硬件设施和其他内核支持的操作。 5. 系统调用机制
6. xv6 中的常用系统调用
xv6 的并发与同步1. xv6 中的并发并发是指一个或多个进程或线程同时处于活动状态,或者一个进程正在运行一部分,而另一个进程正在执行另一部分。在 xv6 中,这是通过多进程和多线程来实现的,如下所述。并发意味着可以同时进行多个操作,从而提高了 CPU 利用率和系统性能。 2. 通过进程实现并发在 xv6 中,每个进程都在自己的空间中执行,该空间具有特定的内存和特定的 CPU 状态。所有进程都可以自由交互,但可以同时进行,因为 xv6 使用抢占式多任务处理,其中操作系统在特定间隔(通过定时器中断)检查进程,然后允许它在进程之间切换。 3. 通过中断实现并发因此,中断除了我们在进程级别看到的之外,还提供了另一层并发。中断可能来自计时器或 I/O 设备,并且可能会随机发生,从而激活内核中的中断处理程序。这些处理程序与其他的内核和用户进程并行处理,因此,数据需要非常敏感地管理。 4. 内核中的并发内核本身也应该是并发的,因为并发系统调用、中断和进程可能出现在内核区域。如果不加以控制,同时访问某些共享内核结构,如进程表、内存分配器等,可能会导致数据处理不当,甚至系统挂起。 5. xv6 中的锁锁是 xv6 中实现的主要同步形式。锁是一种同步原语,其标准是每次只允许一个线程或进程访问共享数据。基本机制是,当进程或线程获得锁时,其他正在寻求锁的进程或线程必须等待直到锁被释放。 6. xv6 中的锁类型
7. 锁实现xv6 中自旋锁的结构通常包括
8. 睡眠与唤醒机制xv6 对进程同步、睡眠和唤醒都有基本支持。进程可以调用 sleep() 来暂停自身,直到特定事件发生。当另一个进程或中断处理程序更改条件时,它会使用 wakeup 来唤醒睡眠进程。
xv6 与现代操作系统的比较xv6 作为学习平台创建,其进程管理系统比当今的操作系统简单得多。xv6 中的进程以相对简单的方式进行调度,采用最简单的循环调度系统,未实现多线程和优先级。如今的操作系统,例如 Linux、Windows 和 Mac OS,拥有高度增强的调度程序;例如,Linux 中的 CFS 处理许多具有不同优先级的进程,并以最佳方式分配 CPU 时间。此外,当代系统旨在支持并与多线程应用程序、内核级别和用户级别进程隔离的实时任务配合使用。 Xv6 实现简单的分页,不使用交换或多层虚拟内存等复杂技术。它通过将物理内存与进程的虚拟地址空间关联来处理物理内存,而没有当今一些高级选项,如分页内存(当需要时才将一部分内存加载到物理内存)、共享内存或过于复杂的内存保护方案。然而,大多数当前操作系统都使用复杂的虚拟内存系统,包括内存映射文件、共享内存以及诸如写时复制 (COW) 和交换等虚拟内存方法来处理复杂的这些工作负载。 如今,与 xv6 类似,它缺乏可靠的文件系统权限、设备驱动程序和网络功能,但在安全性、设备控制和接口方面优于 xv6。另一方面,现代 OS 具有高度发达的硬件抽象,支持多种类型的外围设备,复杂的用户身份验证和多用户环境,以及强大的网络堆栈。此外,当前 OS 拥有复杂的图形用户界面 (CUIs),而 xv6 只有一个终端界面。 结论源自 Unix Version 6,它消除了 OS 中大部分的现代复杂性,以便学生能够开发 Boston,并且设计简单,可以让你专注于进程、内存、系统调用和同步的基本原理。通过 xv6,学习者可以实际了解操作系统是如何构建的,以及它如何与硬件通信或管理其他重要资源。使用 xv6 的关键收获包括
下一个话题最佳便携式操作系统 |
我们请求您订阅我们的新闻通讯以获取最新更新。