Loading...

1.Introduction

BLITZ系统是一个软件集合,旨在支持大学级别的操作系统课程。在一两个学期的课程中,学生将实现一个小,但完整的操作系统内核。BLITZ软件为这些学生项目提供了框架。


2.The Components of BLITZ

BLITZ系统由以下组件组成:

  • BLITZ Processor Architecture
  • Virtual Machine (Emulator)
  • Assembler
  • Linker
  • KPL Programming Language
  • KPL Compiler
  • Specifications for the Student Project
  • Support Code for the Projects
  • Documentation

3.Background and Context

操作系统内核在裸机[Bare Machine是指没有操作系统的计算机硬件] 上运行,不运行其他软件。然而,开发一个在裸机上执行的程序对于大学级别的课程来说是不切实际的,原因有几个:

  • 首先,现代处理器太复杂了,学生不可能随时掌握,需要自己掌握课程。特别是,操作系统内核必须关注I/O和内存管理硬件的细节,这需要详细的、专门的专业知识。
  • 其次,很难在裸机上开发和调试软件。如果没有复杂的跨平台开发环境,编译、加载、执行和调试的基本步骤就会变得非常困难。
  • 第三,大多数学生没有额外的裸机来进行实验。今天的计算机已经装满了操作系统和重要的用户数据。尝试直接读写磁盘的软件不是一个合理的选择。

针对这些困难,OS课程采取了几种替代方法:

  • 首先,学生被要求创建和/或实验一个“shell”程序
  • 其次,要求学生单独模拟和测量各种操作系统算法(如调度算法)
  • 第三,要求学生检查和/或修改一个实际操作系统的一小部分(例如,修改Linux设备驱动程序)

尽管如此,许多学生在实践中学习,实现一个完整的(如果是最小的)内核是无可替代的。


4.The BLITZ Approach

BLITZ软件提供了一个虚拟机供学生使用。该系统包括一个CPU结构。这个虚拟CPU类似于我们熟悉的处理器,如PowerPC、Pentium、Sun Sparc等,只是它稍微简化了一些。

没有真正的BLITZ计算机。相反,机器是虚拟的。一个软件,称为BLITZ“模拟器”或“虚拟机”,模拟BLITZ计算机。模拟器在主机上运行,如Unix机器或Apple Macintosh。

学生将在主机上编辑、编译和链接他们的操作系统内核项目。然后他们将使用模拟器在虚拟机上执行它们。当学生代码出现错误时,模拟器将显示各种错误消息,学生可以在调试过程中使用模拟器工具。


5.The BLITZ Architecture

CPU是RISC[RISC是Reduced Instruction Set Computer的缩写,即精简指令集计算机。它是一种执行较少类型计算机指令的微处理器] 设计,松散地模仿了Sun的Sparc体系结构。BLITZ处理器包含32个32位的通用整数寄存器。该处理器还包含32个双精度浮点寄存器,以及一些其他特殊用途的寄存器,如“状态寄存器”、“程序计数器”和一些页表寄存器。

处理器以两种模式之一执行,称为“系统模式”和“用户模式”。内核代码将运行在系统模式,而应用程序将运行在用户模式。模式的使用可以保护内核代码不受恶意用户程序的攻击。用户程序执行特权指令的任何尝试都将被CPU捕获,并导致进入内核的陷阱。

操作系统内核将为每个用户程序提供一个虚拟地址空间。由于每个用户程序运行在自己的虚拟地址空间中,多个不同的用户程序可以同时运行,而不会相互影响或干扰。为支持内核对虚拟地址空间的实现,CPU包括一个内存管理单元和页表。真正的页表硬件可能相当复杂。虽然BLITZ的设计更简单,但它仍然容纳了“脏位”、“参考位”、“可写位”、“有效位”以及逻辑到物理的映射。BLITZ架构可以容纳高达16 mb的虚拟地址空间和高达4 gb的物理内存。

BLITZ机器包括2个输入输出设备

  • 磁盘:模拟器通过使用主机上的文件来模拟磁盘。换句话说,磁盘数据存储在主机文件中。当在BLITZ机器上运行的程序从BLITZ磁盘读取或写入扇区时,数据将从主机文件系统上的文件传输到文件中。闪电盘包括轨道和扇区和仿真器模型寻道,旋转,定居和转移时间,以及瞬态磁盘错误。磁盘数据使用DMA(直接内存访问)被传输。
  • 终端:内核和用户程序可以使用终端与人类用户通信。BLITZ终端是一个面向字符的串行设备,如RS-232接口。ASCII字符码是异步发送和接收的,每次一个。模拟器通常将终端I/O直接传递到主机的用户界面,因此学生可以直接与正在运行的BLITZ代码进行交互,但终端I/O也可以定向到主机文件,以方便自动化测试。

串行和磁盘单元都是通过内存映射的I/O寄存器控制的。两个设备都用硬件中断来表示I/O的完成。

CPU支持多种中断,包括异步硬件中断(如磁盘、终端和定时器中断)和同步程序异常(如“页无效”、“特权指令违反”、“对齐异常”和“地址/总线错误”)。此外,该体系结构还包括一个软件“trap”指令,用户程序可以执行该指令。trap指令允许用户进程进入内核,就像调用内核例程期间发生的那样。

BLITZ体系结构旨在逼真地模拟现有处理器。由于目标是让学生学习内核如何与底层硬件交互;BLITZ模型足够现实,可以实现操作系统内核。理论上,Blitz处理器可以用硅制造,学生操作系统的代码可以直接在这台机器上运行,而不是被模拟.

尽管如此,与真正的处理器相比,BLITZ架构已经进行了简化,但这并不影响项目的目标。真正的处理器对执行性能进行了高度优化,这增加了极大的复杂性。相比之下,BLITZ体系结构不包括任何硬件内存缓存或指令流水线,因为这些特性并不影响对操作系统基本概念的理解。BLITZ系统包括一个磁盘和一个终端设备,但是避免了I/O设备和驱动程序的巨大复杂性。BLITZ架构有单词对齐的要求,但没有半单词对齐或双单词对齐的要求。尽管BLITZ指令集比大多数实际处理器简单,但BLITZ处理器有113个不同的机器指令操作码,代表49个不同的指令。

尽管如此,与真正的处理器相比,BLITZ架构已经进行了简化,但这并不影响项目的目标。真正的处理器对执行性能进行了高度优化,这增加了极大的复杂性。相比之下,BLITZ体系结构不包括任何硬件内存缓存或指令流水线,因为这些特性并不影响对操作系统基本概念的理解。BLITZ系统包括一个磁盘和一个终端设备,但是避免了I/O设备和驱动程序的巨大复杂性。BLITZ架构有单词对齐的要求,但没有半单词对齐或双单词对齐的要求。尽管BLITZ指令集比大多数实际处理器简单,但BLITZ处理器有113个不同的机器指令操作码,代表49个不同的指令。


6.The BLITZ Tools

以下软件组成了BLITZ系统:

  • blitz:BLITZ虚拟机模拟器和调试器
  • asm:BLITZ汇编器
  • lddd: BLITZ链接器
  • dumpObj:检查BLITZ对象和可执行文件的工具
  • diskUtil:用于操作模拟BLITZ磁盘上的初始文件系统的工具
  • kpl:KPL编译器

此外,还提供了操作系统内核项目的一些代码。编写一个完整的操作系统内核是一项艰巨的任务。学生将编写额外的代码,并将其与提供的代码链接,以生成他们的内核。


7.KPL: A Kernel Programming Language

BLITZ系统使用一种名为“KPL”的高级编程语言。这门语言是专为BLITZ OS项目中的学生设计的。

在某些方面,KPL语言是类似于“C”或“c++”的低级语言。该语言允许程序员直接使用指针,并直接管理和操作内存。该语言还有助于与BLITZ汇编代码程序的交叉链接。KPL允许程序员使用指向函数的指针,这在实现线程时很有用。

在其他方面,KPL语言是类似Java的高级语言。它包括对象、类和接口。该语言还包括参数化类的机制。(参数化的类在c++中称为“模板类”。)

KPL包含一个try-throw-catch机制,类似于Java的try-throw-catch机制。

KPL支持单独编译的组件,称为“包”。每个包由一个规范和一个实现组成。一个包可以使用其他包,在这种情况下,一个包的组件可以在另一个包中使用。每次编译都处理单个包的实现,尽管会参考其他包的规范部分。该系统包含一种机制,以确保每个实现都匹配其规范,并且所有包都使用当前最新的规范进行编译,防止使用过时的模块,并强制要求可执行文件必须由一致编译的部分组成。

KPL语言的哲学源于学生使用它来创建他们的操作系统内核项目代码。最重要的是易于编程和调试。因此,我们付出了巨大的努力来捕获所有编程错误,尽早捕获它们,并生成清晰而有意义的错误消息。例如,在运行时,系统会检查所有指针的使用(指针必须是非空的)和所有数组访问(没有越界索引)。在运行时还需要做一些额外的工作,以便错误消息能够提供准确的源代码行号,并清楚地显示变量的值。

当学生创建他们的操作系统内核代码时,他们将使用现有的支持代码,这些代码以预先编写的KPL包的形式提供。KPL语言的包规范在帮助学生理解现有代码以及提供学生要创建的实现的清晰和明确的要求方面特别重要。由于学生需要阅读和理解现有的KPL代码,语言语法被设计为尽可能地提高可读性和清晰度。


8.The OS Project

在操作系统课程的过程中,学生将被期望为BLITZ架构创建一个操作系统内核。完整的操作系统设计和一些支持代码将提供给他们。它们的任务将是:

  • 理解总体设计
  • 理解现有的支持代码
  • 创建新的代码来完成内核

OS项目被分解为几个编程项目。每个编程项目将花费大约2周的时间,并将在早期项目的基础上构建:

  • 线程和并发编程:由于这是学生们对BLITZ系统的第一次介绍,这个项目由几个部分组成。为学生提供“线程包”;在第一部分中,学生运行包并进行小的增量更改。然后,学生将实现几个常见的并发编程问题的解决方案,如"就餐哲学家"和"生产者-消费者"。在这个项目中,学生将体验信号量、锁和监视器的概念。
  • 用户级线程的实现:介绍了内核代码(运行在系统模式下)和用户代码(运行在用户模式下)的区别。
  • 虚拟内存:用户级程序现在将在自己的虚拟地址空间中运行。该项目需要内核维护页表和处理缺页异常。
  • 将文件系统添加到正在增长的操作系统中:用户级程序现在能够调用内核例程来读写文件。操作系统将在磁盘操作中处理这些请求,并对它们进行调度。

9.Documentation

以下文件描述了BLITZ系统:

  • BLITZ计算机硬件概述(8页): 本文档介绍了模拟CPU和I/O设备的体系结构。
  • BLITZ架构(71页): 本文档介绍BLITZ处理器的硬件。它包括有关CPU寄存器、指令集体系结构和BLITZ汇编语言的信息。
  • BLITZ汇编程序示例(7页): 这是一个竞争,独立的闪电战汇编程序。这个程序可以作为BLITZ工具的测试和模拟器的使用介绍。
  • BLITZ指令集(4页):本文档包含每一个BLITZ机器指令的详细信息。它主要是汇编语言程序员感兴趣的。
  • BLITZ模拟器(44页): 本文档描述了BLITZ虚拟机模拟器和调试器。它展示了如何运行BLITZ程序,并描述了所有可用的调试命令。它还包括关于磁盘和终端I/O设备的详细信息。
  • 核心编程语言KPL概述(66页): 本文档描述了“KPL”高级编程语言。
  • KPL的上下文无关文法(7页):该文档包含KPL语法的形式规范,可以用作语法问题的快速参考。
  • BLITZ对象和可执行文件的格式(13页):本文档描述了汇编器和链接器生成的文件。这份文件可能对学生有一定的兴趣,但不是必需的。
  • BLITZ工具:帮助信息(12页):每个BLITZ工具都会产生一些“帮助”信息;本文档从每个工具中收集此类信息。本文档还包括BLITZ汇编语言程序语法的详细信息。
  • BLITZ指令集-排序列表(4页):这份文件列出了所有闪电战的机器指令。这个列表首先按指令名称的字母顺序排列,然后按操作码的数字顺序排列。它主要是汇编语言程序员感兴趣的。
  • BLITZ混杂 技术说明(8页):本文档包含许多杂项的注释和说明。这份文件可能对学生有一定的兴趣,但不是必需的。
  • BLITZ汇编程序(20页):本文档介绍BLITZ汇编工具。这份文件可能对学生有一定的兴趣,但不是必需的。
  • 线程调度器和并发控制原语(41页):本文以BLITZ系统中的调度器为例,描述了内核线程调度器的工作原理。它针对的是刚刚学习内核概念的人。不需要熟悉BLITZ系统,也不需要了解本文档。从事BLITZ内核项目的学生并不需要该文档,但它可能对从事项目2和3的学生有所帮助