一个能在 QEMU 上运行的 16 位实模式操作系统,支持 FAT12 文件系统、RTC 时间、用户登录、TTY 终端和蓝屏 panic。专为 macOS 上的 QEMU 测试设计。
| 模块 | 说明 |
|---|---|
| 引导 | FAT12 引导扇区,从软盘加载内核 |
| 文件系统 | FAT12 (1.44MB 软盘),支持 ls / cat |
| 时间 | 读取 RTC 实时时钟,支持 time / date |
| 用户系统 | 基于 USERS.TXT 的用户认证,支持登录/登出/切换 |
| TTY | 全功能终端,支持行编辑、退格、ESC 清行 |
| 蓝屏 (BSOD) | 用户执行 panic 命令或 int 0xFE 指令触发蓝屏死机 |
| Shell | 内置 14 条命令的命令行解释器 |
- macOS (或 Linux)
- NASM — 汇编器
- QEMU — x86 模拟器
- Python 3 — 构建 FAT12 镜像
brew install nasm qemu# 1. 克隆/进入项目目录
cd simpleos
# 2. 构建操作系统镜像
./build.sh
# 3. 在 QEMU 中运行
./run.sh系统启动后会要求登录,默认账户:
| 用户名 | 密码 |
|---|---|
admin |
admin |
user |
1234 |
guest |
guest |
用户数据存储在软盘镜像的 USERS.TXT 文件中,格式为 username:password,每行一个用户。
| 命令 | 说明 |
|---|---|
help |
显示所有可用命令 |
ls |
列出软盘上的文件 |
cat <文件名> |
显示文件内容 |
time |
显示当前时间 (RTC) |
date |
显示当前日期 (RTC) |
whoami |
显示当前登录用户 |
users |
列出所有用户 |
login |
重新登录 (切换用户) |
logout |
登出并返回登录界面 |
panic |
触发内核蓝屏死机 (BSOD) |
clear |
清屏 |
echo <文本> |
回显文本 |
ver |
显示系统版本 |
reboot |
重启系统 |
有两种方式触发蓝屏:
- Shell 命令:输入
panic并回车 - 汇编指令:在用户程序中执行
int 0xFE中断
蓝屏会显示:
- 错误标题和描述
- 触发蓝屏的用户名
- 触发时间
- STOP 错误码
- 系统停机提示
蓝屏后系统完全停机,需要重启 (QEMU 中按 Ctrl+A X 退出后重新运行)。
simpleos/
├── src/
│ ├── boot.asm # FAT12 引导扇区 (512 字节)
│ └── kernel.asm # 16 位内核 (TTY/FS/RTC/用户/Shell/Panic)
├── mkfs.py # FAT12 软盘镜像构建脚本
├── build.sh # 一键构建脚本
├── run.sh # QEMU 启动脚本
└── README.md # 本文档
构建后生成:
boot.bin— 编译后的引导扇区KERNEL.BIN— 编译后的内核simpleos.img— 可启动的 FAT12 软盘镜像*.lst— 汇编列表文件 (调试用)
| 地址 | 用途 |
|---|---|
0x0000-0x03FF |
中断向量表 (IVT) |
0x0500-0x7BFF |
自由内存 |
0x7C00-0x7DFF |
引导扇区 (BIOS 加载) |
0x2000:0x0000 |
内核 (代码+数据+栈) |
0x3000:0x0000 |
FAT 缓存 (9 扇区) |
0x4000:0x0000 |
根目录缓存 (14 扇区) |
0x5000:0x0000 |
文件数据缓存 |
内核安装了以下中断处理程序:
int 0x00— 除零异常 → 蓝屏int 0x06— 无效操作码 → 蓝屏int 0xFE— 用户 panic 指令 → 蓝屏
- 介质:1.44MB 3.5 寸软盘
- 每簇 1 扇区,共 2847 个可用簇
- 根目录 224 个条目
- 支持 8.3 文件名格式
- 镜像中预置文件:
KERNEL.BIN,USERS.TXT,README.TXT,HELLO.TXT
qemu-system-i386 \
-m 16 \
-fda simpleos.img \
-boot a \
-no-reboot-m 16— 16MB 内存 (16 位系统只需极少内存)-fda— 软盘镜像-boot a— 从软盘启动-no-reboot— 崩溃时不自动重启 (便于观察蓝屏)
./run.sh -d启用 GDB 调试,QEMU 等待 GDB 连接到 :1234:
gdb -ex 'target remote :1234'- 在
kernel.asm的数据区添加命令名字符串 - 在
shell_exec中添加strcmp比较和跳转 - 编写对应的
.do_xxx处理子程序
编辑 mkfs.py 中的 files 列表,添加新的 (name, ext, data) 元组,然后重新运行 ./build.sh。
编辑 mkfs.py 中的 users_data,格式为 username:password\n,然后重新构建。
MIT License — 可自由使用、修改和分发。