Xnix - 一个32位微内核

    10

最近对现代操作系统比较感兴趣,之前的RTOS由于前期设计欠佳, 后续建设也不再适用于实时操作系统,所以就一时兴起想做一个32位操作系统内核,后续可能扩展到64位,依旧是平台无关的设计,目前是用x86做示例,后续考虑移植多平台。

项目地址

https://gitee.com/sh-xiaoxiu/xnix

Xnix

一个用于学习操作系统原理的 x86 微内核操作系统。

1769840755655.png

简介

Xnix 是一个从零构建的 32 位 x86 操作系统内核,采用微内核架构设计。项目源于作者在完成 MyRTOS-Demo(GitHub / Gitee)(ARM32 RTOS)后,希望进一步探索更复杂的系统设计。

技术栈:C11 + x86 Assembly + CMake + GCC + QEMU

核心能力

能力 说明 示例
微内核设计 最小化内核,策略与机制分离 内核仅含调度、IPC、内存管理
平台抽象 HAL + 弱符号机制,支持多平台移植 新增架构只需实现少量强符号
能力系统 (Capability) 细粒度权限控制,无全局特权 I/O 端口访问需持有对应 cap
IPC 通信 同步/异步消息传递,支持 RPC 模式 endpoint send/recv/call
用户态驱动 (UDM) 驱动隔离,崩溃可恢复,支持热更新 seriald、kbd 均为用户进程
进程管理 完整生命周期、信号机制、进程树 fork-like spawn、SIGTERM

项目亮点

  • 平台无关设计:内核核心逻辑与硬件分离,通过 HAL 抽象层适配不同平台
  • 弱符号机制:使用 __attribute__((weak)) 实现优雅的平台适配
  • Opaque 类型:公共 API 隐藏内部实现,保证接口稳定性
  • 驱动隔离:UDM 模式下驱动崩溃可自动恢复,不拖垮系统

快速开始

1. 环境准备

Windows 用户

需要先安装 WSL2,参考 微软官方文档,然后在 WSL 中按 Linux 方式安装工具链。

Linux 用户 (Ubuntu/Debian)

sudo apt install gcc gcc-multilib grub-pc-bin xorriso qemu-system-x86 make cmake

2. 构建并运行

git clone https://github.com/user/xnix.git
cd xnix
./run -f    # 清理 + 编译 + 运行

3. 体验 Shell

系统启动后会进入交互式 shell,可以尝试:

> help           # 查看可用命令
> ps             # 查看进程列表
> demo hello     # 运行 demo 程序
> kill <pid>     # 终止进程

运行环境

项目 要求
操作系统 Linux(推荐 Ubuntu 20.04+)或 WSL2
编译器 GCC 支持 32 位编译(gcc-multilib)
模拟器 QEMU x86
构建工具 CMake 3.10+, Make

配置选项

通过 CMake 变量控制编译选项:

./run -DENABLE_SMP=ON -DCFG_MAX_CPUS=4    # 启用多核支持
./run -DCFG_DEBUG_SCHED=ON                 # 调度器调试输出
./run -DENABLE_VMM_DEBUG=ON                # 内存管理调试

QEMU 硬件配置:

./run -f --mem 256M --smp 2    # 指定内存和 CPU 核心数

使用方式

常用命令

./run -f                 # 完整构建并运行
./run                    # 增量编译运行
./run -d                 # 调试模式(GDB :1234)
./run -c                 # 只编译不运行
./run --clean            # 清理构建产物
./run --rebuild          # 完全重建

调试

# 终端 1: 启动调试模式
./run -d

# 终端 2: 连接 GDB
gdb build/xnix.elf -ex "target remote :1234"

项目结构

xnix/
├── main/                   # 内核代码
│   ├── arch/x86/           # x86 架构实现
│   │   ├── boot/           # 启动代码、链接脚本
│   │   ├── cpu/            # GDT、IDT、上下文切换
│   │   └── hal/            # 硬件特性探测
│   ├── kernel/             # 内核子系统(平台无关)
│   │   ├── sched/          # 调度器
│   │   ├── ipc/            # IPC 机制
│   │   ├── mm/             # 内存管理
│   │   ├── process/        # 进程管理
│   │   └── cap/            # Capability 系统
│   ├── lib/                # 内核库(同步原语等)
│   ├── drivers/            # 内核态控制台(早期输出)
│   └── include/            # 公共头文件
│
├── user/                   # 用户态代码
│   ├── init/               # init 进程
│   ├── apps/shell/         # 交互式 shell
│   ├── drivers/            # UDM 驱动(seriald, kbd)
│   ├── demos/              # 示例程序
│   └── libs/               # 用户态库
│
├── run                     # 构建运行脚本
└── CMakeLists.txt

扩展开发

添加新驱动

  1. user/drivers/ 下创建目录
  2. 实现驱动主循环(接收 IPC 请求、处理、回复)
  3. user/init/main.c 中添加启动代码
  4. 更新 CMakeLists.txt
// 驱动基本结构
int main(void) {
    // 初始化
    while (1) {
        ipc_msg_t msg;
        ipc_receive(ep, &msg);  // 等待请求
        // 处理请求
        ipc_reply(ep, &reply);  // 回复
    }
}

添加系统调用

  1. main/include/xnix/syscall_nr.h 添加调用号
  2. main/kernel/sys/syscall.c 添加处理函数
  3. user/libs/ 添加用户态封装

添加 Shell 命令

修改 user/apps/shell/main.c,在命令表中添加新命令。

部署

Xnix 是一个教学项目,主要在 QEMU 中运行。如需在真实硬件上测试:

./run -f -i              # 生成 ISO
# 将 build/xnix.iso 写入 U 盘或用于虚拟机启动

注意:真实硬件运行未经充分测试,QEMU可能与真实硬件行为不一致。

常见问题

Q: 编译报错找不到 32 位库?

安装 multilib 支持:

sudo apt install gcc-multilib

Q: QEMU 启动后黑屏?

检查 GRUB 配置,确保 grub-pc-binxorriso 已安装。

Q: 如何查看串口输出?

./run --qemu "-serial file:serial.log"
cat serial.log

参考资料

License

MIT License

作者

XiaoXiu

消息盒子

# 暂无消息 #

只显示最新10条未读和已读信息