操作系统-NachOS
NachOS环境安装与简介笔记。
1. NachOS 的硬件环境
NachOS 并不运行在真实的硬件上,而是通过软件模拟一个简化的硬件环境,包括:
MIPS R2000/R3000 处理器:
- 模拟了 MIPS 的指令集(如算术指令、逻辑指令、分支指令、加载/存储指令等)。
- 模拟了 MIPS 的寄存器(如
$0
、$2
、PC
等)。 - 模拟了 MIPS 的异常处理机制(如
SyscallException
、OverflowException
等)。
内存管理:
- NachOS 模拟了物理内存和虚拟内存的地址转换。
- 支持分页机制和 TLB(Translation Lookaside Buffer)。
I/O 设备:
- 模拟了简单的控制台输入输出。
- 提供了磁盘和文件系统的模拟。
2. 为什么选择模拟 MIPS
NachOS 选择模拟 MIPS 的原因主要包括以下几点:
(1) MIPS 的简洁性
固定指令长度:
MIPS 的指令长度固定为 32 位,指令格式简单,易于解析和模拟。
NachOS 的指令解码逻辑(如
Instruction::Decode
)非常简洁:1
2
3
4rs = (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
6void 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
9case 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
3case OP_SYSCALL:
RaiseException(SyscallException, 0);
return;
(4) 内存管理
NachOS 模拟了 MIPS 的地址转换机制,包括页表和 TLB。
示例代码:
1
2
3
4
5
6
7int 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 的原因包括:
- MIPS 的简洁性: 固定指令长度和精简指令集便于教学和模拟。
- 教学目的: MIPS 是计算机体系结构课程中常用的教学架构。
- 历史背景: NachOS 基于已有的 MIPS 模拟器(MIPSSIM)开发。
- 广泛应用: 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 |
|
- 说明: 这里明确指出 NachOS 模拟的是 MIPS R2000/R3000 处理器,并且基于 Ousterhout 的 MIPSSIM 模拟器开发。
2. NachOS 模拟的指令集
NachOS 的 mipssim.cc
文件中实现了 MIPS 指令集的模拟,包括算术指令、逻辑指令、分支指令、加载/存储指令等。这些指令与 MIPS R2000/R3000 的指令集完全一致。
示例代码:
1 |
|
- 说明: 这里的
OP_ADD
是 MIPS R2000/R3000 的指令,NachOS 模拟了其行为。
3. NachOS 的寄存器模型
NachOS 模拟了 MIPS R2000/R3000 的寄存器模型,包括:
- 通用寄存器(
$0
到$31
)。 - 特殊寄存器(如
PC
、Hi
、Lo
)。 - 程序计数器(
PC
)和异常处理相关寄存器(如BadVAddrReg
)。
示例代码:
1 |
|
- 说明: NachOS 中的寄存器数量(
NumTotalRegs
)与 MIPS R2000/R3000 的寄存器数量一致。
4. NachOS 的内存管理机制
NachOS 模拟了 MIPS 的虚拟内存机制,包括页表和 TLB(Translation Lookaside Buffer)。这些机制是 MIPS R2000/R3000 处理器的重要特性。
示例代码:
1 |
|
- 说明: NachOS 模拟了 MIPS 的地址转换机制,包括页表和物理地址计算。
5. NachOS 的异常处理机制
NachOS 模拟了 MIPS 的异常处理机制,包括:
- 系统调用异常(
SyscallException
)。 - 算术溢出异常(
OverflowException
)。 - 地址错误异常(
AddressErrorException
)。
示例代码:
1 |
|
- 说明: MIPS R2000/R3000 的
syscall
指令会触发系统调用异常,NachOS 模拟了这一行为。
6. NachOS 的指令解码逻辑
NachOS 的 Instruction::Decode
函数解析 MIPS 指令的字段(如操作码、寄存器编号、立即数等),其格式与 MIPS R2000/R3000 的指令格式一致。
示例代码:
1 |
|
- 说明: MIPS 指令的固定长度为 32 位,NachOS 的解码逻辑完全符合 MIPS 的指令格式。
7. NachOS 的历史背景
NachOS 的开发者基于 Ousterhout 的 MIPSSIM 模拟器,而 MIPSSIM 是一个专门用于模拟 MIPS R2000/R3000 处理器的软件。这进一步确认了 NachOS 模拟的是 MIPS R2000/R3000。
总结
NachOS 模拟 MIPS R2000/R3000 处理器的证据包括:
- 源代码注释中明确说明。
- 模拟的指令集与 MIPS R2000/R3000 一致。
- 寄存器模型与 MIPS R2000/R3000 相同。
- 内存管理机制(页表和 TLB)符合 MIPS 的特性。
- 异常处理机制与 MIPS 的行为一致。
- 指令解码逻辑完全符合 MIPS 指令格式。
- 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 指令(如
ADD
、LW
、SW
等)都被映射为 C++ 函数中的一个case
分支。示例代码:
1
2
3
4
5
6
7
8
9case 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 个通用寄存器和特殊寄存器(如PC
、Hi
、Lo
)。示例代码:
1
2
3
4int Machine::ReadRegister(int num) {
ASSERT((num >= 0) && (num < NumTotalRegs));
return registers[num];
}- 通过
ReadRegister
和WriteRegister
函数,NachOS 模拟了寄存器的读写操作。
- 通过
(3) 内存管理模拟
NachOS 使用一个数组
mainMemory
来模拟物理内存。NachOS 的
Translate
函数模拟了 MIPS 的地址转换机制(包括页表和 TLB)。示例代码:
1
2
3
4
5
6
7int 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 的异常处理机制(如
SyscallException
、OverflowException
)。示例代码:
1
2
3case 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 的运行流程
编译 NachOS 内核:
- 使用 Linux 上的本地编译器(如
g++
)编译 NachOS 的 C++ 源代码,生成nachos
可执行文件。
- 使用 Linux 上的本地编译器(如
编译用户程序:
- 使用交叉编译器(如
mipsel-linux-gcc
)将用户程序(如add.c
)编译为 MIPS 二进制格式(如
- 使用交叉编译器(如