deeperthinker

NOS系统详细解说

NOS (Not an Operating System):极简主义的底层开发实验平台

一、项目定位与核心目标

NOS(Not an Operating System)是一个完全由个人独立开发的实验性底层软件项目,由开发者Ghadeeras于2023年在GitHub上启动开发。其核心目标是在现代硬件上复现DOS时代直接操控硬件的体验,同时探索Rust语言在低级别系统开发中的潜力。项目名称“Not an Operating System”既体现了其非完整操作系统的定位,也表达了对传统操作系统设计范式的反思——它更像是一个硬件交互的沙盒环境,而非功能完备的操作系统。

NOS的核心价值在于教育性与实验性:

• 学习目的:帮助开发者理解计算机启动流程、硬件初始化、内存管理等底层机制,例如通过编写EFI应用程序直接操作显卡、键盘等设备。

• 技术探索:验证Rust语言在无标准库环境下的硬件编程能力,例如通过Rust实现内存分配、中断处理等关键功能。

• 怀旧情怀:重现1980-1990年代MS-DOS和MSX计算机的开发体验,让开发者重新获得“完全掌控计算机”的感觉。

二、技术架构与核心模块

1. 底层硬件控制

• 启动流程:

◦ 通过UEFI固件加载,支持x86_64架构的裸机启动。

◦ 实现自定义的引导加载程序(Bootloader),负责初始化内存、建立页表、跳转到内核入口。

• 硬件抽象:

◦ 直接操作PCI设备配置空间,例如枚举显卡、声卡等设备。

◦ 实现PS/2键盘驱动,支持字符输入和扫描码解析。

◦ 实验性VGA图形驱动,支持文本模式和简单图形绘制。

2. 内存管理

• 基础内存分配:

◦ 基于链表实现简单的堆内存分配器,支持固定大小块的分配与释放。

◦ 未实现虚拟内存或分页机制,所有内存操作直接映射到物理地址。

• 内存安全:

◦ 利用Rust的所有权模型防止悬空指针和内存泄漏,但由于底层硬件操作的特殊性,部分场景需手动绕过编译器检查。

3. 开发工具链

• 编译与链接:

◦ 依赖LLVM 14.0.6生成EFI应用程序,通过rustc交叉编译为x86_64-unknown-uefi目标。

◦ 自定义链接脚本,手动布局代码段、数据段和栈空间。

• 调试工具:

◦ 使用QEMU模拟器运行,支持GDB远程调试,可单步跟踪内核代码。

◦ 实现简单的内核日志系统,通过串口输出调试信息。

三、功能特性与实验场景

1. 核心功能演示

• 硬件交互示例:

◦ 直接操作GPIO引脚控制LED灯闪烁。

◦ 通过端口I/O读取PS/2键盘扫描码并在屏幕上显示字符。

◦ 实验性实现VGA文本模式,支持彩色字符输出。

• 系统调用模拟:

◦ 定义简单的系统调用接口,例如sys_print用于输出字符串。

◦ 未实现进程调度,所有操作在单线程环境下执行。

2. 典型应用场景

• 教育用途:

◦ 作为操作系统教学的实验平台,学生可通过修改代码观察硬件行为变化。

◦ 学习Rust语言在嵌入式系统中的应用,例如编写无标准库的硬件驱动。

• 硬件逆向研究:

◦ 分析UEFI固件接口(如BS、RT服务)的调用机制。

◦ 探索x86架构的启动流程和初始化步骤。

• 复古计算体验:

◦ 在QEMU中模拟MSX计算机环境,运行复古BASIC解释器。

◦ 实现简单的命令行界面,支持类似DOS的基础命令(如dir、echo)。

四、开发实践与工具链配置

1. 环境搭建

• 依赖项:

◦ LLVM 14.0.6(用于链接EFI应用)。

◦ QEMU 7.0.0(模拟硬件环境)。

◦ POSIX兼容环境(如Git Bash for Windows)。

• 构建步骤:
git clone https://github.com/ghadeeras/nos.git
cd nos
cargo build --target x86_64-unknown-uefi
qemu-system-x86_64 -bios /usr/share/edk2/ovmf/OVMF.fd -drive format=raw,file=target/x86_64-unknown-uefi/debug/nos.efi
2. 代码结构

• 项目目录:

◦ src/main.rs:内核入口,初始化硬件并启动演示程序。

◦ src/hw:硬件驱动模块,包含PCI枚举、键盘驱动等。

◦ src/mem:内存管理模块,实现简单的堆分配器。

◦ src/uefi:UEFI服务封装,提供EFI API的Rust绑定。

• 关键代码片段:
// 读取PS/2键盘扫描码
unsafe fn read_scan_code() -> u8 {
    let status = port_read(0x64);
    while (status & 0x01) == 0 {
        status = port_read(0x64);
    }
    port_read(0x60)
}

// 向VGA文本缓冲区写入字符
unsafe fn vga_write_char(x: u16, y: u16, c: char, color: u8) {
    let addr = 0xb8000 + (y * 80 + x) * 2;
    *(addr as *mut u8) = c as u8;
    *(addr.wrapping_add(1) as *mut u8) = color;
}
五、与其他系统的对比
特性 NOS Redox OS HelenOS 
设计目标 教育实验、硬件操控体验 安全可靠的类Unix微内核系统 模块化微内核研究平台 
编程语言 Rust Rust C++为主,部分Rust 
硬件兼容性 x86_64 x86_64、ARM x86、ARM、SPARC等8种架构 
功能完整性 极简,仅实现基础硬件交互 完整的用户空间工具链和图形系统 支持文件系统、网络栈等复杂功能 
典型应用 教学、硬件逆向、复古计算 安全关键系统、嵌入式开发 教育研究、工业控制 

从对比可见,NOS在极简性和底层硬件控制上具有独特优势,而Redox和HelenOS更注重系统的完整性和实用性。

六、挑战与未来方向

1. 当前局限性

• 功能缺失:

◦ 无文件系统、网络栈等高级功能。

◦ 单线程执行,无进程调度和多任务支持。

• 硬件支持有限:

◦ 仅支持x86_64架构,缺乏ARM等嵌入式平台适配。

◦ USB、网络等现代外设驱动缺失。

• 开发文档不足:

◦ 缺乏详细的API文档和开发指南,学习门槛较高。

2. 未来发展计划

• 功能扩展:

◦ 实现FAT文件系统,支持从U盘加载程序。

◦ 开发简单的TCP/IP协议栈,支持网络通信。

• 架构优化:

◦ 引入多线程支持,探索Rust的no_std并发模型。

◦ 实验性实现虚拟内存和分页机制。

• 社区建设:

◦ 发布详细的开发教程,降低参与门槛。

◦ 建立开发者论坛,鼓励贡献驱动和应用移植。

七、总结

NOS不仅是一个技术项目,更是对操作系统开发本质的回归。它通过极简的设计和Rust语言的安全性,为开发者提供了一个直接与硬件对话的平台,让我们重新思考“操作系统”的定义。尽管功能尚不完善,但其教育价值和实验意义不可忽视。正如项目README所述:「NOS的目标不是成为一个操作系统,而是让开发者重新体验掌控计算机的乐趣。」对于想要深入理解计算机底层机制的学习者来说,NOS是一个理想的起点——它让我们在代码中触摸硬件,在实验中探索系统的边界。

posted on 2025-06-08 21:56  gamethinker  阅读(12)  评论(0)    收藏  举报  来源

导航