Browse Source

chore: update README.md, add docs

greatbridf 3 months ago
parent
commit
e2c3fbd379
7 changed files with 202 additions and 52 deletions
  1. 176 34
      README.md
  2. 0 0
      arch/src/x86_64/interrupt.s
  3. 0 13
      bochs.conf
  4. 23 0
      doc/boot.md
  5. BIN
      doc/image.png
  6. 3 0
      doc/task.md
  7. 0 5
      gdb-usage.txt

+ 176 - 34
README.md

@@ -1,69 +1,211 @@
 # Eonix
 
-A simple OS kernel written in C++ and Rust that aims to be Linux compatible out of the box.
+*Eonix* 是一个基于 *Rust* 编写的开源项目,旨在提供一个适用于多处理器多架构的宏内核操作系统。
 
-- [x] Multitasking
-- [x] Memory management
-- [x] Filesystem implementation
-- [x] ELF program loader
-- [x] Some rather naive AHCI driver and FAT32 impl.
-- [x] TTY and job control interface (partially working)
-- [ ] Move to Rust (WIP)
-- [ ] SMP support (WIP)
-- [ ] POSIX thread support (WIP)
-- [ ] Network stack (WIP)
-- [ ] Dynamic loader support
-- [ ] Users, permission...
+*Eonix* 项目的目标是创建一个高效、安全、可靠的操作系统。我们的目标是提供一个简单的内核设计,使得它易于理解和维护。同时,我们也希望 *Eonix* 能够提供足够复杂的特性,如虚拟内存管理、多进程支持、*POSIX* 兼容的文件系统模型、易于使用的设备驱动开发接口等,使其拥有较强的实用性。
 
-# Build & Run
+## 项目特性
 
-## Prerequisites
+- [x] 多处理器支持
+- [x] 多架构支持(平台相关接口抽象,目前只有 x86_64 一种实现,正在加入其他架构的实现)
+- [x] 内存管理
+- [x] 进程管理
+- [x] 文件系统
+- [x] *POSIX* 兼容性,兼容 *Linux* 系统调用接口
+- [x] 静态 ELF 加载器
+- [x] TTY 及任务控制接口(正在进一步实现)
+- [x] FAT32 文件系统的读取实现
+- [ ] 全部 Rust 化(只剩一点点)
+- [ ] 网卡驱动(WIP)
+- [ ] POSIX 线程接口(WIP)
+- [ ] 动态加载器(WIP)
+- [ ] 用户、权限(WIP)
 
-#### Compile
+项目经测试可使用 *busybox* 中大多数功能,并且该内核使用 *busybox* 搭配 init 脚本启动,运行 *busybox* 提供的 *ash* 来执行 shell 命令。
 
-- [GCC (Tested)](https://gcc.gnu.org/) or
-- [Clang (It should work, but haven't been tested for a while.)](https://clang.llvm.org/)
+![测试](doc/image.png)
 
-- [Rust](https://www.rust-lang.org/)
+## 初赛文档
+
+- [启动加载]()
+- [内存管理]()
+- [进程管理]()
+- [文件系统]()
+- [设备驱动]()
+- [多平台支持]()
+
+## 代码树结构
+
+```
+.
+├── 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 工具链文件
+```
+
+# 编译 & 运行
+
+## 构建依赖
+
+#### 编译
+
+- [GCC (测试过)](https://gcc.gnu.org/) or
+
+- [Rust(nightly-2024-12-18)](https://www.rust-lang.org/)
 - [CMake](https://cmake.org/)
 
-#### Generate disk image
+#### 生成硬盘镜像
 
-- [(Optional) busybox (We have a prebuilt version of busybox in the project directory)](https://www.busybox.net/)
+- [(Optional) busybox (项目目录下有预编译过的busybox)](https://www.busybox.net/)
 - [fdisk](https://www.gnu.org/software/fdisk/)
 - [mtools](http://www.gnu.org/software/mtools/)
 
-#### Debug and Run
+#### 调试 & 运行
 
 - [GDB](https://www.gnu.org/software/gdb/)
 - [QEMU](https://www.qemu.org/)
 
-## Build and Run
+## 编译及运行命令
 
 ```bash
+# 配置构建环境
 ./configure && make prepare && make build
 
+# 直接运行
+
 make nativerun
 
-# or if you need debugging
+# 如果需要调试
 
-# 1:
+# 1: 启动调试
 make srun
 
-# 2:
+# 2: 启动调试器
 make debug
+
+# 或者如果有 tmux
+
+make tmux-debug
 ```
 
-You may want to specify the correct version of build tools to use when running `./configure` in ENV.
+可能需要在运行 `./configure` 时在环境变量中指定正确版本的构建工具。
 
-- `QEMU`: QEMU used to debug run. `qemu-system-x86_64` by default.
-- `GDB`: GDB used by `make debug`. We will search for `gdb` and `x86_64-elf-gdb` and check the supported archs by default.
-- `FDISK_BIN`: fdisk executable used to create disk image part tables. `fdisk` by default.
+- `QEMU`: 用于调试运行的 QEMU。默认使用 `qemu-system-x86_64`。
+- `GDB`: 用于 `make debug` 的 GDB。我们将默认查找 `gdb` 或者是 `x86_64-elf-gdb` 并检查支持的架构。
+- `FDISK_BIN`: 用于创建磁盘镜像分区表的 fdisk 可执行文件。默认使用 `fdisk`。
 
-If you are doing a cross compile, run `./configure` with `CROSS_COMPILE` set to the corresponding target triple of your cross compiler.
+如果正在进行交叉编译,请在运行 `./configure` 时将 `CROSS_COMPILE` 设置为你的交叉编译器的相应目标三元组。
 
-## Run your own program
+## 运行自己编译的程序
 
-The `user` directory under the project dir exists mainly for some *historical* reason and has almost no use. So don't ever try to look inside that.
+项目目录下的 `user` 目录主要是出于一些*历史*原因存在,几乎没有任何用处。所以不要尝试查看里面的内容。
 
-To copy your program into the built disk image, you can edit the `CMakeLists.txt` and add a line to the `boot.img` section. You can also try editing the `init_script.sh` to customize the booting procedure.
+要将你的程序(可以使用任何编译器为i386架构编译,静态链接)复制到构建的磁盘镜像中,你可以编辑 `CMakeLists.txt` 并在 `boot.img` 部分添加一行。你也可以尝试编辑 `init_script.sh` 以自定义启动过程。

+ 0 - 0
arch/src/x86_64/interrupt.s


+ 0 - 13
bochs.conf

@@ -1,13 +0,0 @@
-megs: 64
-
-# floppya: 1_44=build/boot.img, status=inserted
-ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
-ata0-master: type=disk, path="build/boot.img", mode=flat, cylinders=0, heads=0, spt=0, model="Generic MyDisk", biosdetect=auto, translation=auto
-
-boot: disk
-
-mouse: enabled=0
-
-display_library: x, options="gui_debug"
-
-magic_break: enabled=1

+ 23 - 0
doc/boot.md

@@ -0,0 +1,23 @@
+# 启动加载阶段
+
+## MBR 阶段
+
+BIOS 从磁盘的第一个扇区加载 MBR(Master Boot Record)到内存地址 0x7C00 并执行。MBR 代码会设置段寄存器并切换到保护模式。
+
+首先 MBR 代码通过 BIOS 中断 0x15 获取内存信息,并保存到内存中。具体操作包括调用 e820 内存检测功能,获取内存布局信息。这一步骤确保之后系统能够正确识别和利用所有可用的物理内存。然后设置32位的 GDT 并加载到 GDTR 寄存器中。之后会通过 BIOS 中断读取 Stage1 的一小段代码到内存中,然后用`ljmp`指令跳转到 Stage1 执行,同时开启保护模式。通过这些操作,系统从实模式切换到保护模式,为后续的内存管理和多任务处理提供基础。
+
+## Stage1
+
+MBR 代码使用 BIOS 功能从磁盘读取 Stage1 到内存地址 0x1000 并跳转执行。Stage1 代码使用刚才 MBR 中初始化的那个临时栈,并通过 BIOS 中断读取磁盘中的内核镜像(分成了多个 32K 块),并将其复制到内存中的指定位置。
+
+然后,Stage1 代码设置分页结构并启用分页。具体操作包括设置内核的 PML4、PDPT、PD和 PT 表项,并启用 CR0 寄存器中的分页位。分页机制的启用使得系统能够管理虚拟内存,并提供内存保护和隔离功能。再之后,Stage1 会初始化 64位模式使用的 GDT 和设置 IDT(中断描述符表),然后将其加载。通过这些操作,Stage1 确保了内核在进入保护模式后能够正确运行,并为内核的初始化提供了必要的环境。此时,Stage1 代码跳转到内核 64 位模式的入口,正式进入 64 位模式运行。
+
+## 下一步初始化
+
+内核代码初始化内存管理、CPU 状态、多处理器支持及启动调度器等。具体操作包括设置真正的内核页表、保存内存信息、初始化 **buddy** 系统等。
+
+内核初始化过程中,首先进入 C++ 中的 kinit.cpp,设置真正的内核页表,确保内核地址空间的正确映射。接着,通过保存从 Stage1 获取的内存信息,包括内存大小和 e820 内存布局信息。然后,调用 `setup_buddy` 函数初始化伙伴系统,管理物理内存的分配。然后进入 Rust 中的内核初始化阶段。
+
+在 Rust 中的内核初始化阶段,首先调用 `init_thiscpu` 函数初始化当前 CPU 的状态,包括设置 GDT 和 TSS。接着,初始化中断控制器和定时器。然后,初始化多任务处理系统,包括创建调度器和空闲任务。接下来,挂载文件系统,并加载 init 进程。init 进程是一个 init 脚本,使用 busybox 运行,用于配置文件系统环境并且启动真正的用户 init进程。最后,内核进入正常运行状态,准备处理用户请求和执行应用程序。整个过程确保内核从启动到运行的过程顺利进行,并为后续的操作系统功能提供基础。
+
+

BIN
doc/image.png


+ 3 - 0
doc/task.md

@@ -0,0 +1,3 @@
+# 任务管理
+
+

+ 0 - 5
gdb-usage.txt

@@ -1,5 +0,0 @@
-"disas $pc,+32" disassembles 32 bytes from the current PC
-
-the display command prints after execution stops, so "disp /3i $pc" will print the next 3 instructions every time gdb gets control
-
-"stepi" and "nexti" do single-instruction step/next ("step" and "next" are source-line stepping and require debug info)