The EONIX kernel

greatbridf 00252343e9 partial work of hal interface 10 mesiacov pred
.cargo 1f7bed61dd feat: rust support 1 rok pred
.vscode 35f9f1c0d7 chore(ide): add vscode debug script 10 mesiacov pred
arch 00252343e9 partial work of hal interface 10 mesiacov pred
crates 00252343e9 partial work of hal interface 10 mesiacov pred
doc ebd3d1224c change(x86): optimize bootstrap code, remove kinit.cpp 10 mesiacov pred
gblibc 6ecf5b4237 fix build bug in gblibc 1 rok pred
gblibstdc++ f952057453 change(vector): emplace_back should return a ref 1 rok pred
include 4691d469c5 refactor(pcie): rewrite pcie bus driver in rust 10 mesiacov pred
macros 00252343e9 partial work of hal interface 10 mesiacov pred
script bcb515cacd chore(build-img): fix Linux mount problem 1 rok pred
src 00252343e9 partial work of hal interface 10 mesiacov pred
user-space-program b43277c46c refactor: rewrite fs submodule with rust 1 rok pred
.clang-format ae698248ee [partial] feat: add sync stuffs 1 rok pred
.gitignore 35f9f1c0d7 chore(ide): add vscode debug script 10 mesiacov pred
.rustfmt.toml 66958893e5 rewrite: move Process, ProcessGroup, Session out of thread.rs 1 rok pred
CMakeLists.txt 4691d469c5 refactor(pcie): rewrite pcie bus driver in rust 10 mesiacov pred
Cargo.lock 00252343e9 partial work of hal interface 10 mesiacov pred
Cargo.toml 00252343e9 partial work of hal interface 10 mesiacov pred
Makefile.src a24eaa45e1 task: rewrite the task system to decouple better. 1 rok pred
README.md 17e60b5661 doc: update origin 1 rok pred
build.rs 4691d469c5 refactor(pcie): rewrite pcie bus driver in rust 10 mesiacov pred
busybox 915f90251e feat(image): add busybox to mount image 2 rokov pred
busybox-minimal 915f90251e feat(image): add busybox to mount image 2 rokov pred
configure 9e65c1c74a configure: remove the check for mtools 11 mesiacov pred
global_find.sh 13f7fff46d Merge branch 'multiarch' 1 rok pred
init_script.sh f10251a691 feat: add sys_chmod, remove debug prints 1 rok pred
make_symbol_table.sh d6716c631d chore: use qemu for debugging 4 rokov pred
pretty-print.py a24eaa45e1 task: rewrite the task system to decouple better. 1 rok pred
rust-headers.hpp bad164e483 remove some stale C++ code. extract more platform-dependent parts 1 rok pred
rust-toolchain 5b315d7831 lazy_lock: replace old lazy_static 11 mesiacov pred
x86_64-unknown-none.json d0c3761bb3 fix: compilation error on x86 soft float targets 1 rok pred

README.md

Eonix

Eonix 是一个基于 Rust 编写的开源项目,旨在提供一个适用于多处理器多架构的宏内核操作系统。

Eonix 项目的目标是创建一个高效、安全、可靠的操作系统。我们的目标是提供一个简单的内核设计,使得它易于理解和维护。同时,我们也希望 Eonix 能够提供足够复杂的特性,如虚拟内存管理、多进程支持、POSIX 兼容的文件系统模型、易于使用的设备驱动开发接口等,使其拥有较强的实用性。

项目特性

  • 多处理器支持
  • 多架构支持(平台相关接口抽象,目前只有 x86_64 一种实现,正在加入其他架构的实现)
  • 内存管理
  • 进程管理
  • 文件系统
  • POSIX 兼容性,兼容 Linux 系统调用接口
  • 静态 ELF 加载器
  • TTY 及任务控制接口(正在进一步实现)
  • FAT32 文件系统的读取实现
  • 全部 Rust 化(只剩一点点)
  • 网卡驱动(WIP)
  • POSIX 线程接口(WIP)
  • 动态加载器(WIP)
  • 用户、权限(WIP)

项目经测试可使用 busybox 中大多数功能,并且该内核使用 busybox 搭配 init 脚本启动,运行 busybox 提供的 ash 来执行 shell 命令。

测试 test pipes

初赛文档

本项目开发时代码仓库在 GitHub

代码树结构

.
├── arch                          # 平台相关代码
│   ├── percpu-macros             # percpu变量宏
│   └── src
│       └── x86_64                # x86_64
│           ├── context.rs        # 上下文切换相关
│           ├── gdt.rs            # x86 架构 GDT相关
│           ├── init.rs           # 内核初始化相关
│           ├── interrupt.rs      # 中断相关
│           ├── io.rs             # IO 相关
│           ├── percpu.rs         # percpu 变量相关
│           └── user.rs           # 用户态相关
├── busybox                       # 默认选项编译的busybox
├── busybox-minimal               # 预编译的精简版busybox
├── configure                     # 编译准备用
├── doc                           # 开发文档
├── gblibc                        # C 标准库实现
├── gblibstdc++                   # C++ 标准库
├── include                       # C++ 头文件
├── init_script.sh                # init 进程使用的脚本文件
├── src
│   ├── boot.s                    # 启动代码
│   ├── driver
│   │   ├── ahci                  # AHCI 控制器驱动
│   │   ├── e1000e                # e1000e 网卡驱动(WIP)
│   │   └── serial.rs             # 串口驱动
│   ├── driver.rs                 # 驱动相关
│   ├── elf.rs                    # ELF 加载器
│   ├── fs
│   │   ├── fat32.rs              # FAT32 实现
│   │   ├── procfs.rs             # procfs 实现
│   │   └── tmpfs.rs              # ramfs 实现
│   ├── hash.rs                   # Hash 函数等
│   ├── intrusive_list.rs         # 侵入式链表
│   ├── io.rs                     # IO 工具类
│   ├── kernel
│   │   ├── allocator.cc          # C++ 分配器
│   │   ├── async
│   │   │   └── lock.cc           # C++ 中自旋锁
│   │   ├── block.rs              # 块设备抽象
│   │   ├── chardev.rs            # 字符设备抽象
│   │   ├── console.rs            # 内核 console 抽象
│   │   ├── constants.rs          # 常量定义
│   │   ├── cpu.rs                # CPU 状态相关
│   │   ├── hw
│   │   │   ├── acpi.cc           # ACPI 数据相关(待移除)
│   │   │   └── pci.cc            # PCI 设备相关(待移除)
│   │   ├── interrupt.rs          # 中断相关(共通)
│   │   ├── mem
│   │   │   ├── address.rs        # 虚拟地址等抽象
│   │   │   ├── mm_area.rs        # 映射区域
│   │   │   ├── mm_list
│   │   │   │   └── page_fault.rs # 处理Page Fault
│   │   │   ├── mm_list.rs        # 地址空间
│   │   │   ├── page_alloc.rs     # 页分配器
│   │   │   ├── page_table.rs     # 页表
│   │   │   ├── paging.rs         # 分页相关
│   │   │   ├── phys.rs           # 物理地址访问相关
│   │   │   └── slab.cc           # Slab 分配器
│   │   ├── smp.rs                # 多处理器相关
│   │   ├── syscall
│   │   │   ├── file_rw.rs        # 文件相关syscall
│   │   │   ├── mm.rs             # 内存相关syscall
│   │   │   ├── net.rs            # 网络相关syscall
│   │   │   ├── procops.rs        # 进程管理相关syscall
│   │   │   └── sysinfo.rs        # sys_utsname
│   │   ├── syscall.rs            # syscall相关定义
│   │   ├── task
│   │   │   ├── kstack.rs         # 内核栈操作
│   │   │   ├── process.rs        # 进程
│   │   │   ├── process_group.rs  # 进程组
│   │   │   ├── process_list.rs   # 进程列表
│   │   │   ├── scheduler.rs      # 调度器
│   │   │   ├── session.rs        # 会话
│   │   │   ├── signal.rs         # 信号处理
│   │   │   └── thread.rs         # 线程
│   │   ├── task.rs               # 任务模块
│   │   ├── terminal.rs           # 终端抽象
│   │   ├── timer.rs              # 时钟模块
│   │   ├── user
│   │   │   └── dataflow.rs       # 用户空间数据访问
│   │   ├── user.rs
│   │   └── vfs
│   │       ├── dentry
│   │       │   └── dcache.rs     # Dentry 缓存
│   │       ├── dentry.rs         # Dentry
│   │       ├── file.rs           # 打开的文件
│   │       ├── filearray.rs      # 用户的文件数组
│   │       ├── inode.rs          # Inode
│   │       ├── mount.rs          # 文件系统挂载
│   │       └── vfs.rs            # 虚拟文件系统
│   ├── kernel.ld                 # 链接脚本
│   ├── kernel.rs
│   ├── kinit.cpp            # 初始化
│   ├── lib.rs
│   ├── mbr.S                # MBR 代码
│   ├── net
│   │   └── netdev.rs        # 网络设备抽象
│   ├── path.rs              # 路径处理
│   ├── rcu.rs               # RCU 的一个临时实现
│   ├── sync
│   │   ├── condvar.rs       # 条件变量
│   │   ├── lock.rs          # 抽象锁类
│   │   ├── locked.rs        # 依赖锁变量
│   │   ├── semaphore.rs     # 信号量
│   │   ├── spin.rs          # 自旋锁
│   │   └── strategy.rs      # 锁策略
│   ├── sync.rs              # 同步模块
│   └── types
│       └── libstdcpp.cpp    # C++ 标准库用
├── user-space-program       # 测试用用户程序
└── x86_64-unknown-none.json # Rust 用 x86_64 工具链文件

编译 & 运行

构建依赖

编译

生成硬盘镜像

调试 & 运行

编译及运行命令

# 配置构建环境
./configure && make prepare && make build

# 直接运行

make nativerun

# 如果需要调试

# 1: 启动调试
make srun

# 2: 启动调试器
make debug

# 或者如果有 tmux

make tmux-debug

可能需要在运行 ./configure 时在环境变量中指定正确版本的构建工具。

  • QEMU: 用于调试运行的 QEMU。默认使用 qemu-system-x86_64
  • GDB: 用于 make debug 的 GDB。我们将默认查找 gdb 或者是 x86_64-elf-gdb 并检查支持的架构。
  • FDISK_BIN: 用于创建磁盘镜像分区表的 fdisk 可执行文件。默认使用 fdisk

如果正在进行交叉编译,请在运行 ./configure 时将 CROSS_COMPILE 设置为你的交叉编译器的相应目标三元组。

运行自己编译的程序

项目目录下的 user 目录主要是出于一些*历史*原因存在,几乎没有任何用处。所以不要尝试查看里面的内容。

要将你的程序(可以使用任何编译器为i386架构编译,静态链接)复制到构建的磁盘镜像中,你可以编辑 CMakeLists.txt 并在 boot.img 部分添加一行。你也可以尝试编辑 init_script.sh 以自定义启动过程。