RISC-V:跟着清华训练营从零打造OS【第三课】

上一节回顾

RISC-V:跟着清华训练营从零打造OS【第二课】中,我们主要讨论了批处理系统的设计和多道程序与分时任务设计。批处理系统将多个程序打包一起输入计算机并逐个执行,而多道程序系统可以交错地执行多个程序,提高系统利用率。同时,介绍了特权级机制的实现和硬件中断机制的作用。最后,通过一个有趣的比喻解释了中断模式下CPU的处理方式。

地址空间

多道程序与分时多任务设计中,为了提高计算机系统整体性能,操作系统会在一个应用程序执行一段时间后,暂停该程序并切换至另一个应用程序执行。随后,在指定的时刻,操作系统再将控制权切换回原应用,使其继续执行。这种机制实现了内核的核心功能 —— 任务切换。对于每个应用程序来说,它始终认为自己独占处理器资源,但这只是内核对处理器资源进行恰当抽象所产生的一种错觉。实际上,操作系统在动态分配和切换任务时,保证了各个应用程序在处理器上的执行顺序和时间片。

本节通过利用硬件的分页机制,实现了内核的安全核心机制 —— 内存隔离,构建了一种经典的抽象 —— 地址空间。这种机制使得应用程序在操作系统管控的内存空间中执行,替代了过去应用程序对物理内存的直接访问方式。

由此,每个应用都独占一个访问空间,与其他应用相互隔离。这是通过内核设置应用的页表来确保不同应用的数据(不包括共享数据)在物理内存区域不相交。这样一来,开发者在编写应用程序时无需考虑其他应用的影响,从而确保了整个系统的安全性。

AddressSpaceOS

从上图可以看出,头甲龙操作系统(Address Space OS)为了提高操作系统和应用程序执行的安全性,加强了内存管理能力,并提供地址空间隔离机制。这一机制为应用程序的内存地址空间设立边界,防止其越界访问操作系统和其他应用程序。

在具体实现上,操作系统扩展了 TaskManager 的管理范围,使得每个任务的上下文(Task Context)包括任务地址空间。在进行任务切换时,也会切换相应的地址空间。新增的内存管理模块主要涉及与内核中动态内存分配相关的页帧分配堆分配,以及表示应用程序地址空间的 Apps MemSets 类型和内核自身地址空间的 Kernel MemSet 类型。

MemSet 类型包含的页表(PageTable)建立了虚实地址映射关系,而MemArea 表示任务的合法空间范围。这种设计确保了操作系统在内存管理方面的高效性和安全性,有利于提高整个系统的稳定性和性能。通过这些改进,开发者可以更安心地开发和部署应用程序,用户也可以享受到更为稳定和安全的操作系统环境。

由于代表应用程序运行的任务和管理应用的操作系统各自拥有独立的页表和虚拟地址空间,因此在操作系统的设计和实现过程中需面临两个挑战。

  • 挑战一:页表切换。由于系统调用、中断或异常导致的应用程序和操作系统之间的上下文切换变得复杂。在处理这些过程时,需要切换页表。此外,还需对来自用户态和内核态的异常/中断进行分别处理。

MIT-6.828-SV39-address-trans

  • 挑战二:访问不同地址空间的数据时需要查页表。在内核地址空间中执行的内核代码经常需要读写应用程序地址空间中的数据,这并不仅仅是通过一次访存就能解决的问题。而是需要手动查找用户态应用程序的地址空间页表,知道用户态应用程序的虚地址对应的物理地址后,再将其转换为对应的内核态虚地址,以便访问应用程序地址空间中的数据。如果访问应用程序地址空间中的数据跨了多个页,还需要注意处理地址的边界条件。

MMU-PageTable

在本节中,我们用了大半节课的时间讲解了地址转换。总的来说,在设计和实现操作系统时,必须克服这两个挑战,确保系统在处理不同地址空间的数据访问和上下文切换时具有稳定性和高效性。通过这些改进,我们可以为应用程序提供更流畅、更安全的运行环境。

地址转换是操作系统中至关重要的一个环节,它涉及到应用程序与操作系统之间的交互。为了实现这一目标,我们需要充分了解并克服相关挑战,从而确保操作系统的性能和稳定性。通过不断完善和优化地址转换机制,我们可以为应用程序提供更优质、更可靠的运行平台。

进程和进程管理

鉴于课程时间紧张,本节课老师主要讲解了进程的相关知识,并且采用 Rust 语言的 fork 库展示了进程创建及其效果。以下是对结合自学材料的后续记录,以供进一步学习参考。

迄今为止,所有应用程序均在内核初始化阶段一并加载到内存中,且无法在运行过程中动态增删。从一般用户的角度来看,地址空间批处理系统似乎没有太大差别。然而,实际上,由于我们尚未充分利用硬件机制和抽象概念,应用程序的开发和应用仍受限制,用户在应用运行过程中的动态控制能力也相对较弱。

实际上,用户与操作系统之间可以建立一个交互界面。在应用程序执行过程中,用户可以通过该界面主动向操作系统发出请求,创建并执行新应用程序,暂停或停止应用程序的执行等。这将极大提高用户在应用程序运行过程中的动态控制能力,进一步发挥硬件资源和操作系统功能的潜力。通过这个交互界面,用户可以更灵活地管理和调度应用程序,以满足不同场景和需求。从而实现对系统资源的高效利用,提升用户体验。

ProcessOS

从上图可以看出,伤齿龙操作系统 ProcessOS 在内部结构上并无重大更改,但将任务抽象升级为进程抽象。其主要改动集中在进程管理功能方面,即通过提供新的系统调用服务:sys_fork(用于创建子进程)、sys_waitpid(用于等待子进程结束并回收子进程资源)、sys_exec(用新的应用内容覆盖当前进程,实现执行新应用的目标)。

为了让用户能够输入命令或执行程序名称,ProcessOS 还增加了一个 read 系统调用服务。用户可以通过操作系统的命令行接口 —— 新添加的 shell 应用程序发出命令,动态地执行各种新应用,从而提高用户与操作系统之间的交互能力。

总之,通过对进程管理功能的改进和优化,ProcessOS 为用户提供了更为便捷、高效的操作系统环境,使用户能够更轻松地执行各种应用程序,提升操作系统与用户之间的交互体验。

PCB

根据上图,我们可以看到进程控制块 TaskControlBlock 包含了与进程运行、切换、调度以及地址空间相关的各种资源和信息。原先的任务管理器 TaskManager 已被拆分为处理器管理结构 Processor 和新的任务管理器 TaskManager

  • 处理器管理结构 Processor 负责管理正在执行任务以及与之相关的信息
  • 新的任务管理器 TaskManager 仅负责管理未执行的所有任务,以及各种与进程管理相关的系统调用服务

这样的调整使得任务管理和处理器管理更加分工明确,有利于提高操作系统的运行效率和性能。通过优化 TaskControlBlock 的设计和使用,可以为进程提供更为稳定、高效的运行环境,同时简化用户与操作系统之间的交互。

未完待续 … …

以上就是关于 [清华开源操作系统训练营] 第三课学到的知识,希望对您有所帮助。祝大家玩得开心 ^_^

如果您喜欢这篇文章,欢迎关注微信公众号《猿禹宙》、点赞、转发和赞赏。每一位读者的认可都是我持续创作的动力。

公众号