码桶

发现社区成员的开源项目

朹方 /

moeos

公开
main
moeos/README.md
README.md5.9 KB
<p align="center">
  <img src="./screenshots/logo-small.jpg" width="400" />
</p>


<h1 align="center">MoeOS</h1>

<p align="center">
  <b>M</b>inimal <b>O</b>pen <b>E</b>xperimental <b>O</b>perating <b>S</b>ystem
</p>

<p align="center">
  A 32-bit hobby operating system built from scratch in C++.
</p>

---

<p align="center">
  🌐 <a href="README.en.md"><strong>English</strong></a> | <strong>简体中文</strong>
</p>

---

MoeOS 是一个从零开始[^1]构建的教学型操作系统(Hobby OS)项目,使用 C++ 实现,目标是深入理解操作系统的核心原理并将其逐一付诸实践。

### 已实现特性

**内核基础设施**
- 高半区内核(Higher-Half Kernel)
- 物理内存管理器(PMM)、虚拟内存管理器(VMM)、内核堆分配器
- 基于 MLFQ(多级反馈队列)算法的进程调度器
- ELF 可执行文件解析与加载
- 信号(Signals)、管道(Pipes)
- 基础系统调用接口

**驱动程序**
- PS/2 键盘驱动
- PIT 定时器驱动
- RTL8139 网卡驱动
- ATA 块设备驱动
- 图形帧缓冲区(Framebuffer)

**文件系统**
- VFS(虚拟文件系统)抽象层
- Ext2 文件系统读写支持
- TARFS、DevFS、ProcFS、SockFS

**网络**
- 基础 TCP/IP 协议栈
- Telnet 协议支持

**用户态**
- 用户态进程与基础 Libc
- 控制台设备文件化,VT100 终端状态机
- Kilo 文本编辑器移植
- ...And it runs DOOM!

<p align="center">
  <img src="./screenshots/doom.gif" width="480" />
</p>

### 制作记录

整个开发过程通过录屏和 Markdown 笔记进行了完整记录,相关资源正在持续整理中:

- [博客](http://moe.cm/) — 技术笔记与开发日志[^2]
- [GitHub 仓库](https://github.com/aoverb/lolios/tree/main/notes) — 原始开发笔记[^2]
- [Bilibili 主页](https://space.bilibili.com/1506917) — 开发实录与技术讲解视频[^3]

### 截图

#### 启动界面

<p align="center">
  <img src="./screenshots/boot.jpg" width="720" />
</p>


#### 管道与文件操作演示

<p align="center">
  <img src="./screenshots/echo-pipe-ll-kilo-cat.gif" width="720" />
</p>

#### Telnet、进程列表、通过信号杀死进程

<p align="center">
  <img src="./screenshots/telnet-ps-signal-kill.gif" width="720" />
</p>

#### ProcFS与PS演示

<p align="center">
  <img src="./screenshots/ps-procfs.gif" width="720" />
</p>

#### netstat演示

<p align="center">
  <img src="./screenshots/netstat.gif" width="720" />
</p>

### 构建与运行

#### 前置依赖

- `i686-elf` 交叉编译工具链(`i686-elf-gcc`、`i686-elf-g++`、`i686-elf-as`)
- GNU Make
- GRUB 工具(`grub-mkrescue`)及其依赖 `xorriso`
- QEMU(`qemu-system-i386`)

在 Ubuntu/Debian 上安装除交叉编译器以外的依赖:

```bash
sudo apt install qemu-system-x86 grub-pc-bin xorriso make
```

交叉编译器需要手动构建,具体步骤请参考 [OSDev Wiki: GCC Cross-Compiler](https://wiki.osdev.org/GCC_Cross-Compiler)。

#### 构建

```bash
git clone https://github.com/aoverb/moeos.git
cd moeos
./build.sh
```

`build.sh` 将依次执行以下步骤:

1. 编译 Libc(安装头文件与静态库至 `SYSROOT/`)
2. 编译用户态程序(安装至 `SYSROOT/usr/bin/`)
3. 编译内核(生成 `kernel/moeos.kernel`)
4. 将 `SYSROOT` 打包为 ustar 格式的 `sysroot.tar`,作为 GRUB 模块加载
5. 通过 `grub-mkrescue` 生成可引导的 ISO 镜像

#### 运行

构建完成后,`build.sh` 会自动通过 QEMU 启动系统。如需手动运行:

```bash
qemu-system-i386 -cdrom moeos.iso -drive file=disk.img,format=raw \
    -netdev tap,id=net0,ifname=tap0,script=no,downscript=no \
    -device rtl8139,netdev=net0,mac=CA:FE:BA:BE:13:37
```

#### 网络配置(可选)

MoeOS 使用 TAP 网络接口与宿主机通信。如需启用网络功能,需要预先创建 TAP 设备:

```bash
sudo ip tuntap add dev tap0 mode tap user $(whoami)
sudo ip addr add 10.0.1.0/24 dev tap0
sudo ip link set tap0 up
```

#### 磁盘镜像(可选)

Ext2 文件系统需要一个磁盘镜像。可使用以下命令创建:

```bash
dd if=/dev/zero of=disk.img bs=1M count=32
mkfs.ext2 disk.img
```

如不需要持久化存储功能,可在 QEMU 启动参数中移除 `-drive` 选项。

### ⚠️ 注意事项

MoeOS 是一个面向学习的实验性项目,所有硬件交互均基于 QEMU 模拟环境开发与测试,**未在任何真实硬件上验证过**。请勿在物理机上运行本系统,否则可能造成硬件损坏或数据丢失。

### Acknowledgments

This project makes use of the following third-party software:

- **[GNU GRUB](https://www.gnu.org/software/grub/)** — GRand Unified Bootloader, used as an external tool.
  Licensed under the [GNU General Public License v3.0 or later](https://www.gnu.org/licenses/gpl-3.0.html).
  Copyright © Free Software Foundation, Inc.

- **[doomgeneric](https://github.com/ozkl/doomgeneric)** — An easily portable version of DOOM, based on the original id Software source release.
  Licensed under the [GNU General Public License v2.0](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html).
  Original game © id Software. Port by ozkl.

- **[QR-Code-generator](https://github.com/nayuki/QR-Code-generator)** — High-quality QR Code generator library by Project Nayuki.
  Licensed under the [MIT License](https://opensource.org/licenses/MIT).
  Copyright © Project Nayuki.

- **[Kilo](https://github.com/antirez/kilo)** — A small text editor in less than 1000 LOC by Salvatore Sanfilippo (antirez).
  Licensed under the [BSD 2-Clause License](https://opensource.org/licenses/BSD-2-Clause).
  Copyright © 2016 Salvatore Sanfilippo.

---

[^1]: 某种意义上的"从零开始"——Bootloader(GRUB)被视为既有的基础设施,项目的重心在于内核及其上层的全部实现。
[^2]: 正在整理中。
[^3]: 开发过程的录屏剪辑与阶段性技术复盘将陆续发布于此,涵盖从内核引导、驱动开发到网络栈与文件系统实现的各个里程碑。