|
3 months ago | |
---|---|---|
.cargo | 7 months ago | |
arch | 3 months ago | |
doc | 3 months ago | |
gblibc | 4 months ago | |
gblibstdc++ | 7 months ago | |
include | 3 months ago | |
script | 3 months ago | |
src | 3 months ago | |
user-space-program | 6 months ago | |
.clang-format | 5 months ago | |
.gitignore | 7 months ago | |
.rustfmt.toml | 4 months ago | |
CMakeLists.txt | 3 months ago | |
Cargo.lock | 4 months ago | |
Cargo.toml | 3 months ago | |
Makefile.src | 3 months ago | |
README.md | 3 months ago | |
build.rs | 3 months ago | |
busybox | 1 year ago | |
busybox-minimal | 1 year ago | |
configure | 3 months ago | |
global_find.sh | 4 months ago | |
init_script.sh | 3 months ago | |
make_symbol_table.sh | 3 years ago | |
pretty-print.py | 7 months ago | |
rust-headers.hpp | 3 months ago | |
rust-toolchain | 7 months ago | |
x86_64-unknown-none.json | 7 months ago |
Eonix 是一个基于 Rust 编写的开源项目,旨在提供一个适用于多处理器多架构的宏内核操作系统。
Eonix 项目的目标是创建一个高效、安全、可靠的操作系统。我们的目标是提供一个简单的内核设计,使得它易于理解和维护。同时,我们也希望 Eonix 能够提供足够复杂的特性,如虚拟内存管理、多进程支持、POSIX 兼容的文件系统模型、易于使用的设备驱动开发接口等,使其拥有较强的实用性。
项目经测试可使用 busybox 中大多数功能,并且该内核使用 busybox 搭配 init 脚本启动,运行 busybox 提供的 ash 来执行 shell 命令。
本项目开发时代码仓库在 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
以自定义启动过程。