The EONIX kernel

greatbridf ca2ad4c427 Merge remote-tracking branch 'github/mm' into shiai-master 3 months ago
.cargo 1f7bed61dd feat: rust support 7 months ago
arch e2c3fbd379 chore: update README.md, add docs 3 months ago
doc 113ce48d38 doc: rename kernel name 3 months ago
gblibc 6ecf5b4237 fix build bug in gblibc 4 months ago
gblibstdc++ f952057453 change(vector): emplace_back should return a ref 7 months ago
include 4e7bed8818 feat(pcp): add per-cpu pages support 3 months ago
script c561df82d2 chore: add build-img script for making images 3 months ago
src ca2ad4c427 Merge remote-tracking branch 'github/mm' into shiai-master 3 months ago
user-space-program b43277c46c refactor: rewrite fs submodule with rust 6 months ago
.clang-format ae698248ee [partial] feat: add sync stuffs 5 months ago
.gitignore 1f7bed61dd feat: rust support 7 months ago
.rustfmt.toml 66958893e5 rewrite: move Process, ProcessGroup, Session out of thread.rs 4 months ago
CMakeLists.txt c561df82d2 chore: add build-img script for making images 3 months ago
Cargo.lock 13f7fff46d Merge branch 'multiarch' 4 months ago
Cargo.toml e9ec2880b8 feat: temp. impl for sys_times, update sys_statx 3 months ago
Makefile.src ac2cb64f02 feat: blank impl for getrusage and madvise 3 months ago
README.md 17e60b5661 doc: update origin 3 months ago
build.rs bad164e483 remove some stale C++ code. extract more platform-dependent parts 3 months ago
busybox 915f90251e feat(image): add busybox to mount image 1 year ago
busybox-minimal 915f90251e feat(image): add busybox to mount image 1 year ago
configure 6f90bfbd38 Merge branch 'fix' into shiai-master 3 months ago
global_find.sh 13f7fff46d Merge branch 'multiarch' 4 months ago
init_script.sh f10251a691 feat: add sys_chmod, remove debug prints 3 months ago
make_symbol_table.sh d6716c631d chore: use qemu for debugging 3 years ago
pretty-print.py 58eb82d5b3 feat(driver): add e1000e driver 7 months ago
rust-headers.hpp bad164e483 remove some stale C++ code. extract more platform-dependent parts 3 months ago
rust-toolchain 1f7bed61dd feat: rust support 7 months ago
x86_64-unknown-none.json 1f7bed61dd feat: rust support 7 months ago

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 以自定义启动过程。