操作系统-NachOS

NachOS环境安装与简介笔记。

1. NachOS 的硬件环境

NachOS 并不运行在真实的硬件上,而是通过软件模拟一个简化的硬件环境,包括:

  • MIPS R2000/R3000 处理器:

    • 模拟了 MIPS 的指令集(如算术指令、逻辑指令、分支指令、加载/存储指令等)。
    • 模拟了 MIPS 的寄存器(如 $0$2PC 等)。
    • 模拟了 MIPS 的异常处理机制(如 SyscallExceptionOverflowException 等)。
  • 内存管理:

    • NachOS 模拟了物理内存和虚拟内存的地址转换。
    • 支持分页机制和 TLB(Translation Lookaside Buffer)。
  • I/O 设备:

    • 模拟了简单的控制台输入输出。
    • 提供了磁盘和文件系统的模拟。

2. 为什么选择模拟 MIPS

NachOS 选择模拟 MIPS 的原因主要包括以下几点:

(1) MIPS 的简洁性

  • 固定指令长度:

    • MIPS 的指令长度固定为 32 位,指令格式简单,易于解析和模拟。

    • NachOS 的指令解码逻辑(如 Instruction::Decode)非常简洁:

      1
      2
      3
      4
      rs = (value >> 21) & 0x1f;
      rt = (value >> 16) & 0x1f;
      rd = (value >> 11) & 0x1f;
      extra = value & 0xffff;
  • RISC 架构:

    • MIPS 是一种 RISC(精简指令集计算机)架构,指令集小而精简,便于教学和模拟。
    • NachOS 的设计目标是教学,因此选择了易于理解的 MIPS 架构。

(2) 教学目的

  • NachOS 是一个教学操作系统,旨在帮助学生理解操作系统的基本原理。
  • MIPS 是许多计算机体系结构课程中常用的教学架构,学生对其指令集和行为较为熟悉。
  • 模拟 MIPS 可以让学生专注于操作系统的设计,而无需处理复杂的硬件细节。

(3) MIPS 的广泛应用

  • 在 NachOS 开发时(20 世纪 90 年代),MIPS 是一种流行的嵌入式处理器架构,广泛应用于路由器、游戏机等设备。
  • 模拟 MIPS 可以让学生了解一种实际使用的处理器架构。

(4) NachOS 的历史背景

  • NachOS 的开发者选择 MIPS 是因为当时的 MIPS 模拟器(如 Ousterhout 的 MIPSSIM)已经存在,NachOS 可以直接基于这些模拟器进行开发。

  • NachOS 的 mipssim.cc 文件中明确提到:

    1
    2
    // mipssim.cc -- simulate a MIPS R2/3000 processor
    // This code has been adapted from Ousterhout's MIPSSIM package.

3. NachOS 如何模拟 MIPS

NachOS 的 MIPS 模拟器主要由以下部分组成:

(1) 指令解码

  • NachOS 使用 Instruction::Decode 函数解析 MIPS 指令的字段(如操作码、寄存器编号、立即数等)。

  • 示例代码:

    1
    2
    3
    4
    5
    6
    void Instruction::Decode() {
    rs = (value >> 21) & 0x1f; // 源寄存器
    rt = (value >> 16) & 0x1f; // 目标寄存器
    rd = (value >> 11) & 0x1f; // 结果寄存器
    extra = value & 0xffff; // 偏移量或立即数
    }

(2) 指令执行

  • NachOS 使用 Machine::OneInstruction 函数模拟 MIPS 指令的执行。

  • 示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    case OP_ADD:
    sum = registers[instr->rs] + registers[instr->rt];
    if (!((registers[instr->rs] ^ registers[instr->rt]) & SIGN_BIT) &&
    ((registers[instr->rs] ^ sum) & SIGN_BIT)) {
    RaiseException(OverflowException, 0);
    return;
    }
    registers[instr->rd] = sum;
    break;

(3) 异常处理

  • NachOS 模拟了 MIPS 的异常处理机制,例如系统调用异常(SyscallException)和算术溢出异常(OverflowException)。

  • 示例代码:

    1
    2
    3
    case OP_SYSCALL:
    RaiseException(SyscallException, 0);
    return;

(4) 内存管理

  • NachOS 模拟了 MIPS 的地址转换机制,包括页表和 TLB。

  • 示例代码:

    1
    2
    3
    4
    5
    6
    7
    int Machine::Translate(int virtAddr, int* physAddr, int size, bool writing) {
    unsigned int vpn = (unsigned) virtAddr / PageSize;
    unsigned int offset = (unsigned) virtAddr % PageSize;
    TranslationEntry* entry = &pageTable[vpn];
    *physAddr = entry->physicalPage * PageSize + offset;
    return TRUE;
    }

4. 总结

NachOS 的硬件环境是一个模拟的 MIPS R2000/R3000 处理器,选择模拟 MIPS 的原因包括:

  1. MIPS 的简洁性: 固定指令长度和精简指令集便于教学和模拟。
  2. 教学目的: MIPS 是计算机体系结构课程中常用的教学架构。
  3. 历史背景: NachOS 基于已有的 MIPS 模拟器(MIPSSIM)开发。
  4. 广泛应用: MIPS 在嵌入式系统中有广泛的实际应用。

通过模拟 MIPS,NachOS 为学生提供了一个简化的硬件环境,帮助他们专注于操作系统的设计和实现。

Similar code found with 1 license type

CMoments: NachOS 的硬件环境是一个模拟的 MIPS R2000/R3000 处理器 如何确认这一点?

GitHub Copilot: 可以通过以下几个方面确认 NachOS 的硬件环境是一个模拟的 MIPS R2000/R3000 处理器:


1. NachOS 源代码中的明确说明

在 NachOS 的代码注释中,明确提到 NachOS 模拟的是 MIPS R2000/R3000 处理器。例如,在 mipssim.cc 文件的开头注释中:

1
2
// mipssim.cc -- simulate a MIPS R2/3000 processor
// This code has been adapted from Ousterhout's MIPSSIM package.
  • 说明: 这里明确指出 NachOS 模拟的是 MIPS R2000/R3000 处理器,并且基于 Ousterhout 的 MIPSSIM 模拟器开发。

2. NachOS 模拟的指令集

NachOS 的 mipssim.cc 文件中实现了 MIPS 指令集的模拟,包括算术指令、逻辑指令、分支指令、加载/存储指令等。这些指令与 MIPS R2000/R3000 的指令集完全一致。

示例代码:

1
2
3
4
5
6
7
8
9
case OP_ADD:  // 模拟 MIPS 的 ADD 指令
sum = registers[instr->rs] + registers[instr->rt];
if (!((registers[instr->rs] ^ registers[instr->rt]) & SIGN_BIT) &&
((registers[instr->rs] ^ sum) & SIGN_BIT)) {
RaiseException(OverflowException, 0);
return;
}
registers[instr->rd] = sum;
break;
  • 说明: 这里的 OP_ADD 是 MIPS R2000/R3000 的指令,NachOS 模拟了其行为。

3. NachOS 的寄存器模型

NachOS 模拟了 MIPS R2000/R3000 的寄存器模型,包括:

  • 通用寄存器($0$31)。
  • 特殊寄存器(如 PCHiLo)。
  • 程序计数器(PC)和异常处理相关寄存器(如 BadVAddrReg)。

示例代码:

1
2
3
4
int Machine::ReadRegister(int num) {
ASSERT((num >= 0) && (num < NumTotalRegs));
return registers[num];
}
  • 说明: NachOS 中的寄存器数量(NumTotalRegs)与 MIPS R2000/R3000 的寄存器数量一致。

4. NachOS 的内存管理机制

NachOS 模拟了 MIPS 的虚拟内存机制,包括页表和 TLB(Translation Lookaside Buffer)。这些机制是 MIPS R2000/R3000 处理器的重要特性。

示例代码:

1
2
3
4
5
6
7
int Machine::Translate(int virtAddr, int* physAddr, int size, bool writing) {
unsigned int vpn = (unsigned) virtAddr / PageSize;
unsigned int offset = (unsigned) virtAddr % PageSize;
TranslationEntry* entry = &pageTable[vpn];
*physAddr = entry->physicalPage * PageSize + offset;
return TRUE;
}
  • 说明: NachOS 模拟了 MIPS 的地址转换机制,包括页表和物理地址计算。

5. NachOS 的异常处理机制

NachOS 模拟了 MIPS 的异常处理机制,包括:

  • 系统调用异常(SyscallException)。
  • 算术溢出异常(OverflowException)。
  • 地址错误异常(AddressErrorException)。

示例代码:

1
2
3
case OP_SYSCALL:
RaiseException(SyscallException, 0);
return;
  • 说明: MIPS R2000/R3000 的 syscall 指令会触发系统调用异常,NachOS 模拟了这一行为。

6. NachOS 的指令解码逻辑

NachOS 的 Instruction::Decode 函数解析 MIPS 指令的字段(如操作码、寄存器编号、立即数等),其格式与 MIPS R2000/R3000 的指令格式一致。

示例代码:

1
2
3
4
5
6
void Instruction::Decode() {
rs = (value >> 21) & 0x1f; // 源寄存器
rt = (value >> 16) & 0x1f; // 目标寄存器
rd = (value >> 11) & 0x1f; // 结果寄存器
extra = value & 0xffff; // 偏移量或立即数
}
  • 说明: MIPS 指令的固定长度为 32 位,NachOS 的解码逻辑完全符合 MIPS 的指令格式。

7. NachOS 的历史背景

NachOS 的开发者基于 Ousterhout 的 MIPSSIM 模拟器,而 MIPSSIM 是一个专门用于模拟 MIPS R2000/R3000 处理器的软件。这进一步确认了 NachOS 模拟的是 MIPS R2000/R3000。


总结

NachOS 模拟 MIPS R2000/R3000 处理器的证据包括:

  1. 源代码注释中明确说明。
  2. 模拟的指令集与 MIPS R2000/R3000 一致。
  3. 寄存器模型与 MIPS R2000/R3000 相同。
  4. 内存管理机制(页表和 TLB)符合 MIPS 的特性。
  5. 异常处理机制与 MIPS 的行为一致。
  6. 指令解码逻辑完全符合 MIPS 指令格式。
  7. NachOS 基于 MIPSSIM 开发,而 MIPSSIM 专门模拟 MIPS R2000/R3000。

通过这些特性,可以确认 NachOS 的硬件环境是一个模拟的 MIPS R2000/R3000 处理器。

Similar code found with 1 license type

Q: 可是我的硬件环境明明是Linux Ubuntu,怎么实现MIPS R2000/R3000处理器的?

你的硬件环境确实是 Linux Ubuntu,但 NachOS 并不直接依赖你的物理硬件来运行 MIPS 指令。NachOS 是通过 软件模拟 的方式,在你的 Linux 环境中模拟了一个 MIPS R2000/R3000 处理器。这种模拟是通过 NachOS 的代码实现的,而不是依赖你的实际硬件。


1. NachOS 如何模拟 MIPS 处理器

NachOS 使用软件模拟的方式,在 Linux 环境中实现了 MIPS R2000/R3000 的行为。以下是关键点:

(1) 指令集模拟

  • NachOS 的 mipssim.cc 文件实现了 MIPS 指令集的模拟。

  • 每条 MIPS 指令(如 ADDLWSW 等)都被映射为 C++ 函数中的一个 case 分支。

  • 示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    case OP_ADD:
    sum = registers[instr->rs] + registers[instr->rt];
    if (!((registers[instr->rs] ^ registers[instr->rt]) & SIGN_BIT) &&
    ((registers[instr->rs] ^ sum) & SIGN_BIT)) {
    RaiseException(OverflowException, 0);
    return;
    }
    registers[instr->rd] = sum;
    break;
    • 这里的 OP_ADD 是 MIPS 的加法指令,NachOS 使用 C++ 模拟了其行为。

(2) 寄存器模拟

  • NachOS 使用一个数组 registers 来模拟 MIPS 的 32 个通用寄存器和特殊寄存器(如 PCHiLo)。

  • 示例代码:

    1
    2
    3
    4
    int Machine::ReadRegister(int num) {
    ASSERT((num >= 0) && (num < NumTotalRegs));
    return registers[num];
    }
    • 通过 ReadRegisterWriteRegister 函数,NachOS 模拟了寄存器的读写操作。

(3) 内存管理模拟

  • NachOS 使用一个数组 mainMemory 来模拟物理内存。

  • NachOS 的 Translate 函数模拟了 MIPS 的地址转换机制(包括页表和 TLB)。

  • 示例代码:

    1
    2
    3
    4
    5
    6
    7
    int Machine::Translate(int virtAddr, int* physAddr, int size, bool writing) {
    unsigned int vpn = (unsigned) virtAddr / PageSize;
    unsigned int offset = (unsigned) virtAddr % PageSize;
    TranslationEntry* entry = &pageTable[vpn];
    *physAddr = entry->physicalPage * PageSize + offset;
    return TRUE;
    }

(4) 异常处理模拟

  • NachOS 模拟了 MIPS 的异常处理机制(如 SyscallExceptionOverflowException)。

  • 示例代码:

    1
    2
    3
    case OP_SYSCALL:
    RaiseException(SyscallException, 0);
    return;

2. 为什么 NachOS 可以在 Linux 上运行

NachOS 是一个用户态程序,它运行在 Linux 操作系统上,并通过 C++ 代码模拟了 MIPS 的硬件行为。以下是实现的关键点:

(1) NachOS 是一个用户态程序

  • NachOS 本身是一个用 C++ 编写的程序,编译后生成一个可执行文件(如 nachos)。
  • 这个可执行文件运行在 Linux 用户态,使用 Linux 提供的系统调用(如文件操作、内存分配等)。

(2) MIPS 的行为通过软件模拟

  • NachOS 并不依赖你的物理硬件是否支持 MIPS 指令集,而是通过 C++ 代码模拟了 MIPS 的行为。
  • 例如,MIPS 的指令解码、执行、寄存器操作等,全部由 NachOS 的代码实现。

(3) 使用交叉编译器生成 MIPS 二进制

  • NachOS 的用户程序(如 add.c)需要编译为 MIPS 二进制格式(COFF 文件)。
  • 在 Linux 上,使用交叉编译器(如 mipsel-linux-gcc)将用户程序编译为 MIPS 指令集的二进制文件。
  • NachOS 加载这些 MIPS 二进制文件,并通过模拟器执行其中的指令。

3. NachOS 的运行流程

  1. 编译 NachOS 内核:

    • 使用 Linux 上的本地编译器(如 g++)编译 NachOS 的 C++ 源代码,生成 nachos 可执行文件。
  2. 编译用户程序:

    • 使用交叉编译器(如 mipsel-linux-gcc)将用户程序(如 add.c)编译为 MIPS 二进制格式(如

操作系统-NachOS
https://43.242.201.154/2025/04/23/Operating-System1/
Author
Dong
Posted on
April 23, 2025
Licensed under